<!DOCTYPE html>
<title>Shadow DOM: Attaching a ShadowRoot for custom elements</title>
<meta name="author" title="Hayato Ito" href="mailto:hayato@chromium.org">
<link rel="help" href="https://dom.spec.whatwg.org/#dom-element-attachshadow">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
class MyAutonomousCustomElement extends HTMLElement {
}

customElements.define('my-custom', MyAutonomousCustomElement);

test(() => {
  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 get disabledFeatures() { return ['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_dom('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_dom('NotSupportedError', () => {
    element.attachShadow({mode: 'closed'});
  }, 'Definition, host');

  // The element has a definition, and it's not a host.
  assert_throws_dom('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 get disabledFeatures() { return ['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_dom('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_dom('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_dom('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 get disabledFeatures() { return ['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 {
}

customElements.define('my-input', MyCustomizedBuiltinElement, { extends: 'input' });

test(() => {
  assert_throws_dom('NotSupportedError', () => {
    document.createElement('input', {is: 'my-input'}).attachShadow({mode: "open"});
  });
}, 'Element.attachShadow must throw a NotSupportedError for customized built-in elements');
</script>
</body>
</html>
