Skip to content

Commit 8c9fc4e

Browse files
authored
Remove usage of PossiblyWeakSet from createEventHandle (#19686)
1 parent 2ada4bd commit 8c9fc4e

File tree

2 files changed

+34
-8
lines changed

2 files changed

+34
-8
lines changed

packages/react-dom/src/client/ReactDOMComponentTree.js

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99

1010
import type {Fiber} from 'react-reconciler/src/ReactInternalTypes';
1111
import type {ReactScopeInstance} from 'shared/ReactTypes';
12-
import type {ReactDOMEventHandleListener} from '../shared/ReactDOMTypes';
12+
import type {
13+
ReactDOMEventHandle,
14+
ReactDOMEventHandleListener,
15+
} from '../shared/ReactDOMTypes';
1316
import type {
1417
Container,
1518
TextInstance,
@@ -39,6 +42,7 @@ const internalPropsKey = '__reactProps$' + randomKey;
3942
const internalContainerInstanceKey = '__reactContainer$' + randomKey;
4043
const internalEventHandlersKey = '__reactEvents$' + randomKey;
4144
const internalEventHandlerListenersKey = '__reactListeners$' + randomKey;
45+
const internalEventHandlesSetKey = '__reactHandles$' + randomKey;
4246

4347
export type ElementListenerMap = Map<
4448
DOMEventName | string,
@@ -232,3 +236,25 @@ export function getEventHandlerListeners(
232236
): null | Set<ReactDOMEventHandleListener> {
233237
return (scope: any)[internalEventHandlerListenersKey] || null;
234238
}
239+
240+
export function addEventHandleToTarget(
241+
target: EventTarget | ReactScopeInstance,
242+
eventHandle: ReactDOMEventHandle,
243+
): void {
244+
let eventHandles = (target: any)[internalEventHandlesSetKey];
245+
if (eventHandles === undefined) {
246+
eventHandles = (target: any)[internalEventHandlesSetKey] = new Set();
247+
}
248+
eventHandles.add(eventHandle);
249+
}
250+
251+
export function doesTargetHaveEventHandle(
252+
target: EventTarget | ReactScopeInstance,
253+
eventHandle: ReactDOMEventHandle,
254+
): boolean {
255+
const eventHandles = (target: any)[internalEventHandlesSetKey];
256+
if (eventHandles === undefined) {
257+
return false;
258+
}
259+
return eventHandles.has(eventHandle);
260+
}

packages/react-dom/src/client/ReactDOMEventHandle.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import {
2020
getEventHandlerListeners,
2121
setEventHandlerListeners,
2222
getFiberFromScopeInstance,
23+
doesTargetHaveEventHandle,
24+
addEventHandleToTarget,
2325
} from './ReactDOMComponentTree';
2426
import {ELEMENT_NODE, COMMENT_NODE} from '../shared/HTMLNodeType';
2527
import {
@@ -42,8 +44,6 @@ type EventHandleOptions = {|
4244
priority?: EventPriority,
4345
|};
4446

45-
const PossiblyWeakSet = typeof WeakSet === 'function' ? WeakSet : Set;
46-
4747
function getNearestRootOrPortalContainer(node: Fiber): null | Element {
4848
while (node !== null) {
4949
const tag = node.tag;
@@ -201,9 +201,7 @@ export function createEventHandle(
201201
listenerPriority = getEventPriorityForListenerSystem(domEventName);
202202
}
203203

204-
const registeredReactDOMEvents = new PossiblyWeakSet();
205-
206-
return (
204+
const eventHandle = (
207205
target: EventTarget | ReactScopeInstance,
208206
callback: (SyntheticEvent<EventTarget>) => void,
209207
) => {
@@ -212,8 +210,8 @@ export function createEventHandle(
212210
'ReactDOM.createEventHandle: setter called with an invalid ' +
213211
'callback. The callback must be a function.',
214212
);
215-
if (!registeredReactDOMEvents.has(target)) {
216-
registeredReactDOMEvents.add(target);
213+
if (!doesTargetHaveEventHandle(target, eventHandle)) {
214+
addEventHandleToTarget(target, eventHandle);
217215
registerReactDOMEvent(
218216
target,
219217
domEventName,
@@ -241,6 +239,8 @@ export function createEventHandle(
241239
);
242240
};
243241
};
242+
243+
return eventHandle;
244244
}
245245
return (null: any);
246246
}

0 commit comments

Comments
 (0)