Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test has a WPT meta file that expects 3 subtest issues.
- This WPT test may be referenced by the following Test IDs:
- /custom-elements/revamped-scoped-registry/Element-customElements-exceptions.tentative.html - WPT Dashboard Interop Dashboard
<!DOCTYPE html>
<html>
<head>
<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<div id="host-window"><template shadowrootmode="open"><a-b></a-b></template></div>
<div id="host-null"><template shadowrootmode="open" shadowrootcustomelements=""><a-b></a-b></template></div>
<script>
setup({allow_uncaught_exception : true});
test(() => {
const registry = new CustomElementRegistry;
registry.define('constructor-throws-exception', class extends HTMLElement { constructor() { super(); throw TypeError; } });
registry.define('constructor-returns-different-element', class extends HTMLElement { constructor() { super(); return document.createElement('span'); } });
assert_equals(document.createElement('constructor-throws-exception', {customElements: registry}).customElements, registry);
assert_equals(document.createElement('constructor-returns-different-element', {customElements: registry}).customElements, registry);
}, 'customElements on a failed custom element created by calling createElement on CustomElementRegistry should return the registry');
test(() => {
const registry = new CustomElementRegistry;
registry.define('constructor-throws-exception', class extends HTMLElement { constructor() { super(); throw TypeError; } });
registry.define('constructor-returns-different-element', class extends HTMLElement { constructor() { super(); return document.createElement('span'); } });
const container = document.createElement('div', {customElements: registry});
container.innerHTML = '<constructor-throws-exception></constructor-throws-exception><constructor-returns-different-element></constructor-returns-different-element>';
assert_equals(container.querySelector('constructor-throws-exception').customElements, registry);
assert_equals(container.querySelector('constructor-returns-different-element').customElements, registry);
}, 'customElements on a failed custom element created by setting innerHTML should return the associated scoped registry');
function insideDeclarativeShadowTreeWithNullRegistry(test, script, markup, check) {
const frame = document.body.appendChild(document.createElement('iframe'));
test.add_cleanup(() => frame.remove());
frame.contentDocument.open();
frame.contentDocument.write(`<!DOCTYPE html><html><body><div id="host"><template shadowrootmode="open" shadowrootcustomelements><script>`
+ script + `</` + 'script>' + markup + '</template></div></body></html>');
frame.contentDocument.close();
check(frame.contentDocument, frame.contentWindow);
}
test((t) => {
insideDeclarativeShadowTreeWithNullRegistry(t, `
window.registry = new CustomElementRegistry;
registry.initialize(host.shadowRoot);
registry.define('constructor-throws-exception', class extends HTMLElement { constructor() { super(); throw TypeError; } });
registry.define('constructor-returns-different-element', class extends HTMLElement { constructor() { super(); return document.createElement('span'); } });`,
'<constructor-throws-exception></constructor-throws-exception><constructor-returns-different-element></constructor-returns-different-element>',
(doc, win) => {
assert_equals(win.host.shadowRoot.querySelector('constructor-throws-exception').customElements, win.registry);
assert_equals(win.host.shadowRoot.querySelector('constructor-returns-different-element').customElements, win.registry);
});
}, 'customElements on a failed custom element created by parser should return the specified custom regsitry');
</script>
</body>
</html>