tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>