File: CustomElementRegistry-upgrade.html

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (114 lines) | stat: -rw-r--r-- 4,622 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<!DOCTYPE html>
<html>
<head>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<link rel="help" href="https://github.com/whatwg/html/issues/10854">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<some-host id="host">
    <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry>
        <a-b>
            <template shadowrootmode="closed" shadowrootclonable="true" shadowrootcustomelementregistry>
                <c-d>
                    <template shadowrootmode="closed" shadowrootclonable="true">
                        <a-b></a-b>
                    </template>
                </c-d>
            </template>
        </a-b>
    </template>
</some-host>
<script>

customElements.define('some-host', class SomeHost extends HTMLElement {
    elementInternals;

    constructor() {
        super();
        this.elementInternals = this.attachInternals();
    }
});
customElements.define('a-b', class GlobalABElement extends HTMLElement { });
customElements.define('c-d', class GlobalCDElement extends HTMLElement { });

test(() => {
    assert_equals(typeof(window.customElements.upgrade), 'function');
    assert_equals(typeof((new CustomElementRegistry).upgrade), 'function');
}, 'upgrade is a function on both global and scoped CustomElementRegistry');

test(() => {
    const registry = new CustomElementRegistry;
    registry.define('a-b', class ABElement extends HTMLElement { });

    const clone = host.cloneNode(true);
    registry.upgrade(clone.elementInternals.shadowRoot);
    assert_equals(clone.elementInternals.shadowRoot.querySelector('a-b').__proto__.constructor.name, 'HTMLElement');
}, 'upgrade is a no-op when called on a shadow root with no association');

test(() => {
    const registry = new CustomElementRegistry;
    registry.define('a-b', class ABElement extends HTMLElement {
        elementInternals;

        constructor() {
            super();
            this.elementInternals = this.attachInternals();
        }
    });

    const clone = host.cloneNode(true);
    registry.initialize(clone.elementInternals.shadowRoot);
    registry.upgrade(clone.elementInternals.shadowRoot);
    const abElement = clone.elementInternals.shadowRoot.querySelector('a-b');
    assert_equals(abElement.__proto__.constructor.name, 'ABElement');
    assert_equals(abElement.elementInternals.shadowRoot.customElementRegistry, null);
    const cdElement = abElement.elementInternals.shadowRoot.querySelector('c-d');
    assert_equals(cdElement.__proto__.constructor.name, 'HTMLElement');
    assert_equals(cdElement.customElementRegistry, null);
}, 'upgrade should upgrade a candidate element when called on a shadow root with an association');

test(() => {
    const registry = new CustomElementRegistry;
    registry.define('a-b', class ScopedABElement extends HTMLElement {
        elementInternals;

        constructor() {
            super();
            this.elementInternals = this.attachInternals();
        }
    });

    const clone = host.cloneNode(true);
    registry.initialize(clone.elementInternals.shadowRoot);
    registry.upgrade(clone.elementInternals.shadowRoot);
    const abElement = clone.elementInternals.shadowRoot.querySelector('a-b');
    assert_equals(abElement.__proto__.constructor.name, 'ScopedABElement');
    registry.initialize(abElement.elementInternals.shadowRoot);
    assert_equals(abElement.elementInternals.shadowRoot.customElementRegistry, registry);
    const cdElement = abElement.elementInternals.shadowRoot.querySelector('c-d');
    assert_equals(cdElement.customElementRegistry, registry);

    registry.define('c-d', class ScopedCDElement extends HTMLElement {
        elementInternals;

        constructor() {
            super();
            this.elementInternals = this.attachInternals();
        }
    });
    assert_equals(cdElement.__proto__.constructor.name, 'HTMLElement');
    registry.upgrade(abElement.elementInternals.shadowRoot);
    assert_equals(cdElement.__proto__.constructor.name, 'ScopedCDElement');
    assert_equals(cdElement.customElementRegistry, registry);

    assert_equals(cdElement.elementInternals.shadowRoot.customElementRegistry, window.customElements);
    const innerAB = cdElement.elementInternals.shadowRoot.querySelector('a-b');
    assert_equals(innerAB.customElementRegistry, window.customElements);
    assert_equals(innerAB.__proto__.constructor.name, 'GlobalABElement');
}, 'upgrade should not upgrade a candidate element not associated with a registry');

</script>
</body>
</html>