Skip to content

Commit 2f03aa6

Browse files
authored
[react-events] Fix middle-click for Press (#16546)
Browsers always report 'buttons' as 0 when a pointer is released.
1 parent 16c3408 commit 2f03aa6

File tree

3 files changed

+14
-18
lines changed

3 files changed

+14
-18
lines changed

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

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type PressState = {
4343
y: number,
4444
|}>,
4545
addedRootEvents: boolean,
46+
buttons: 0 | 1 | 4,
4647
isActivePressed: boolean,
4748
isActivePressStart: boolean,
4849
isPressed: boolean,
@@ -149,9 +150,9 @@ function createPressEvent(
149150
event: ?ReactDOMResponderEvent,
150151
touchEvent: null | Touch,
151152
defaultPrevented: boolean,
153+
state: PressState,
152154
): PressEvent {
153155
const timeStamp = context.getTimeStamp();
154-
let buttons = 1;
155156
let clientX = null;
156157
let clientY = null;
157158
let pageX = null;
@@ -171,20 +172,12 @@ function createPressEvent(
171172
let eventObject;
172173
eventObject = (touchEvent: any) || (nativeEvent: any);
173174
if (eventObject) {
174-
({
175-
buttons,
176-
clientX,
177-
clientY,
178-
pageX,
179-
pageY,
180-
screenX,
181-
screenY,
182-
} = eventObject);
175+
({clientX, clientY, pageX, pageY, screenX, screenY} = eventObject);
183176
}
184177
}
185178
return {
186179
altKey,
187-
buttons,
180+
buttons: state.buttons,
188181
clientX,
189182
clientY,
190183
ctrlKey,
@@ -226,6 +219,7 @@ function dispatchEvent(
226219
event,
227220
touchEvent,
228221
defaultPrevented,
222+
state,
229223
);
230224
context.dispatchEvent(syntheticEvent, listener, eventPriority);
231225
}
@@ -493,6 +487,7 @@ const pressResponderImpl = {
493487
return {
494488
activationPosition: null,
495489
addedRootEvents: false,
490+
buttons: 0,
496491
isActivePressed: false,
497492
isActivePressStart: false,
498493
isPressed: false,
@@ -586,7 +581,7 @@ const pressResponderImpl = {
586581
state.activePointerId = touchEvent.identifier;
587582
}
588583

589-
// Ignore any device buttons except primary/secondary and touch/pen contact.
584+
// Ignore any device buttons except primary/middle and touch/pen contact.
590585
// Additionally we ignore primary-button + ctrl-key with Macs as that
591586
// acts like right-click and opens the contextmenu.
592587
if (
@@ -606,6 +601,7 @@ const pressResponderImpl = {
606601
}
607602
state.responderRegionOnDeactivation = null;
608603
state.isPressWithinResponderRegion = true;
604+
state.buttons = nativeEvent.buttons;
609605
dispatchPressStartEvents(event, context, props, state);
610606
addRootEventTypes(context, state);
611607
} else {
@@ -709,7 +705,7 @@ const pressResponderImpl = {
709705
case 'mouseup':
710706
case 'touchend': {
711707
if (isPressed) {
712-
const buttons = nativeEvent.buttons;
708+
const buttons = state.buttons;
713709
let isKeyboardEvent = false;
714710
let touchEvent;
715711
if (type === 'pointerup' && activePointerId !== pointerId) {

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
136136
const target = createEventTarget(node);
137137
target.setBoundingClientRect({x: 0, y: 0, width: 100, height: 100});
138138
target.pointerdown({buttons: buttonsType.middle, pointerType: 'mouse'});
139-
target.pointerup({buttons: buttonsType.middle, pointerType: 'mouse'});
139+
target.pointerup({pointerType: 'mouse'});
140140
target.pointerhover({x: 110, y: 110});
141141
target.pointerhover({x: 50, y: 50});
142142
expect(onPressStart).toHaveBeenCalledTimes(1);
@@ -216,7 +216,7 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
216216
it('is called after middle-button pointer up', () => {
217217
const target = createEventTarget(ref.current);
218218
target.pointerdown({buttons: buttonsType.middle, pointerType: 'mouse'});
219-
target.pointerup({buttons: buttonsType.middle, pointerType: 'mouse'});
219+
target.pointerup({pointerType: 'mouse'});
220220
expect(onPressEnd).toHaveBeenCalledTimes(1);
221221
expect(onPressEnd).toHaveBeenCalledWith(
222222
expect.objectContaining({
@@ -357,7 +357,7 @@ describe.each(environmentTable)('Press responder', hasPointerEvents => {
357357
it('is not called after middle-button press', () => {
358358
const target = createEventTarget(ref.current);
359359
target.pointerdown({buttons: buttonsType.middle, pointerType: 'mouse'});
360-
target.pointerup({buttons: buttonsType.middle, pointerType: 'mouse'});
360+
target.pointerup({pointerType: 'mouse'});
361361
expect(onPress).not.toHaveBeenCalled();
362362
});
363363

packages/react-events/src/dom/testing-library/domEvents.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,8 @@ export function pointerover(payload) {
329329

330330
export function pointerup(payload) {
331331
return createPointerEvent('pointerup', {
332-
buttons: buttonsType.none,
333332
...payload,
333+
buttons: buttonsType.none,
334334
});
335335
}
336336

@@ -367,8 +367,8 @@ export function mouseover(payload) {
367367

368368
export function mouseup(payload) {
369369
return createMouseEvent('mouseup', {
370-
buttons: buttonsType.none,
371370
...payload,
371+
buttons: buttonsType.none,
372372
});
373373
}
374374

0 commit comments

Comments
 (0)