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 = ( + + +