@samitouri / QOS-React-2 / commits / 98ce535fdb

[RN] Expose event as a global variable during dispatch (#35913)

## Summary This PR updates the event dispatching logic in React Native to expose the dispatched event in the global scope as done on Web (https://dom.spec.whatwg.org/#concept-event-listener-inner-invoke) and in the new implementation of `EventTarget` in React Native (https://github.com/facebook/react-native/blob/d1b2ddc9cb4f7b4cb795fed197347173ed5c4bfb/packages/react-native/src/private/webapis/dom/events/EventTarget.js#L372). ## How did you test this change? Added unit tests

Rubén Norte committed Feb 26, 2026 at 15:51 UTC 98ce535fdb6ff559a5dd76b58c1bcaa983804957
2 files changed +15 -1
packages/react-native-renderer/src/__tests__/ReactFabric-test.internal.js
+10 -1
@@ -1099,6 +1099,8 @@ describe('ReactFabric', () => {
1099 // Check for referential equality
1100 expect(ref1.current).toBe(event.target);
1101 expect(ref1.current).toBe(event.currentTarget);
1102 +
1103 + expect(global.event).toBe(event);
1104 }}
1105 onStartShouldSetResponder={() => true}
1106 />
@@ -1110,6 +1112,8 @@ describe('ReactFabric', () => {
1112 // Check for referential equality
1113 expect(ref2.current).toBe(event.target);
1114 expect(ref2.current).toBe(event.currentTarget);
1115 +
1116 + expect(global.event).toBe(event);
1117 }}
1118 onStartShouldSetResponder={() => true}
1119 />
@@ -1123,6 +1127,9 @@ describe('ReactFabric', () => {
1127 const [dispatchEvent] =
1128 nativeFabricUIManager.registerEventHandler.mock.calls[0];
1129
1130 + const preexistingEvent = {};
1131 + global.event = preexistingEvent;
1132 +
1133 dispatchEvent(getViewById('one').instanceHandle, 'topTouchStart', {
1134 target: getViewById('one').reactTag,
1135 identifier: 17,
@@ -1150,7 +1157,9 @@ describe('ReactFabric', () => {
1157 changedTouches: [],
1158 });
1159
1153 - expect.assertions(6);
1160 + expect(global.event).toBe(preexistingEvent);
1161 +
1162 + expect.assertions(9);
1163 });
1164
1165 it('propagates timeStamps from native events and sets defaults', async () => {
packages/react-native-renderer/src/legacy-events/EventPluginUtils.js
+5
@@ -67,6 +67,9 @@ function validateEventDispatches(event) {
67 */
68 export function executeDispatch(event, listener, inst) {
69 event.currentTarget = getNodeFromInstance(inst);
70 + const currentEvent = global.event;
71 + global.event = event;
72 +
73 try {
74 listener(event);
75 } catch (error) {
@@ -77,6 +80,8 @@ export function executeDispatch(event, listener, inst) {
80 // TODO: Make sure this error gets logged somehow.
81 }
82 }
83 +
84 + global.event = currentEvent;
85 event.currentTarget = null;
86 }
87