From 0d6642c98885491533990122bd20ff84dae6080b Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Tue, 25 Nov 2025 13:08:34 +0100 Subject: [PATCH] fix(cdk/testing): errors in harnesses when using Vitest Fixes that we were hitting an error due to the DOM implementation that Vitest is using when constructing events. --- .../testing/testbed/fake-events/event-objects.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/cdk/testing/testbed/fake-events/event-objects.ts b/src/cdk/testing/testbed/fake-events/event-objects.ts index 5674f1a77cf2..dd3cc6b62517 100644 --- a/src/cdk/testing/testbed/fake-events/event-objects.ts +++ b/src/cdk/testing/testbed/fake-events/event-objects.ts @@ -35,7 +35,7 @@ export function createMouseEvent( bubbles: true, cancelable: true, composed: true, // Required for shadow DOM events. - view: window, + view: getEventView(), detail: 1, relatedTarget: null, screenX, @@ -85,7 +85,7 @@ export function createPointerEvent( bubbles: true, cancelable: true, composed: true, // Required for shadow DOM events. - view: window, + view: getEventView(), clientX, clientY, ...options, @@ -139,7 +139,7 @@ export function createKeyboardEvent( bubbles: true, cancelable: true, composed: true, // Required for shadow DOM events. - view: window, + view: getEventView(), keyCode, key, shiftKey: modifiers.shift, @@ -165,3 +165,13 @@ export function createFakeEvent(type: string, bubbles = false, cancelable = true function defineReadonlyEventProperty(event: Event, propertyName: string, value: any) { Object.defineProperty(event, propertyName, {get: () => value, configurable: true}); } + +/** Gets the `view` that should be passed to synthetically-created DOM events */ +function getEventView(): Window | undefined { + // Passing `window` as the `view` on for events when the environment is using jsdom + // ends up throwing `member view is not of type Window` (see #32389). Leave it as + // `undefined` for such cases. + return typeof window !== 'undefined' && window && !(window as Window & {jsdom?: unknown}).jsdom + ? window + : undefined; +}