Files
ladybird/Tests/LibWeb/Text/input/wpt-import/custom-elements/registries/element-mutation.html
Sam Atkins fe3c6a1f9f Tests: Import WPT custom-elements/registries tests
Includes reimporting the test we already had, which has changed
significantly.

Most of these fail, but importing them now to track progress.
2026-03-27 19:49:55 +00:00

94 lines
4.2 KiB
HTML

<!DOCTYPE html>
<title>Tests the registry assignment during element mutation</title>
<meta name="author" title="Jayson Chen" href="mailto:jaysonchen@microsoft.com"></meta>
<link rel="help" href="https://wicg.github.io/webcomponents/proposals/Scoped-Custom-Element-Registries">
<link rel="help" href="https://github.com/WICG/webcomponents/issues/923">
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<body>
<div id="host">
<div id="shadow-host-1">
<template shadowrootmode="open" shadowrootclonable="true" shadowrootcustomelementregistry>
<div id="shadow-host-1-child"></div>
</template>
</div>
<div id="shadow-host-2">
<template shadowrootmode="open" shadowrootclonable="true" shadowrootcustomelementregistry>
<div id="shadow-host-2-child"></div>
</template>
</div>
</div>
<template id="template">
<div id="template-host-1">
<template shadowrootmode="open" shadowrootclonable><x-foo></x-foo></template>
</div>
<div id="template-host-2">
<template shadowrootmode="open" shadowrootclonable shadowrootcustomelementregistry><x-foo></x-foo></template>
</div>
</template>
<script>
function runTests(mutation, mutationName) {
test(() => {
const registry = new CustomElementRegistry;
const element = document.createElement('new-element');
assert_equals(element.customElementRegistry, window.customElements);
mutation(document.body, element);
const shadow = document.createElement('div').attachShadow({mode: 'open', customElementRegistry: registry})
mutation(shadow, element);
assert_not_equals(element.customElementRegistry, registry);
mutation(document.body, element);
assert_equals(element.customElementRegistry, window.customElements);
}, "An element with global registry should not change its registry when run " + mutationName + " into a shadow tree with scoped registry.")
test(() => {
const clone = host.cloneNode(true);
const shadowRoot1 = clone.querySelector('#shadow-host-1').shadowRoot;
const element = shadowRoot1.querySelector('#shadow-host-1-child');
const registry1 = new CustomElementRegistry;
registry1.initialize(shadowRoot1);
assert_equals(element.customElementRegistry, registry1);
mutation(document.querySelector('#host'), element);
assert_equals(element.customElementRegistry, registry1);
}, "An element with scoped registry should not change its registry when run " + mutationName + " out of the shadow tree.")
test(() => {
const clone = host.cloneNode(true);
const shadowRoot1 = clone.querySelector('#shadow-host-1').shadowRoot;
const shadowRoot2 = clone.querySelector('#shadow-host-2').shadowRoot;
const element = shadowRoot1.querySelector('#shadow-host-1-child');
const registry1 = new CustomElementRegistry;
const registry2 = new CustomElementRegistry;
registry1.initialize(shadowRoot1);
registry2.initialize(shadowRoot2);
assert_equals(element.customElementRegistry, registry1);
mutation(shadowRoot2, element);
assert_equals(element.customElementRegistry, registry1);
}, "An element with scoped registry should not change its registry when run " + mutationName + " into another shadow tree with different scoped registry.")
};
runTests(function (parent, child) { parent.append(child); }, "append");
runTests(function (parent, child) { parent.appendChild(child); }, "appendChild");
runTests(function (parent, child) { parent.prepend(child); }, "prepend");
test(() => {
customElements.define('x-foo', class extends HTMLElement {});
const template = document.getElementById('template');
document.body.append(template.content.cloneNode(true));
assert_equals(document.querySelector('#template-host-1').shadowRoot.querySelector('x-foo').customElementRegistry, customElements);
assert_equals(document.querySelector('#template-host-2').shadowRoot.querySelector('x-foo').customElementRegistry, null);
}, "Declarative shadow DOM with shadowrootcustomelementregistry attribute without registry initialized should remain null registry after adoption.")
</script>
</body>