Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 33 additions & 32 deletions packages/react-events/src/dom/Press.js
Original file line number Diff line number Diff line change
Expand Up @@ -95,48 +95,47 @@ type PressEvent = {|
shiftKey: boolean,
|};

const hasPointerEvents =
typeof window !== 'undefined' && window.PointerEvent !== undefined;

const isMac =
typeof window !== 'undefined' && window.navigator != null
? /^Mac/.test(window.navigator.platform)
: false;

const DEFAULT_PRESS_RETENTION_OFFSET = {
bottom: 20,
top: 20,
left: 20,
right: 20,
};

const targetEventTypes = [
'keydown_active',
// We need to preventDefault on pointerdown for mouse/pen events
// that are in hit target area but not the element area.
'pointerdown_active',
'click_active',
];
const rootEventTypes = [
'click',
'keyup',
'pointerup',
'pointermove',
'scroll',
'pointercancel',
// We listen to this here so stopPropagation can
// block other mouseup events used internally
'mouseup_active',
'touchend',
];

// If PointerEvents is not supported (e.g., Safari), also listen to touch and mouse events.
if (typeof window !== 'undefined' && window.PointerEvent === undefined) {
targetEventTypes.push('touchstart', 'mousedown');
rootEventTypes.push(
'mousemove',
'touchmove',
'touchcancel',
// Used as a 'cancel' signal for mouse interactions
'dragstart',
);
}
const targetEventTypes = hasPointerEvents
? [
'keydown_active',
// We need to preventDefault on pointerdown for mouse/pen events
// that are in hit target area but not the element area.
'pointerdown_active',
'click_active',
]
: ['keydown_active', 'touchstart', 'mousedown', 'click_active'];

const rootEventTypes = hasPointerEvents
? ['pointerup', 'pointermove', 'pointercancel', 'click', 'keyup', 'scroll']
: [
'click',
'keyup',
'scroll',
'mousemove',
'touchmove',
'touchcancel',
// Used as a 'cancel' signal for mouse interactions
'dragstart',
// We listen to this here so stopPropagation can
// block other mouseup events used internally
'mouseup_active',
'touchend',
];

