Files
sousa-gecko/testing/web-platform/tests/custom-elements/registries/CustomElementRegistry-initialize.html
T
Yeonghan Kim cdefa2905b Bug 2012851 [wpt PR 57370] - Add missing WPT coverage for CustomElementRegistry.initialize(), a=testonly
Automatic update from web-platform-tests
Add missing WPT coverage for CustomElementRegistry.initialize()

There are bugs that are not currently caught by the existing WPT tests
for initialize(). One example is a bug like [1], which does not occur in
Chromium but does occur in WebKit. Since there may be other similar
cases, this change adds missing WPT coverage based on [2].

[1] https://bugs.webkit.org/show_bug.cgi?id=299299
[2] https://html.spec.whatwg.org/multipage/custom-elements.html#dom-customelementregistry-initialize

Bug: 475579177
Change-Id: Ia503db85844b9a08182275a96fe350b07ef08306
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7487391
Reviewed-by: Mason Freed <masonf@chromium.org>
Reviewed-by: Jayson Chen <jaysonchen@microsoft.com>
Commit-Queue: YeongHan Kim <soosungp33@gmail.com>
Cr-Commit-Position: refs/heads/main@{#1575636}

--

wpt-commits: 7cc53e677dfae85f4af017ed0d7d59935bdd0947
wpt-pr: 57370
2026-02-03 10:07:38 +00:00

194 lines
9.5 KiB
HTML

<!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>
<div id="host">
<template shadowrootmode="open" shadowrootclonable="true" shadowrootcustomelementregistry>
<a-b>
<template shadowrootmode="open" shadowrootclonable="true" shadowrootcustomelementregistry>
<c-d/><c-d>
</template>
</a-b>
<ef></ef>
</template>
</div>
<div id="host-with-registry">
<template shadowrootmode="open" shadowrootclonable="true">
<a-b></a-b>
<ef></ef>
</template>
</div>
<script>
test(() => {
const document = new Document();
assert_throws_dom("NotSupportedError", () => window.customElements.initialize(document));
}, 'initialize throws when the registry scoped is false and the root is the document.');
test(() => {
const document = new Document();
const registry = new CustomElementRegistry;
registry.initialize(document);
assert_throws_dom("NotSupportedError", () => window.customElements.initialize(document));
}, 'initialize throws when the registry scoped is false and the root document already has another registry');
test(() => {
assert_equals(typeof(window.customElements.initialize), 'function');
assert_equals(typeof((new CustomElementRegistry).initialize), 'function');
}, 'initialize is a function on both global and scoped CustomElementRegistry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
window.customElements.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, window.customElements);
}, 'initialize sets element.customElementRegistry to the global registry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
window.customElements.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('a-b').shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').shadowRoot.querySelector('c-d').customElementRegistry, null);
}, 'initialize does not set the registry of nested shadow tree to the global registry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
const registry = new CustomElementRegistry;
registry.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
}, 'initialize sets element.customElementRegistry to a scoped registry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
const registry = new CustomElementRegistry;
registry.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
window.customElements.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
}, 'initialize does not set descendants whose customElementRegistry already uses a different registry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
const registry = new CustomElementRegistry;
registry.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').shadowRoot.querySelector('c-d').customElementRegistry, null);
}, 'initialize does not set the registry of nested shadow tree to a scoped registry');
test(() => {
const clone = host.cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, null);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, null);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, null);
const registry = new CustomElementRegistry;
registry.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
document.body.appendChild(clone);
assert_equals(shadowRoot.customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, registry);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, registry);
}, 'initialize sets element.customElementRegistry permantently');
test(() => {
const clone = document.getElementById('host-with-registry').cloneNode(true);
const shadowRoot = clone.shadowRoot;
assert_equals(shadowRoot.customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, window.customElements);
const registry = new CustomElementRegistry;
registry.initialize(shadowRoot);
assert_equals(shadowRoot.customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('a-b').customElementRegistry, window.customElements);
assert_equals(shadowRoot.querySelector('ef').customElementRegistry, window.customElements);
}, 'initialize is no-op on a subtree with a non-null registry');
test(() => {
const doc = new Document();
assert_equals(doc.customElementRegistry, null);
const registry = new CustomElementRegistry();
registry.initialize(doc);
assert_equals(doc.customElementRegistry, registry);
}, 'initialize works on Document');
test(() => {
const doc = new Document();
const df = doc.createDocumentFragment();
const dummy = doc.createElement("dummy");
df.append(dummy);
assert_equals(dummy.customElementRegistry, null);
assert_equals(df.customElementRegistry, undefined);
const registry = new CustomElementRegistry();
registry.initialize(df);
assert_equals(dummy.customElementRegistry, registry);
assert_equals(df.customElementRegistry, undefined);
}, 'initialize works on DocumentFragment');
test(() => {
const shadowRoot = document.getElementById('host').cloneNode(true).shadowRoot;
const ab = shadowRoot.querySelector('a-b');
const ef = shadowRoot.querySelector('ef');
const registry = new CustomElementRegistry();
ab.innerHTML = '<dummy></dummy><div></div>';
registry.initialize(ab);
assert_equals(ab.customElementRegistry, registry);
assert_equals(ab.firstElementChild.customElementRegistry, registry);
assert_equals(ab.lastElementChild.customElementRegistry, registry);
ef.innerHTML = '<dummy></dummy><div></div>';
registry.initialize(ef);
assert_equals(ef.customElementRegistry, registry);
assert_equals(ef.firstElementChild.customElementRegistry, registry);
assert_equals(ef.lastElementChild.customElementRegistry, registry);
registry.initialize(shadowRoot);
assert_equals(ab.customElementRegistry, registry);
assert_equals(ab.firstElementChild.customElementRegistry, registry);
assert_equals(ab.lastElementChild.customElementRegistry, registry);
assert_equals(ef.customElementRegistry, registry);
assert_equals(ef.firstElementChild.customElementRegistry, registry);
assert_equals(ef.lastElementChild.customElementRegistry, registry);
}, 'initialize sets registry on shadow root descendants with no registry');
</script>
</body>
</html>