Skip to content

Commit 9ebe176

Browse files
authored
Experimental Event API: Redesign event responder propagation (#15408)
* Event API: Redesign event instance propagation
1 parent a30e7d9 commit 9ebe176

File tree

10 files changed

+698
-356
lines changed

10 files changed

+698
-356
lines changed

packages/react-dom/src/events/DOMEventResponderSystem.js

Lines changed: 179 additions & 113 deletions
Large diffs are not rendered by default.

packages/react-dom/src/events/ReactDOMEventListener.js

Lines changed: 54 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type {DOMTopLevelEventType} from 'events/TopLevelEventTypes';
1313

1414
import {batchedUpdates, interactiveUpdates} from 'events/ReactGenericBatching';
1515
import {runExtractedPluginEventsInBatch} from 'events/EventPluginHub';
16-
import {runResponderEventsInBatch} from '../events/DOMEventResponderSystem';
16+
import {dispatchEventForResponderEventSystem} from '../events/DOMEventResponderSystem';
1717
import {isFiberMounted} from 'react-reconciler/reflection';
1818
import {HostRoot} from 'shared/ReactWorkTags';
1919
import {
@@ -48,7 +48,6 @@ type BookKeepingInstance = {
4848
nativeEvent: AnyNativeEvent | null,
4949
targetInst: Fiber | null,
5050
ancestors: Array<Fiber | null>,
51-
eventSystemFlags: EventSystemFlags,
5251
};
5352

5453
/**
@@ -75,22 +74,19 @@ function getTopLevelCallbackBookKeeping(
7574
topLevelType: DOMTopLevelEventType,
7675
nativeEvent: AnyNativeEvent,
7776
targetInst: Fiber | null,
78-
eventSystemFlags: EventSystemFlags,
7977
): BookKeepingInstance {
8078
if (callbackBookkeepingPool.length) {
8179
const instance = callbackBookkeepingPool.pop();
8280
instance.topLevelType = topLevelType;
8381
instance.nativeEvent = nativeEvent;
8482
instance.targetInst = targetInst;
85-
instance.eventSystemFlags = eventSystemFlags;
8683
return instance;
8784
}
8885
return {
8986
topLevelType,
9087
nativeEvent,
9188
targetInst,
9289
ancestors: [],
93-
eventSystemFlags,
9490
};
9591
}
9692

@@ -101,7 +97,6 @@ function releaseTopLevelCallbackBookKeeping(
10197
instance.nativeEvent = null;
10298
instance.targetInst = null;
10399
instance.ancestors.length = 0;
104-
instance.eventSystemFlags = 0;
105100
if (callbackBookkeepingPool.length < CALLBACK_BOOKKEEPING_POOL_SIZE) {
106101
callbackBookkeepingPool.push(instance);
107102
}
@@ -131,28 +126,16 @@ function handleTopLevel(bookKeeping: BookKeepingInstance) {
131126

132127
for (let i = 0; i < bookKeeping.ancestors.length; i++) {
133128
targetInst = bookKeeping.ancestors[i];
134-
const eventSystemFlags = bookKeeping.eventSystemFlags;
135129
const eventTarget = getEventTarget(bookKeeping.nativeEvent);
136130
const topLevelType = ((bookKeeping.topLevelType: any): DOMTopLevelEventType);
137131
const nativeEvent = ((bookKeeping.nativeEvent: any): AnyNativeEvent);
138132

139-
if (eventSystemFlags === PLUGIN_EVENT_SYSTEM) {
140-
runExtractedPluginEventsInBatch(
141-
topLevelType,
142-
targetInst,
143-
nativeEvent,
144-
eventTarget,
145-
);
146-
} else if (enableEventAPI) {
147-
// Responder event system (experimental event API)
148-
runResponderEventsInBatch(
149-
topLevelType,
150-
targetInst,
151-
nativeEvent,
152-
eventTarget,
153-
eventSystemFlags,
154-
);
155-
}
133+
runExtractedPluginEventsInBatch(
134+
topLevelType,
135+
targetInst,
136+
nativeEvent,
137+
eventTarget,
138+
);
156139
}
157140
}
158141

@@ -242,6 +225,27 @@ function dispatchInteractiveEvent(topLevelType, eventSystemFlags, nativeEvent) {
242225
);
243226
}
244227

228+
function dispatchEventForPluginEventSystem(
229+
topLevelType: DOMTopLevelEventType,
230+
eventSystemFlags: EventSystemFlags,
231+
nativeEvent: AnyNativeEvent,
232+
targetInst: null | Fiber,
233+
): void {
234+
const bookKeeping = getTopLevelCallbackBookKeeping(
235+
topLevelType,
236+
nativeEvent,
237+
targetInst,
238+
);
239+
240+
try {
241+
// Event queue being processed in the same cycle allows
242+
// `preventDefault`.
243+
batchedUpdates(handleTopLevel, bookKeeping);
244+
} finally {
245+
releaseTopLevelCallbackBookKeeping(bookKeeping);
246+
}
247+
}
248+
245249
export function dispatchEvent(
246250
topLevelType: DOMTopLevelEventType,
247251
eventSystemFlags: EventSystemFlags,
@@ -250,9 +254,9 @@ export function dispatchEvent(
250254
if (!_enabled) {
251255
return;
252256
}
253-
254257
const nativeEventTarget = getEventTarget(nativeEvent);
255258
let targetInst = getClosestInstanceFromNode(nativeEventTarget);
259+
256260
if (
257261
targetInst !== null &&
258262
typeof targetInst.tag === 'number' &&
@@ -265,18 +269,30 @@ export function dispatchEvent(
265269
targetInst = null;
266270
}
267271

268-
const bookKeeping = getTopLevelCallbackBookKeeping(
269-
topLevelType,
270-
nativeEvent,
271-
targetInst,
272-
eventSystemFlags,
273-
);
274-
275-
try {
276-
// Event queue being processed in the same cycle allows
277-
// `preventDefault`.
278-
batchedUpdates(handleTopLevel, bookKeeping);
279-
} finally {
280-
releaseTopLevelCallbackBookKeeping(bookKeeping);
272+
if (enableEventAPI) {
273+
if (eventSystemFlags === PLUGIN_EVENT_SYSTEM) {
274+
dispatchEventForPluginEventSystem(
275+
topLevelType,
276+
eventSystemFlags,
277+
nativeEvent,
278+
targetInst,
279+
);
280+
} else {
281+
// Responder event system (experimental event API)
282+
dispatchEventForResponderEventSystem(
283+
topLevelType,
284+
targetInst,
285+
nativeEvent,
286+
nativeEventTarget,
287+
eventSystemFlags,
288+
);
289+
}
290+
} else {
291+
dispatchEventForPluginEventSystem(
292+
topLevelType,
293+
eventSystemFlags,
294+
nativeEvent,
295+
targetInst,
296+
);
281297
}
282298
}

0 commit comments

Comments
 (0)