| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Shadow DOM: slotchange customelements</title> |
| <meta name="author" title="Surma" href="mailto:surma@google.com"> |
| <link rel="help" href="https://dom.spec.whatwg.org/#signaling-slot-change"> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <slots-in-constructor id="constructor-upgrade"><div></div></slots-in-constructor> |
| <slots-in-callback id="callback-upgrade"><div></div></slots-in-callback> |
| <script> |
| var calls = []; |
| class SlotsInConstructor extends HTMLElement { |
| constructor() { |
| super(); |
| this.attachShadow({mode: 'open'}); |
| this.shadowRoot.innerHTML = '<slot></slot>'; |
| var slot = this.shadowRoot.children[0]; |
| slot.addEventListener('slotchange', function() { |
| calls.push(this.id); |
| }.bind(this)); |
| } |
| } |
| customElements.define('slots-in-constructor', SlotsInConstructor); |
| class SlotsInCallback extends HTMLElement { |
| constructor() { |
| super(); |
| } |
| |
| connectedCallback() { |
| this.attachShadow({mode: 'open'}); |
| this.shadowRoot.innerHTML = '<slot></slot>'; |
| var slot = this.shadowRoot.children[0]; |
| slot.addEventListener('slotchange', function() { |
| calls.push(this.id); |
| }.bind(this)); |
| } |
| } |
| customElements.define('slots-in-callback', SlotsInCallback); |
| </script> |
| <slots-in-constructor id="constructor-parser"><div></div></slots-in-constructor> |
| <slots-in-callback id="callback-parser"><div></div></slots-in-callback> |
| <script> |
| test(function () { |
| assert_true(calls.includes("constructor-parser")); |
| assert_true(calls.includes("callback-parser")); |
| assert_true(calls.includes("constructor-upgrade")); |
| assert_true(calls.includes("callback-upgrade")); |
| }, 'slotchange must fire on initialization of custom elements with slotted children'); |
| done(); |
| </script> |
| </body> |
| </html> |