From bea548eafdc012599f491c39f6d6a3da9df9ab16 Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Thu, 29 Oct 2026 13:05:48 +0100 Subject: [PATCH] fix(cdk/testing): enable bubbling for input-related events Enables bubbling for fake input-related events to match how the browser behaves. Fixes #34017. --- src/cdk/scrolling/scroll-dispatcher.spec.ts | 2 +- src/cdk/testing/testbed/fake-events/element-focus.ts | 6 +++--- src/cdk/testing/testbed/fake-events/type-in-element.ts | 6 +++--- src/cdk/testing/testbed/unit-test-element.ts | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cdk/scrolling/scroll-dispatcher.spec.ts b/src/cdk/scrolling/scroll-dispatcher.spec.ts index 286ffb262af0..376677213e64 100644 --- a/src/cdk/scrolling/scroll-dispatcher.spec.ts +++ b/src/cdk/scrolling/scroll-dispatcher.spec.ts @@ -103,7 +103,7 @@ describe('ScrollDispatcher', () => { scroll.register(scrollable); scroll.deregister(scrollable); - dispatchFakeEvent(fixture.componentInstance.scrollingElement.nativeElement, 'scroll'); + dispatchFakeEvent(fixture.componentInstance.scrollingElement.nativeElement, 'scroll', false); fixture.detectChanges(); expect(scrollSpy).not.toHaveBeenCalled(); diff --git a/src/cdk/testing/testbed/fake-events/element-focus.ts b/src/cdk/testing/testbed/fake-events/element-focus.ts index 935b8a6a3386..66a37719ceea 100644 --- a/src/cdk/testing/testbed/fake-events/element-focus.ts +++ b/src/cdk/testing/testbed/fake-events/element-focus.ts @@ -15,7 +15,7 @@ function triggerFocusChange(element: HTMLElement, event: 'focus' | 'blur') { element[event](); element.removeEventListener(event, handler); if (!eventFired) { - dispatchFakeEvent(element, event); + dispatchFakeEvent(element, event, false); } } @@ -28,8 +28,8 @@ function triggerFocusChange(element: HTMLElement, event: 'focus' | 'blur') { // TODO: Check if this element focus patching is still needed for local testing, // where browser is not necessarily focused. export function patchElementFocus(element: HTMLElement) { - element.focus = () => dispatchFakeEvent(element, 'focus'); - element.blur = () => dispatchFakeEvent(element, 'blur'); + element.focus = () => dispatchFakeEvent(element, 'focus', false); + element.blur = () => dispatchFakeEvent(element, 'blur', false); } /** @docs-private */ diff --git a/src/cdk/testing/testbed/fake-events/type-in-element.ts b/src/cdk/testing/testbed/fake-events/type-in-element.ts index aff0b330dd7d..fd57af426585 100644 --- a/src/cdk/testing/testbed/fake-events/type-in-element.ts +++ b/src/cdk/testing/testbed/fake-events/type-in-element.ts @@ -163,7 +163,7 @@ export function typeInElement(element: HTMLElement, ...modifiersAndKeys: any[]) if (isInput && key.key && key.key.length === 1) { if (enterValueIncrementally) { (element as HTMLInputElement | HTMLTextAreaElement).value += key.key; - dispatchFakeEvent(element, 'input'); + dispatchFakeEvent(element, 'input', true); } } dispatchKeyboardEvent(element, 'keyup', key.keyCode, key.key, modifiers, key.code); @@ -171,7 +171,7 @@ export function typeInElement(element: HTMLElement, ...modifiersAndKeys: any[]) // Since we weren't dispatching `input` events while sending the keys, we have to do it now. if (!enterValueIncrementally) { - dispatchFakeEvent(element, 'input'); + dispatchFakeEvent(element, 'input', true); } } @@ -182,5 +182,5 @@ export function typeInElement(element: HTMLElement, ...modifiersAndKeys: any[]) export function clearElement(element: HTMLInputElement | HTMLTextAreaElement) { triggerFocus(element as HTMLElement); element.value = ''; - dispatchFakeEvent(element, 'input'); + dispatchFakeEvent(element, 'input', true); } diff --git a/src/cdk/testing/testbed/unit-test-element.ts b/src/cdk/testing/testbed/unit-test-element.ts index 9edb55433497..1a281464dc40 100644 --- a/src/cdk/testing/testbed/unit-test-element.ts +++ b/src/cdk/testing/testbed/unit-test-element.ts @@ -254,7 +254,7 @@ export class UnitTestElement implements TestElement { if (option.selected !== wasSelected) { hasChanged = true; - dispatchFakeEvent(this.element, 'change'); + dispatchFakeEvent(this.element, 'change', true); } }