From 287ef30bbada33f222fdbafa6b080b541828df53 Mon Sep 17 00:00:00 2001 From: Dominic Gannaway Date: Tue, 28 May 2019 12:46:07 +0100 Subject: [PATCH] [Flare] Deeply prevent default on anchor elements (#15750) --- .../src/events/DOMEventResponderSystem.js | 3 ++- packages/react-events/src/Press.js | 2 +- .../src/__tests__/Press-test.internal.js | 19 +++++++++++++++++++ packages/shared/ReactTypes.js | 1 + 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/react-dom/src/events/DOMEventResponderSystem.js b/packages/react-dom/src/events/DOMEventResponderSystem.js index 93a493b559..690421deee 100644 --- a/packages/react-dom/src/events/DOMEventResponderSystem.js +++ b/packages/react-dom/src/events/DOMEventResponderSystem.js @@ -424,11 +424,12 @@ const eventResponderContext: ReactResponderContext = { isTargetWithinHostComponent( target: Element | Document, elementType: string, + deep: boolean, ): boolean { validateResponderContext(); let fiber = getClosestInstanceFromNode(target); while (fiber !== null) { - if (fiber.stateNode === currentInstance) { + if (!deep && fiber.stateNode === currentInstance) { return false; } if (fiber.tag === HostComponent && fiber.type === elementType) { diff --git a/packages/react-events/src/Press.js b/packages/react-events/src/Press.js index 349e4613da..d9c08d783c 100644 --- a/packages/react-events/src/Press.js +++ b/packages/react-events/src/Press.js @@ -724,7 +724,7 @@ const PressResponder = { } case 'click': { - if (context.isTargetWithinHostComponent(target, 'a')) { + if (context.isTargetWithinHostComponent(target, 'a', true)) { const { altKey, ctrlKey, diff --git a/packages/react-events/src/__tests__/Press-test.internal.js b/packages/react-events/src/__tests__/Press-test.internal.js index 471ea3a69d..196b6c27d1 100644 --- a/packages/react-events/src/__tests__/Press-test.internal.js +++ b/packages/react-events/src/__tests__/Press-test.internal.js @@ -2137,6 +2137,25 @@ describe('Event responder: Press', () => { expect(preventDefault).toBeCalled(); }); + it('deeply prevents native behaviour by default', () => { + const onPress = jest.fn(); + const preventDefault = jest.fn(); + const buttonRef = React.createRef(); + const element = ( + + +