[Flare] Do not block mouse presses on scroll (#16033)
Dominic Gannaway committed
Jul 2, 2019 at 16:58 UTC
6cf2234a57450fdc19ffa373df9cecfce74fb8c0
2 files changed
+25
-4
packages/react-events/src/dom/Press.js
+7
-2
@@ -797,6 +797,7 @@ const PressResponder: ReactDOMEventResponder = {
797
const nativeEvent: any = event.nativeEvent;
798
const isPressed = state.isPressed;
799
const activePointerId = state.activePointerId;
800
+ const previousPointerType = state.pointerType;
801
802
handleStopPropagation(props, context, nativeEvent);
803
switch (type) {
@@ -807,7 +808,7 @@ const PressResponder: ReactDOMEventResponder = {
808
let touchEvent;
809
// Ignore emulated events (pointermove will dispatch touch and mouse events)
810
// Ignore pointermove events during a keyboard press.
810
- if (state.pointerType !== pointerType) {
811
+ if (previousPointerType !== pointerType) {
812
return;
813
}
814
if (type === 'pointermove' && activePointerId !== pointerId) {
@@ -976,7 +977,7 @@ const PressResponder: ReactDOMEventResponder = {
977
978
case 'click': {
979
// "keyup" occurs after "click"
979
- if (state.pointerType !== 'keyboard') {
980
+ if (previousPointerType !== 'keyboard') {
981
removeRootEventTypes(context, state);
982
}
983
break;
@@ -984,6 +985,10 @@ const PressResponder: ReactDOMEventResponder = {
985
986
// CANCEL
987
case 'scroll': {
988
+ // We ignore incoming scroll events when using mouse events
989
+ if (previousPointerType === 'mouse') {
990
+ return;
991
+ }
992
const pressTarget = state.pressTarget;
993
const scrollTarget = nativeEvent.target;
994
const doc = context.getActiveDocument();
packages/react-events/src/dom/__tests__/Press-test.internal.js
+18
-2
@@ -2445,15 +2445,31 @@ describe('Event responder: Press', () => {
2445
);
2446
ReactDOM.render(element, container);
2447
2448
- ref.current.dispatchEvent(createEvent('pointerdown'));
2448
+ // Should cancel for non-mouse events
2449
+ ref.current.dispatchEvent(
2450
+ createEvent('pointerdown', {
2451
+ pointerType: 'touch',
2452
+ }),
2453
+ );
2454
ref.current.dispatchEvent(createEvent('scroll'));
2455
expect(onPressEnd).toHaveBeenCalledTimes(1);
2456
jest.runAllTimers();
2457
expect(onLongPress).not.toBeCalled();
2458
2454
- onLongPress.mockReset();
2459
onPressEnd.mockReset();
2460
2461
+ // Should not cancel for mouse events
2462
+ ref.current.dispatchEvent(
2463
+ createEvent('pointerdown', {
2464
+ pointerType: 'mouse',
2465
+ }),
2466
+ );
2467
+ ref.current.dispatchEvent(createEvent('scroll'));
2468
+ expect(onPressEnd).toHaveBeenCalledTimes(0);
2469
+ jest.runAllTimers();
2470
+
2471
+ onLongPress.mockReset();
2472
+
2473
// When pointer events are supported
2474
ref.current.dispatchEvent(
2475
createEvent('pointerdown', {