scoped-custom-element-registry-customelementregistry-attribute.html (4875B)
1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> 5 <link rel="help" href="https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-initialize"> 6 <script src="/resources/testharness.js"></script> 7 <script src="/resources/testharnessreport.js"></script> 8 </head> 9 <body> 10 <script> 11 12 function makeIframe(test) { 13 const iframe = document.createElement('iframe'); 14 document.body.appendChild(iframe); 15 test.add_cleanup(() => iframe.remove()); 16 return [iframe.contentDocument, iframe.contentWindow]; 17 } 18 19 function makeIframeWithABElement(test) { 20 const [doc, win] = makeIframe(test); 21 win.customElements.define('a-b', class ABElement extends win.HTMLElement { }); 22 return [doc, win]; 23 } 24 25 function runBasicTests(makeIframe, elementName, elementDescription) { 26 test((test) => { 27 const [doc, win] = makeIframe(test); 28 doc.documentElement.setHTMLUnsafe(`<${elementName} customelementregistry></${elementName}>`); 29 assert_equals(doc.querySelector(elementName).customElementRegistry, null); 30 }, `HTML parser should create a ${elementDescription} with null registry if customelementregistry is set`); 31 32 test((test) => { 33 const [doc, win] = makeIframe(test); 34 const element = doc.createElement(elementName); 35 assert_equals(element.customElementRegistry, win.customElements); 36 element.setAttribute('customelementregistry', ''); 37 assert_equals(element.customElementRegistry, win.customElements); 38 }, `Setting customelementregistry content attribute after a ${elementDescription} had finishsed parsing should not set null registry`); 39 40 test((test) => { 41 const [doc, win] = makeIframe(test); 42 const element = doc.createElement(elementName, {customElementRegistry: null}); 43 assert_equals(element.customElementRegistry, null); 44 assert_equals(element.cloneNode(false).customElementRegistry, null); 45 46 doc.documentElement.setHTMLUnsafe(`<${elementName} customelementregistry></${elementName}>`); 47 assert_equals(doc.querySelector(elementName).customElementRegistry, null); 48 assert_equals(doc.querySelector(elementName).cloneNode(true).customElementRegistry, null); 49 }, `Cloning a ${elementDescription} with null regsitry should create an element with null registry`); 50 } 51 52 runBasicTests(makeIframe, 'div', 'builtin element'); 53 runBasicTests(makeIframe, 'a-b', 'custom element candidate'); 54 runBasicTests(makeIframeWithABElement, 'a-b', 'custom element'); 55 56 test((test) => { 57 const [doc, win] = makeIframe(test); 58 win.customElements.define('c-d', class CDElement extends win.HTMLElement { }); 59 const container = doc.createElement('div', {customElementRegistry: null}); 60 container.innerHTML = '<a-b><c-d></c-d><e-f customelementregistry></e-f></a-b>'; 61 assert_equals(container.querySelector('a-b').customElementRegistry, null); 62 assert_equals(container.querySelector('c-d').customElementRegistry, null); 63 assert_equals(container.querySelector('e-f').customElementRegistry, null); 64 }, 'Descendants of an element with customelementregistry should use null registry'); 65 66 test((test) => { 67 const [doc, win] = makeIframe(test); 68 69 const upgradeCandidate = doc.createElement('a-b'); 70 assert_equals(upgradeCandidate.customElementRegistry, win.customElements); 71 72 doc.body.setHTMLUnsafe('<a-b></a-b>'); 73 assert_equals(doc.querySelector('a-b').customElementRegistry, win.customElements); 74 75 assert_equals(upgradeCandidate.customElementRegistry, win.customElements); 76 let customElementRegistryDuringConstruction = null; 77 win.customElements.define('a-b', class ABElement extends win.HTMLElement { 78 constructor() { 79 super(); 80 this.setAttribute('customelementregistry', ''); 81 customElementRegistryDuringConstruction = this.customElementRegistry; 82 this.removeAttribute('customelementregistry', ''); 83 } 84 }); 85 assert_equals(customElementRegistryDuringConstruction, win.customElements); 86 assert_equals(doc.querySelector('a-b').customElementRegistry, win.customElements); 87 88 const element = doc.createElement('a-b'); 89 assert_equals(customElementRegistryDuringConstruction, win.customElements); 90 assert_equals(element.customElementRegistry, win.customElements); 91 92 doc.body.setHTMLUnsafe('<a-b></a-b>'); 93 assert_equals(customElementRegistryDuringConstruction, win.customElements); 94 assert_equals(element.customElementRegistry, win.customElements); 95 96 win.customElements.upgrade(upgradeCandidate); 97 assert_equals(customElementRegistryDuringConstruction, win.customElements); 98 assert_equals(element.customElementRegistry, win.customElements); 99 }, `Setting customelementregistry content attribute during constructor should not make it use null registry`); 100 101 </script> 102 </body> 103 </html>