From 143f71ded03f280e736d65f7a0a06542729aec09 Mon Sep 17 00:00:00 2001 From: Mason Freed Date: Tue, 15 Sep 2020 15:24:46 -0700 Subject: [PATCH] Deny ElementInternals.shadowRoot for pre-created shadow roots Per the spec issue [1], this change disallows the use of ElementInternals.shadowRoot for shadow roots created prior to the custom element constructor being run. This protects potentially-closed shadow roots, created outside of the custom element, from being revealed to the custom element itself. (Use case unclear, but this was the request.) [1] https://github.com/w3c/webcomponents/issues/871 Bug: 1042130 Change-Id: I25192256e8b1334d09ea587f29d64f35d4f5f949 --- ...lement-internals-shadowroot.tentative.html | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/shadow-dom/declarative/element-internals-shadowroot.tentative.html b/shadow-dom/declarative/element-internals-shadowroot.tentative.html index 8469a6c1f1ffd6c..aeaa322a31c220d 100644 --- a/shadow-dom/declarative/element-internals-shadowroot.tentative.html +++ b/shadow-dom/declarative/element-internals-shadowroot.tentative.html @@ -108,6 +108,23 @@ assert_throws_dom('NotSupportedError', () => element.attachInternals(), 'attachInternals forbidden by disabledFeatures, post-upgrade'); }, 'ElementInternals disabled by disabledFeatures'); - - +test(() => { + let constructed = false; + const element = document.createElement('x-6'); + const sr = element.attachShadow({mode: 'closed'}); + assert_true(sr instanceof ShadowRoot); + customElements.define('x-6', class extends HTMLElement { + constructor() { + super(); + assert_throws_dom('NotSupportedError', () => this.attachShadow({mode:'open'}), 'attachShadow already called'); + const elementInternals = this.attachInternals(); + assert_equals(elementInternals.shadowRoot, null, 'ElementInternals.shadowRoot should not be available for pre-attached shadow'); + constructed = true; + } + }); + assert_false(constructed); + customElements.upgrade(element); + assert_true(constructed,'Failed to construct - test failed'); + assert_equals(element.shadowRoot, null, 'shadow root is closed'); +}, 'ElementInternals.shadowRoot doesn\'t reveal pre-attached closed shadowRoot');