mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
[Flare] Do not block mouse presses on scroll (#16033)
This commit is contained in:
+7
-2
@@ -797,6 +797,7 @@ const PressResponder: ReactDOMEventResponder = {
|
||||
const nativeEvent: any = event.nativeEvent;
|
||||
const isPressed = state.isPressed;
|
||||
const activePointerId = state.activePointerId;
|
||||
const previousPointerType = state.pointerType;
|
||||
|
||||
handleStopPropagation(props, context, nativeEvent);
|
||||
switch (type) {
|
||||
@@ -807,7 +808,7 @@ const PressResponder: ReactDOMEventResponder = {
|
||||
let touchEvent;
|
||||
// Ignore emulated events (pointermove will dispatch touch and mouse events)
|
||||
// Ignore pointermove events during a keyboard press.
|
||||
if (state.pointerType !== pointerType) {
|
||||
if (previousPointerType !== pointerType) {
|
||||
return;
|
||||
}
|
||||
if (type === 'pointermove' && activePointerId !== pointerId) {
|
||||
@@ -976,7 +977,7 @@ const PressResponder: ReactDOMEventResponder = {
|
||||
|
||||
case 'click': {
|
||||
// "keyup" occurs after "click"
|
||||
if (state.pointerType !== 'keyboard') {
|
||||
if (previousPointerType !== 'keyboard') {
|
||||
removeRootEventTypes(context, state);
|
||||
}
|
||||
break;
|
||||
@@ -984,6 +985,10 @@ const PressResponder: ReactDOMEventResponder = {
|
||||
|
||||
// CANCEL
|
||||
case 'scroll': {
|
||||
// We ignore incoming scroll events when using mouse events
|
||||
if (previousPointerType === 'mouse') {
|
||||
return;
|
||||
}
|
||||
const pressTarget = state.pressTarget;
|
||||
const scrollTarget = nativeEvent.target;
|
||||
const doc = context.getActiveDocument();
|
||||
|
||||
@@ -2445,15 +2445,31 @@ describe('Event responder: Press', () => {
|
||||
);
|
||||
ReactDOM.render(element, container);
|
||||
|
||||
ref.current.dispatchEvent(createEvent('pointerdown'));
|
||||
// Should cancel for non-mouse events
|
||||
ref.current.dispatchEvent(
|
||||
createEvent('pointerdown', {
|
||||
pointerType: 'touch',
|
||||
}),
|
||||
);
|
||||
ref.current.dispatchEvent(createEvent('scroll'));
|
||||
expect(onPressEnd).toHaveBeenCalledTimes(1);
|
||||
jest.runAllTimers();
|
||||
expect(onLongPress).not.toBeCalled();
|
||||
|
||||
onLongPress.mockReset();
|
||||
onPressEnd.mockReset();
|
||||
|
||||
// Should not cancel for mouse events
|
||||
ref.current.dispatchEvent(
|
||||
createEvent('pointerdown', {
|
||||
pointerType: 'mouse',
|
||||
}),
|
||||
);
|
||||
ref.current.dispatchEvent(createEvent('scroll'));
|
||||
expect(onPressEnd).toHaveBeenCalledTimes(0);
|
||||
jest.runAllTimers();
|
||||
|
||||
onLongPress.mockReset();
|
||||
|
||||
// When pointer events are supported
|
||||
ref.current.dispatchEvent(
|
||||
createEvent('pointerdown', {
|
||||
|
||||
Reference in New Issue
Block a user