From e453848ae6e8b50cb2b54bc771eefd9e6ef1e5fb Mon Sep 17 00:00:00 2001 From: Doug Parker Date: Tue, 27 Jan 2026 16:03:17 -0800 Subject: [PATCH] test(platform-browser): verify that Angular supports bootstrapping under shadow roots This tests bootstrapping Angular underneath a shadow root and that styles are applied and removed at the correct locations. --- .../test/dom/shadow_dom_spec.ts | 153 +++++++++++++++++- 1 file changed, 152 insertions(+), 1 deletion(-) diff --git a/packages/platform-browser/test/dom/shadow_dom_spec.ts b/packages/platform-browser/test/dom/shadow_dom_spec.ts index e04ebeae06c..01962d97901 100644 --- a/packages/platform-browser/test/dom/shadow_dom_spec.ts +++ b/packages/platform-browser/test/dom/shadow_dom_spec.ts @@ -8,7 +8,7 @@ import {Component, NgModule, ViewEncapsulation} from '@angular/core'; import {TestBed} from '@angular/core/testing'; -import {BrowserModule} from '../../index'; +import {BrowserModule, createApplication} from '../../index'; import {expect} from '@angular/private/testing/matchers'; import {isNode} from '@angular/private/testing'; @@ -23,6 +23,10 @@ describe('ShadowDOM Support', () => { TestBed.configureTestingModule({imports: [TestModule]}); }); + beforeEach(() => { + for (const node of Array.from(document.body.childNodes)) node.remove(); + }); + it('should attach and use a shadowRoot when ViewEncapsulation.ShadowDom is set', () => { const compEl = TestBed.createComponent(ShadowComponent).nativeElement; expect(compEl.shadowRoot!.textContent).toEqual('Hello World'); @@ -81,6 +85,153 @@ describe('ShadowDOM Support', () => { expect(articleContent.assignedSlot).toBe(articleSlot); expect(articleSubcontent.assignedSlot).toBe(articleSlot); }); + + it('should support bootstrapping under a shadow root', async () => { + @Component({ + selector: 'app-root', + template: '
Hello, World!
', + styles: ` + div { + color: red; + } + `, + }) + class Root {} + + const container = document.createElement('div'); + container.attachShadow({mode: 'open'}); + const root = document.createElement('app-root'); + container.shadowRoot!.append(root); + document.body.append(container); + + const appRef = await createApplication(); + appRef.bootstrap(Root, root); + + expect(getComputedStyle(root.querySelector('div')!).color).toBe('rgb(255, 0, 0)'); + + expect(document.head.innerHTML).not.toContain('