From c604b69973c40410384fe2ca70b34325c67cd22d Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Wed, 15 Jul 2020 12:35:46 +0100 Subject: [PATCH] Revert "Revert "Fix createEventHandle bug with comment containers (#19348)" (#19354)" (#19365) This reverts commit 566f613763d180a9bed110513c9fc453f2eca252. --- .../src/client/ReactDOMEventHandle.js | 7 +- ...OMModernPluginEventSystem-test.internal.js | 76 +++++++++++++++++++ 2 files changed, 81 insertions(+), 2 deletions(-) diff --git a/packages/react-dom/src/client/ReactDOMEventHandle.js b/packages/react-dom/src/client/ReactDOMEventHandle.js index 9312c19bb3..24d6b73e95 100644 --- a/packages/react-dom/src/client/ReactDOMEventHandle.js +++ b/packages/react-dom/src/client/ReactDOMEventHandle.js @@ -22,7 +22,7 @@ import { getEventListenerMap, getFiberFromScopeInstance, } from './ReactDOMComponentTree'; -import {ELEMENT_NODE} from '../shared/HTMLNodeType'; +import {ELEMENT_NODE, COMMENT_NODE} from '../shared/HTMLNodeType'; import { listenToNativeEvent, addEventTypeToDispatchConfig, @@ -90,7 +90,7 @@ function registerEventOnNearestTargetContainer( ): void { // If it is, find the nearest root or portal and make it // our event handle target container. - const targetContainer = getNearestRootOrPortalContainer(targetFiber); + let targetContainer = getNearestRootOrPortalContainer(targetFiber); if (targetContainer === null) { invariant( false, @@ -98,6 +98,9 @@ function registerEventOnNearestTargetContainer( 'that did not have a corresponding root. This is likely a bug in React.', ); } + if (targetContainer.nodeType === COMMENT_NODE) { + targetContainer = ((targetContainer.parentNode: any): Element); + } const listenerMap = getEventListenerMap(targetContainer); listenToNativeEvent( topLevelType, diff --git a/packages/react-dom/src/events/__tests__/DOMModernPluginEventSystem-test.internal.js b/packages/react-dom/src/events/__tests__/DOMModernPluginEventSystem-test.internal.js index 2ebdfa03de..db46c30c40 100644 --- a/packages/react-dom/src/events/__tests__/DOMModernPluginEventSystem-test.internal.js +++ b/packages/react-dom/src/events/__tests__/DOMModernPluginEventSystem-test.internal.js @@ -3009,6 +3009,82 @@ describe('DOMModernPluginEventSystem', () => { expect(onClick).toHaveBeenCalledTimes(1); }); + + // @gate experimental + it('handle propagation of click events between disjointed comment roots', () => { + const buttonRef = React.createRef(); + const divRef = React.createRef(); + const log = []; + const setClick = ReactDOM.unstable_createEventHandle('click'); + const setClickCapture = ReactDOM.unstable_createEventHandle( + 'click', + {capture: true}, + ); + const onClick = jest.fn(e => + log.push(['bubble', e.currentTarget]), + ); + const onClickCapture = jest.fn(e => + log.push(['capture', e.currentTarget]), + ); + + function Child() { + React.useEffect(() => { + const click1 = setClick(divRef.current, onClick); + const click2 = setClickCapture( + divRef.current, + onClickCapture, + ); + return () => { + click1(); + click2(); + }; + }); + + return
Click me!
; + } + + function Parent() { + React.useEffect(() => { + const click1 = setClick(buttonRef.current, onClick); + const click2 = setClickCapture( + buttonRef.current, + onClickCapture, + ); + return () => { + click1(); + click2(); + }; + }); + + return