From ff006451ad792ed26793691402bf7b5f813205f7 Mon Sep 17 00:00:00 2001 From: Nicolas Gallagher Date: Thu, 5 Sep 2019 11:36:31 -0700 Subject: [PATCH] [react-events] Fix isTargetWithinNode type (#16671) isTargetWithinNode passes the childTarget to getClosestInstanceFromNode which does not account for a null value of 'node'. --- .../src/events/DOMEventResponderSystem.js | 2 +- packages/react-events/src/dom/Tap.js | 22 ++++++++----------- packages/shared/ReactDOMTypes.js | 2 +- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/packages/react-dom/src/events/DOMEventResponderSystem.js b/packages/react-dom/src/events/DOMEventResponderSystem.js index 5941ffdfdff3..d7037122960d 100644 --- a/packages/react-dom/src/events/DOMEventResponderSystem.js +++ b/packages/react-dom/src/events/DOMEventResponderSystem.js @@ -158,7 +158,7 @@ const eventResponderContext: ReactDOMResponderContext = { return false; }, isTargetWithinNode( - childTarget: null | Element | Document, + childTarget: Element | Document, parentTarget: Element | Document, ): boolean { validateResponderContext(); diff --git a/packages/react-events/src/dom/Tap.js b/packages/react-events/src/dom/Tap.js index 250cec367aca..fe5ce0d91e65 100644 --- a/packages/react-events/src/dom/Tap.js +++ b/packages/react-events/src/dom/Tap.js @@ -321,22 +321,17 @@ function getHitTarget( context: ReactDOMResponderContext, state: TapState, ): null | Element | Document { - if (hasPointerEvents) { - return event.target; - } else { - if (event.pointerType === 'touch') { - const doc = context.getActiveDocument(); - const nativeEvent: any = event.nativeEvent; - const touch = getTouchById(nativeEvent, state.activePointerId); - if (touch != null) { - return doc.elementFromPoint(touch.clientX, touch.clientY); - } else { - return null; - } + if (!hasPointerEvents && event.pointerType === 'touch') { + const doc = context.getActiveDocument(); + const nativeEvent: any = event.nativeEvent; + const touch = getTouchById(nativeEvent, state.activePointerId); + if (touch != null) { + return doc.elementFromPoint(touch.clientX, touch.clientY); } else { - return event.target; + return null; } } + return event.target; } function isActivePointer( @@ -617,6 +612,7 @@ const responderImpl = { case 'scroll': { if ( state.isActive && + state.responderTarget != null && // We ignore incoming scroll events when using mouse events state.pointerType !== 'mouse' && // If the scroll target is the document or if the pointer target diff --git a/packages/shared/ReactDOMTypes.js b/packages/shared/ReactDOMTypes.js index 5ad24bdd02be..53bbb3384b14 100644 --- a/packages/shared/ReactDOMTypes.js +++ b/packages/shared/ReactDOMTypes.js @@ -55,7 +55,7 @@ export type ReactDOMResponderContext = { eventPriority: EventPriority, ) => void, isTargetWithinNode: ( - childTarget: null | Element | Document, + childTarget: Element | Document, parentTarget: Element | Document, ) => boolean, isTargetWithinResponder: (null | Element | Document) => boolean,