diff --git a/shadow-dom/Element-interface-attachShadow-custom-element.html b/shadow-dom/Element-interface-attachShadow-custom-element.html index b59460e17b97353..5d862c49244b4f5 100644 --- a/shadow-dom/Element-interface-attachShadow-custom-element.html +++ b/shadow-dom/Element-interface-attachShadow-custom-element.html @@ -14,6 +14,78 @@ assert_true(document.createElement('my-custom').attachShadow({mode: "open"}) instanceof ShadowRoot); }, 'Element.attachShadow must create an instance of ShadowRoot for autonomous custom elements'); +test(() => { + assert_true(document.createElement('undefined-custom').attachShadow({mode: 'open'}) instanceof ShadowRoot); +}, 'Element.attachShadow must create an instance of ShadowRoot for undefined autonomous custom elements'); + +test(() => { + class ShadowDisabledElement extends HTMLElement { + static disabledFeatures = ['shadow']; + } + + // No definition. attachShadow() should succeed. + let element = document.createElement('shadow-disabled-element'); + element.attachShadow({mode: 'closed'}); + + // No definition and it's already a host. + assert_throws('NotSupportedError', () => { + element.attachShadow({mode: 'closed'}); + }, 'No definition, host'); + + // The element has a definition, and it's already a host. + customElements.define('shadow-disabled-element', ShadowDisabledElement); + assert_throws('NotSupportedError', () => { + element.attachShadow({mode: 'closed'}); + }, 'Definition, host'); + + // The element has a definition, and it's not a host. + assert_throws('NotSupportedError', () => { + document.createElement('shadow-disabled-element').attachShadow({mode: 'closed'}); + }, 'Definition, not a host'); +}, 'Element.attachShadow for an autonomous custom element with ' + + 'disabledFeatures=["shadow"] should throw a NotSupportedError'); + +test(() => { + class ShadowDisabledHeadingElement extends HTMLHeadingElement { + static disabledFeatures = ['shadow']; + } + + // No definition. attachShadow() should succeed. + let element = document.createElement('h2', + {is: 'shadow-disabled-heading-element'}); + element.attachShadow({mode: 'closed'}); + + // No definition and it's already a host. + assert_throws('NotSupportedError', () => { + element.attachShadow({mode: 'closed'}); + }, 'No definition, host.'); + + // The element has a definition, and it's already a host. + customElements.define('shadow-disabled-heading-element', + ShadowDisabledHeadingElement, {extends: 'h2'}); + assert_throws('NotSupportedError', () => { + element.attachShadow({mode: 'closed'}); + }, 'Definition, host'); + + // The element has a definition, and it's not a host. + let h2 = document.createElement('h2', {is: 'shadow-disabled-heading-element'}); + assert_throws('NotSupportedError', () => { + h2.attachShadow({mode: 'closed'}); + }, 'Definition, not a host'); +}, 'Element.attachShadow for a customized built-in element with ' + + 'disabledFeatures=["shadow"] should throw a NotSupportedError'); + +test(() => { + class CapitalShadowDisabledElement extends HTMLElement { + static disabledFeatures = ['SHADOW']; + } + + customElements.define('capital-shadow-disabled-element', CapitalShadowDisabledElement); + + // Test fails if this throws + document.createElement('capital-shadow-disabled-element').attachShadow({mode: 'open'}); +}, 'Element.attachShadow for a custom element with disabledFeatures=["SHADOW"] should not throw a NotSupportedError'); + class MyCustomizedBuiltinElement extends HTMLInputElement { }