function isFunction(obj): boolean {
return typeof obj === 'function';
Expand Down Expand Up @@ -539,7 +538,7 @@ const pressResponderImpl = {
}

state.shouldPreventClick = false;
if (isPointerEvent || isTouchEvent) {
if (isTouchEvent) {
state.ignoreEmulatedMouseEvents = true;
} else if (isKeyboardEvent) {
// Ignore unrelated key events
Expand Down Expand Up @@ -676,6 +675,7 @@ const pressResponderImpl = {
if (state.isPressWithinResponderRegion) {
if (isPressed) {
const onPressMove = props.onPressMove;

if (isFunction(onPressMove)) {
dispatchEvent(
event,
Expand Down Expand Up @@ -777,6 +777,7 @@ const pressResponderImpl = {
);
}
}

if (state.isPressWithinResponderRegion && button !== 1) {
dispatchEvent(
event,
Expand Down
24 changes: 12 additions & 12 deletions packages/react-events/src/dom/__tests__/Focus-test.internal.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ import {
keydown,
setPointerEvent,
platform,
dispatchPointerPressDown,
dispatchPointerPressRelease,
dispatchPointerDown,
dispatchPointerUp,
} from '../test-utils';

let React;
Expand Down Expand Up @@ -138,8 +138,8 @@ describe.each(table)('Focus responder', hasPointerEvents => {

it('is called with the correct pointerType: mouse', () => {
const target = ref.current;
dispatchPointerPressDown(target, {pointerType: 'mouse'});
dispatchPointerPressRelease(target, {pointerType: 'mouse'});
dispatchPointerDown(target, {pointerType: 'mouse'});
dispatchPointerUp(target, {pointerType: 'mouse'});
expect(onFocus).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledWith(
expect.objectContaining({pointerType: 'mouse'}),
Expand All @@ -148,8 +148,8 @@ describe.each(table)('Focus responder', hasPointerEvents => {

it('is called with the correct pointerType: touch', () => {
const target = ref.current;
dispatchPointerPressDown(target, {pointerType: 'touch'});
dispatchPointerPressRelease(target, {pointerType: 'touch'});
dispatchPointerDown(target, {pointerType: 'touch'});
dispatchPointerUp(target, {pointerType: 'touch'});
expect(onFocus).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledWith(
expect.objectContaining({pointerType: 'touch'}),
Expand All @@ -159,8 +159,8 @@ describe.each(table)('Focus responder', hasPointerEvents => {
if (hasPointerEvents) {
it('is called with the correct pointerType: pen', () => {
const target = ref.current;
dispatchPointerPressDown(target, {pointerType: 'pen'});
dispatchPointerPressRelease(target, {pointerType: 'pen'});
dispatchPointerDown(target, {pointerType: 'pen'});
dispatchPointerUp(target, {pointerType: 'pen'});
expect(onFocus).toHaveBeenCalledTimes(1);
expect(onFocus).toHaveBeenCalledWith(
expect.objectContaining({pointerType: 'pen'}),
Expand Down Expand Up @@ -278,7 +278,7 @@ describe.each(table)('Focus responder', hasPointerEvents => {
expect(onFocusVisibleChange).toHaveBeenCalledTimes(1);
expect(onFocusVisibleChange).toHaveBeenCalledWith(true);
// then use pointer on the target, focus should no longer be visible
dispatchPointerPressDown(target);
dispatchPointerDown(target);
expect(onFocusVisibleChange).toHaveBeenCalledTimes(2);
expect(onFocusVisibleChange).toHaveBeenCalledWith(false);
// onFocusVisibleChange should not be called again
Expand All @@ -288,9 +288,9 @@ describe.each(table)('Focus responder', hasPointerEvents => {

it('is not called after "focus" and "blur" events without keyboard', () => {
const target = ref.current;
dispatchPointerPressDown(target);
dispatchPointerPressRelease(target);
dispatchPointerPressDown(container);
dispatchPointerDown(target);
dispatchPointerUp(target);
dispatchPointerDown(container);
target.dispatchEvent(blur({relatedTarget: container}));
expect(onFocusVisibleChange).toHaveBeenCalledTimes(0);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import {
focus,
keydown,
setPointerEvent,
dispatchPointerPressDown,
dispatchPointerPressRelease,
dispatchPointerDown,
dispatchPointerUp,
} from '../test-utils';

let React;
Expand Down Expand Up @@ -203,7 +203,7 @@ describe.each(table)('FocusWithin responder', hasPointerEvents => {
expect(onFocusWithinVisibleChange).toHaveBeenCalledTimes(1);
expect(onFocusWithinVisibleChange).toHaveBeenCalledWith(true);
// then use pointer on the next target, focus should no longer be visible
dispatchPointerPressDown(innerTarget2);
dispatchPointerDown(innerTarget2);
innerTarget1.dispatchEvent(blur({relatedTarget: innerTarget2}));
innerTarget2.dispatchEvent(focus());
expect(onFocusWithinVisibleChange).toHaveBeenCalledTimes(2);
Expand All @@ -215,7 +215,7 @@ describe.each(table)('FocusWithin responder', hasPointerEvents => {
expect(onFocusWithinVisibleChange).toHaveBeenCalledTimes(3);
expect(onFocusWithinVisibleChange).toHaveBeenCalledWith(true);
// then use pointer on the target, focus should no longer be visible
dispatchPointerPressDown(innerTarget1);
dispatchPointerDown(innerTarget1);
expect(onFocusWithinVisibleChange).toHaveBeenCalledTimes(4);
expect(onFocusWithinVisibleChange).toHaveBeenCalledWith(false);
// onFocusVisibleChange should not be called again
Expand All @@ -225,8 +225,8 @@ describe.each(table)('FocusWithin responder', hasPointerEvents => {

it('is not called after "focus" and "blur" events without keyboard', () => {
const innerTarget = innerRef.current;
dispatchPointerPressDown(innerTarget);
dispatchPointerPressRelease(innerTarget);
dispatchPointerDown(innerTarget);
dispatchPointerUp(innerTarget);
innerTarget.dispatchEvent(blur({relatedTarget: container}));
expect(onFocusWithinVisibleChange).toHaveBeenCalledTimes(0);
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,8 @@ describe.each(table)('Hover responder', hasPointerEvents => {

const target = ref.current;
dispatchPointerHoverEnter(target);
dispatchPointerHoverMove(target, {from: {x: 0, y: 0}, to: {x: 1, y: 1}});
dispatchPointerHoverMove(target, {x: 0, y: 0});
dispatchPointerHoverMove(target, {x: 1, y: 1});
expect(onHoverMove).toHaveBeenCalledTimes(2);
expect(onHoverMove).toHaveBeenCalledWith(
expect.objectContaining({type: 'hovermove'}),
Expand Down Expand Up @@ -317,10 +318,8 @@ describe.each(table)('Hover responder', hasPointerEvents => {
const target = ref.current;

dispatchPointerHoverEnter(target, {x: 10, y: 10});
dispatchPointerHoverMove(target, {
from: {x: 10, y: 10},
to: {x: 20, y: 20},
});
dispatchPointerHoverMove(target, {x: 10, y: 10});
dispatchPointerHoverMove(target, {x: 20, y: 20});
dispatchPointerHoverExit(target, {x: 20, y: 20});

expect(eventLog).toEqual([
Expand Down
Loading