[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