Skip to content

Commit 3b6f023

Browse files
committedNov 5, 2023
perf(cdk/a11y): Don't trigger re-layout when detecting fake mousedown (#28029)
(cherry picked from commit 737c7a8)
1 parent 2b95171 commit 3b6f023

File tree

6 files changed

+12
-14
lines changed

6 files changed

+12
-14
lines changed
 

‎src/cdk/a11y/fake-event-detection.ts

+4-6
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,11 @@
99
/** Gets whether an event could be a faked `mousedown` event dispatched by a screen reader. */
1010
export function isFakeMousedownFromScreenReader(event: MouseEvent): boolean {
1111
// Some screen readers will dispatch a fake `mousedown` event when pressing enter or space on
12-
// a clickable element. We can distinguish these events when both `offsetX` and `offsetY` are
13-
// zero or `event.buttons` is zero, depending on the browser:
12+
// a clickable element. We can distinguish these events when `event.buttons` is zero, or
13+
// `event.detail` is zero depending on the browser:
1414
// - `event.buttons` works on Firefox, but fails on Chrome.
15-
// - `offsetX` and `offsetY` work on Chrome, but fail on Firefox.
16-
// Note that there's an edge case where the user could click the 0x0 spot of the
17-
// screen themselves, but that is unlikely to contain interactive elements.
18-
return event.buttons === 0 || (event.offsetX === 0 && event.offsetY === 0);
15+
// - `detail` works on Chrome, but fails on Firefox.
16+
return event.buttons === 0 || event.detail === 0;
1917
}
2018

2119
/** Gets whether an event could be a faked `touchstart` event dispatched by a screen reader. */

‎src/cdk/a11y/focus-monitor/focus-monitor.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@ describe('FocusMonitor', () => {
168168
// Simulate focus via a fake mousedown from a screen reader.
169169
dispatchMouseEvent(buttonElement, 'mousedown');
170170
const event = createMouseEvent('mousedown');
171-
Object.defineProperties(event, {offsetX: {get: () => 0}, offsetY: {get: () => 0}});
171+
Object.defineProperties(event, {detail: {get: () => 0}});
172172
dispatchEvent(buttonElement, event);
173173

174174
buttonElement.focus();

‎src/cdk/a11y/input-modality/input-modality-detector.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ describe('InputModalityDetector', () => {
138138

139139
// Create a fake screen-reader mouse event.
140140
const event = createMouseEvent('mousedown');
141-
Object.defineProperties(event, {offsetX: {get: () => 0}, offsetY: {get: () => 0}});
141+
Object.defineProperties(event, {detail: {get: () => 0}});
142142
dispatchEvent(document, event);
143143

144144
expect(detector.mostRecentModality).toBe('keyboard');

‎src/cdk/drag-drop/directives/drag.spec.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -240,8 +240,8 @@ describe('CdkDrag', () => {
240240
const event = createMouseEvent('mousedown', 0, 0);
241241

242242
Object.defineProperties(event, {
243-
offsetX: {get: () => 0},
244-
offsetY: {get: () => 0},
243+
buttons: {get: () => 0},
244+
detail: {get: () => 0},
245245
});
246246

247247
expect(dragElement.style.transform).toBeFalsy();

‎src/cdk/testing/testbed/fake-events/event-objects.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ export function createMouseEvent(
1919
type: string,
2020
clientX = 0,
2121
clientY = 0,
22-
offsetX = 1,
23-
offsetY = 1,
22+
offsetX = 0,
23+
offsetY = 0,
2424
button = 0,
2525
modifiers: ModifierKeys = {},
2626
) {
@@ -36,7 +36,7 @@ export function createMouseEvent(
3636
cancelable: true,
3737
composed: true, // Required for shadow DOM events.
3838
view: window,
39-
detail: 0,
39+
detail: 1,
4040
relatedTarget: null,
4141
screenX,
4242
screenY,

‎src/material/core/ripple/ripple.spec.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ describe('MatRipple', () => {
201201

202202
it('should ignore fake mouse events from screen readers', () => {
203203
const event = createMouseEvent('mousedown');
204-
Object.defineProperties(event, {offsetX: {get: () => 0}, offsetY: {get: () => 0}});
204+
Object.defineProperties(event, {buttons: {get: () => 0}, detail: {get: () => 0}});
205205

206206
dispatchEvent(rippleTarget, event);
207207

0 commit comments

Comments
 (0)
Please sign in to comment.