| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>Custom Elements: the HTML fragment parsing algorithm must not create a custom element synchronously</title> | |
| <meta name="author" title="Rob Buis" href="mailto:rbuis@igalia.com"> | |
| <meta name="assert" content="The HTML fragment parsing algorithm must enqueue a custom element upgrade reaction instead of synchronously invoking its constructor"> | |
| <link rel="help" href="https://html.spec.whatwg.org/multipage/parsing.html#create-an-element-for-the-token"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="resources/custom-elements-helpers.js"></script> | |
| </head> | |
| <body> | |
| <div id="log"></div> | |
| <script> | |
| let iteration = 0; | |
| document_types().forEach(function (entry) { | |
| var documentName = entry.name; | |
| var getDocument = entry.create; | |
| let calls = 0; | |
| promise_test(function () { | |
| class Parenter extends HTMLElement { | |
| connectedCallback() { | |
| const child = this.firstChild; | |
| this.removeChild(child); | |
| this.appendChild(child); | |
| } | |
| } | |
| class Child extends HTMLElement { | |
| connectedCallback() { calls++; } | |
| } | |
| iteration++; | |
| let parenter = 'x-parenter' + iteration; | |
| let child = 'x-child' + iteration; | |
| customElements.define(parenter, Parenter); | |
| customElements.define(child, Child); | |
| return getDocument().then(function (doc) { | |
| document.documentElement.innerHTML = `<${parenter}><${child}></${child}></${parenter}>`; | |
| doc.documentElement.appendChild(document.documentElement.firstChild); | |
| assert_equals(calls, 1); | |
| }); | |
| }, `Inserting a custom element into ${documentName} using HTML fragment parsing must enqueue a custom element upgrade reaction, not synchronously invoke its constructor`); | |
| }); | |
| </script> | |
| </body> | |
| </html> |