Files
sousa-gecko/testing/web-platform/tests/custom-elements/registries/Element-customElementRegistry.html
T
Jayson Chen 86059eb769 Bug 2017400 [wpt PR 57840] - Ensure CE constructor has correct access to custom element registry, a=testonly
Automatic update from web-platform-tests
Ensure CE constructor has correct access to custom element registry

We set the custom element registry in the later stage of creating an
element, but turned out that would lead to Element::customElementRegistry
accessing the wrong registry if it was called in CE constructor. This
patch moves the registry setting a bit earlier.

Bug: 40826514
Change-Id: Ia36a3cce331eb4349529422c9d1618e211e0ddcf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7573055
Reviewed-by: Mason Freed <masonf@chromium.org>
Commit-Queue: Jayson Chen <jaysonchen@microsoft.com>
Cr-Commit-Position: refs/heads/main@{#1587436}

--

wpt-commits: 4f93fabcf4eeb7f55bff64143937be50e322fcbd
wpt-pr: 57840
2026-03-04 09:08:25 +00:00

105 lines
5.0 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-window"><template shadowrootmode="open" shadowrootclonable="true"><a-b></a-b></template></div>
<div id="host-null"><template shadowrootmode="open" shadowrootclonable="true" shadowrootcustomelementregistry=""><a-b></a-b></template></div>
<script>
test(() => {
assert_equals(document.createElement('div').customElementRegistry, window.customElements);
}, 'customElementRegistry on a newly constrcuted element should return window.customElements by default');
test(() => {
const sr = document.getElementById('host-window').shadowRoot;
const ab = sr.querySelector('a-b');
assert_equals(sr.customElementRegistry, window.customElements);
assert_equals(ab.customElementRegistry, window.customElements);
}, 'customElementRegistry on an element inside a declarative shadow DOM should return window.customElements by default');
test(() => {
const sr = document.getElementById('host-null').shadowRoot;
const ab = sr.querySelector('a-b');
assert_equals(sr.customElementRegistry, null);
assert_equals(ab.customElementRegistry, null);
}, 'customElementRegistry on an element inside a declarative shadow DOM with shadowrootcustomelementregistry should return null');
test(() => {
const clone = document.getElementById('host-null').cloneNode(true);
const sr = clone.shadowRoot;
const ab = sr.querySelector('a-b');
assert_equals(sr.customElementRegistry, null);
assert_equals(ab.customElementRegistry, null);
}, 'customElementRegistry on a clone of a declarative shadow tree with shadowrootcustomelementregistry should return null');
test((t) => {
const clone = document.getElementById('host-null').cloneNode(true);
const ab = clone.shadowRoot.querySelector('a-b');
document.body.appendChild(ab);
assert_equals(ab.customElementRegistry, null);
const frame = document.createElement('iframe');
t.add_cleanup(() => frame.remove());
document.body.appendChild(frame);
frame.contentDocument.body.append(ab);
assert_equals(ab.customElementRegistry, frame.contentWindow.customElements);
}, 'customElementRegistry on a clone of a declarative shadow tree with shadowrootcustomelementregistry should return the global registry after getting inserted into a document');
test(() => {
const sr = document.getElementById('host-null').shadowRoot;
const ab = sr.querySelector('a-b');
const registry = new CustomElementRegistry;
registry.initialize(sr);
assert_equals(sr.customElementRegistry, registry);
assert_equals(ab.customElementRegistry, registry);
}, 'customElementRegistry on an element inside a declarative shadow DOM with shadowrootcustomelementregistry should return the scoped registry after calling initialize');
test(() => {
const registry = new CustomElementRegistry;
element = document.createElement('div', {customElementRegistry: registry});
assert_equals(element.customElementRegistry, registry);
}, 'customElementRegistry on a builtin element created by calling createElement on CustomElementRegistry should return the registry');
test(() => {
const registry = new CustomElementRegistry;
element = document.createElement('non-existent', {customElementRegistry: registry});
assert_equals(element.customElementRegistry, registry);
}, 'customElementRegistry on an upgarde candidate created by calling createElement on CustomElementRegistry should return the registry');
test(() => {
const registry = new CustomElementRegistry;
element = document.createElement('nonexistent', {customElementRegistry: registry});
assert_equals(element.customElementRegistry, registry);
}, 'customElementRegistry on an unknown element created by calling createElement on CustomElementRegistry should return the registry');
test(() => {
const registry = new CustomElementRegistry;
registry.define('custom-element', class extends HTMLElement { })
element = document.createElement('custom-element', {customElementRegistry: registry});
assert_equals(element.customElementRegistry, registry);
}, 'customElementRegistry on a defined custom element created by calling createElement on CustomElementRegistry should return the registry');
test(() => {
const registry = new CustomElementRegistry;
let registryInConstructor = null;
registry.define('check-registry-in-constructor', class extends HTMLElement {
constructor() {
super();
registryInConstructor = this.customElementRegistry;
}
});
const element = document.createElement('check-registry-in-constructor', {customElementRegistry: registry});
assert_equals(registryInConstructor, registry);
assert_equals(element.customElementRegistry, registry);
}, 'customElementRegistry inside a custom element constructor should return the correct registry');
</script>
</body>
</html>