Skip to content

Commit 287ef30

Browse files
authored
[Flare] Deeply prevent default on anchor elements (#15750)
1 parent a97b5c0 commit 287ef30

4 files changed

Lines changed: 23 additions & 2 deletions

File tree

packages/react-dom/src/events/DOMEventResponderSystem.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -424,11 +424,12 @@ const eventResponderContext: ReactResponderContext = {
424424
isTargetWithinHostComponent(
425425
target: Element | Document,
426426
elementType: string,
427+
deep: boolean,
427428
): boolean {
428429
validateResponderContext();
429430
let fiber = getClosestInstanceFromNode(target);
430431
while (fiber !== null) {
431-
if (fiber.stateNode === currentInstance) {
432+
if (!deep && fiber.stateNode === currentInstance) {
432433
return false;
433434
}
434435
if (fiber.tag === HostComponent && fiber.type === elementType) {

packages/react-events/src/Press.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ const PressResponder = {
724724
}
725725

726726
case 'click': {
727-
if (context.isTargetWithinHostComponent(target, 'a')) {
727+
if (context.isTargetWithinHostComponent(target, 'a', true)) {
728728
const {
729729
altKey,
730730
ctrlKey,

packages/react-events/src/__tests__/Press-test.internal.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2137,6 +2137,25 @@ describe('Event responder: Press', () => {
21372137
expect(preventDefault).toBeCalled();
21382138
});
21392139

2140+
it('deeply prevents native behaviour by default', () => {
2141+
const onPress = jest.fn();
2142+
const preventDefault = jest.fn();
2143+
const buttonRef = React.createRef();
2144+
const element = (
2145+
<a href="#">
2146+
<Press onPress={onPress}>
2147+
<button ref={buttonRef} />
2148+
</Press>
2149+
</a>
2150+
);
2151+
ReactDOM.render(element, container);
2152+
2153+
buttonRef.current.dispatchEvent(createEvent('pointerdown'));
2154+
buttonRef.current.dispatchEvent(createEvent('pointerup'));
2155+
buttonRef.current.dispatchEvent(createEvent('click', {preventDefault}));
2156+
expect(preventDefault).toBeCalled();
2157+
});
2158+
21402159
it('prevents native behaviour by default with nested elements', () => {
21412160
const onPress = jest.fn();
21422161
const preventDefault = jest.fn();

packages/shared/ReactTypes.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,5 +194,6 @@ export type ReactResponderContext = {
194194
isTargetWithinHostComponent: (
195195
target: Element | Document,
196196
elementType: string,
197+
deep: boolean,
197198
) => boolean,
198199
};

0 commit comments

Comments
 (0)