| <!DOCTYPE html> | |
| <html> | |
| <head> | |
| <title>Custom Elements: document.createElementNS must create an element with synchronous custom elements flag set</title> | |
| <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> | |
| <meta name="assert" content="document.createElementNS must create an element with synchronous custom elements flag set"> | |
| <link rel="help" content="https://dom.spec.whatwg.org/#dom-document-createelementns"> | |
| <link rel="help" content="https://dom.spec.whatwg.org/#concept-create-element"> | |
| <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> | |
| const xhtmlNamespaceURI = 'http://www.w3.org/1999/xhtml'; | |
| test_with_window((contentWindow, contentDocument) => { | |
| let constructorArguments; | |
| class MyCustomElement extends contentWindow.HTMLElement { | |
| constructor() { | |
| constructorArguments = Array.from(arguments); | |
| super(); | |
| } | |
| } | |
| contentWindow.customElements.define('my-custom-element', MyCustomElement); | |
| const instance = contentDocument.createElement('my-custom-element'); | |
| assert_true(instance instanceof MyCustomElement); | |
| assert_array_equals(constructorArguments, []); | |
| }, 'document.createElement invoke a custom element constructor with no arguments'); | |
| test_with_window((contentWindow, contentDocument) => { | |
| class MyCustomElement extends contentWindow.HTMLElement {}; | |
| const upgradeCandidate = contentDocument.createElementNS(xhtmlNamespaceURI, 'my-custom-element'); | |
| assert_true(upgradeCandidate instanceof contentWindow.HTMLElement); | |
| assert_false(upgradeCandidate instanceof MyCustomElement); | |
| contentWindow.customElements.define('my-custom-element', MyCustomElement); | |
| const instance = contentDocument.createElementNS(xhtmlNamespaceURI, 'my-custom-element'); | |
| assert_true(instance instanceof MyCustomElement); | |
| assert_equals(instance.localName, 'my-custom-element'); | |
| assert_equals(instance.namespaceURI, xhtmlNamespaceURI); | |
| }, 'document.createElementNS must create an instance of custom elements'); | |
| test_with_window((contentWindow, contentDocument) => { | |
| class MyCustomElement extends contentWindow.HTMLElement {}; | |
| contentWindow.customElements.define('element-with-prefix', MyCustomElement); | |
| const instance = contentDocument.createElementNS(xhtmlNamespaceURI, 'foo:element-with-prefix'); | |
| assert_true(instance instanceof MyCustomElement); | |
| assert_equals(instance.localName, 'element-with-prefix'); | |
| assert_equals(instance.namespaceURI, xhtmlNamespaceURI); | |
| assert_equals(instance.prefix, 'foo'); | |
| }, 'document.createElementNS must set the prefix after constructing a custom element'); | |
| test_with_window((contentWindow, contentDocument) => { | |
| let innerElement; | |
| let innerElementPrefix; | |
| let outerElement; | |
| let outerElementPrefix; | |
| class MyCustomElement extends contentWindow.HTMLElement { | |
| constructor(isInnerCall) { | |
| if (isInnerCall) { | |
| innerElement = super(); | |
| innerElementPrefix = innerElement.prefix; | |
| return innerElement; | |
| } | |
| outerElement = super(); | |
| outerElementPrefix = outerElement.prefix; | |
| return new MyCustomElement(true); | |
| } | |
| } | |
| contentWindow.customElements.define('custom-element', MyCustomElement); | |
| const instance = contentDocument.createElementNS(xhtmlNamespaceURI, 'foo:custom-element'); | |
| assert_true(instance instanceof MyCustomElement); | |
| assert_equals(instance.localName, 'custom-element'); | |
| assert_equals(instance.namespaceURI, xhtmlNamespaceURI); | |
| assert_equals(instance.prefix, 'foo'); | |
| assert_equals(instance, innerElement, 'document.createElementNS must create an element with the synchronous custom elements flag set'); | |
| assert_equals(innerElementPrefix, null, 'HTML constructor must not set prefix'); | |
| assert_equals(outerElementPrefix, null, 'HTML constructor must not set prefix'); | |
| }, 'document.createElementNS must use the element returned by the constructor'); | |
| </script> | |
| </body> | |
| </html> |