Skip to content

Commit 2d976a9

Browse files
authored
feat(cdk/testing): allow preventDefault on mouse events (#16839)
1 parent af3c9af commit 2d976a9

File tree

1 file changed

+19
-4
lines changed

1 file changed

+19
-4
lines changed

src/cdk/testing/event-objects.ts

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ export interface ModifierKeys {
2020
*/
2121
export function createMouseEvent(type: string, x = 0, y = 0, button = 0) {
2222
const event = document.createEvent('MouseEvent');
23+
const originalPreventDefault = event.preventDefault;
2324

2425
event.initMouseEvent(type,
2526
true, /* canBubble */
26-
false, /* cancelable */
27+
true, /* cancelable */
2728
window, /* view */
2829
0, /* detail */
2930
x, /* screenX */
@@ -41,6 +42,12 @@ export function createMouseEvent(type: string, x = 0, y = 0, button = 0) {
4142
// defaults it to 0 which looks like a fake event.
4243
Object.defineProperty(event, 'buttons', {get: () => 1});
4344

45+
// IE won't set `defaultPrevented` on synthetic events so we need to do it manually.
46+
event.preventDefault = function() {
47+
Object.defineProperty(event, 'defaultPrevented', { get: () => true });
48+
return originalPreventDefault.apply(this, arguments);
49+
};
50+
4451
return event;
4552
}
4653

@@ -73,8 +80,8 @@ export function createTouchEvent(type: string, pageX = 0, pageY = 0) {
7380
*/
7481
export function createKeyboardEvent(type: string, keyCode: number = 0, key: string = '',
7582
target?: Element, modifiers: ModifierKeys = {}) {
76-
let event = document.createEvent('KeyboardEvent') as any;
77-
let originalPreventDefault = event.preventDefault;
83+
const event = document.createEvent('KeyboardEvent') as any;
84+
const originalPreventDefault = event.preventDefault;
7885

7986
// Firefox does not support `initKeyboardEvent`, but supports `initKeyEvent`.
8087
if (event.initKeyEvent) {
@@ -85,7 +92,15 @@ export function createKeyboardEvent(type: string, keyCode: number = 0, key: stri
8592
// See https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/initKeyboardEvent
8693
const modifiersStr = (modifiers.control ? 'Control ' : '' + modifiers.alt ? 'Alt ' : '' +
8794
modifiers.shift ? 'Shift ' : '' + modifiers.meta ? 'Meta' : '').trim();
88-
event.initKeyboardEvent(type, true, true, window, 0, key, 0, modifiersStr, false);
95+
event.initKeyboardEvent(type,
96+
true, /* canBubble */
97+
true, /* cancelable */
98+
window, /* view */
99+
0, /* char */
100+
key, /* key */
101+
0, /* location */
102+
modifiersStr, /* modifiersList */
103+
false /* repeat */);
89104
}
90105

91106
// Webkit Browsers don't set the keyCode when calling the init function.

0 commit comments

Comments
 (0)