@samitouri / QOS-React-2 / commits / 6cf2234a57

[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', {