blob: 66d4b948cbbaec758e70f70160630ecf9aa08e36 [file] [log] [blame]
<!DOCTYPE html>
<title>Declarative Shadow DOM</title>
<link rel='author' href='mailto:masonf@chromium.org'>
<link rel='help' href='https://github.com/whatwg/dom/issues/831'>
<script src='/resources/testharness.js'></script>
<script src='/resources/testharnessreport.js'></script>
<body>
<script>
let templatesSeen = 0;
function myObserver(mutationsList, observer) {
for (let mutation of mutationsList) {
for (let n of mutation.addedNodes) {
if (n.localName === 'template') {
templatesSeen++;
switch (mutation.target.id) {
case 'openhost':
case 'closedhost':
const shadowroot = n.getAttribute('shadowroot');
assert_in_array(shadowroot, ['open','closed'], 'Declarative template should have shadowroot attribute');
assert_equals(n.content, null, 'Declarative template content should be null');
assert_equals(n.innerHTML, "", 'Declarative template innerHTML should be empty');
assert_equals(n.getInnerHTML({includeShadowRoots: true}), "", 'Declarative template getInnerHTML() should be empty');
// Make sure removing the shadowroot attribute doesn't affect things.
n.removeAttribute('shadowroot');
assert_equals(n.content, null, 'Declarative template content should *still* be null');
assert_equals(n.innerHTML, "", 'Declarative template innerHTML should *still* be empty');
assert_equals(n.getInnerHTML({includeShadowRoots: true}), "", 'Declarative template getInnerHTML() should *still* be empty');
// Try cloning the in-progress declarative template - shouldn't work.
const clone = n.cloneNode(true);
assert_equals(clone.children.length,0,'Clone should not contain anything');
assert_equals(clone.content.children.length,0,'Clone should not contain anything');
break;
case 'noroot':
// Make sure adding 'shadowroot' attribute doesn't trigger a shadow root,
// even if added before parsing completes.
n.setAttribute('shadowroot','open');
assert_not_equals(n.content, null, 'Regular template should have content, even after adding shadowroot attribute');
assert_not_equals(n.innerHTML, "", 'Regular template should have innerHTML, even after adding shadowroot attribute');
assert_not_equals(n.getInnerHTML({includeShadowRoots: true}), "", 'Regular template should have getInnerHTML(), even after adding shadowroot attribute');
break;
default:
assert_unreached('Unrecognized template');
}
}
}
}
}
const observer = new MutationObserver(myObserver);
observer.observe(document.body, { childList: true, subtree: true });
assert_equals(templatesSeen, 0, 'No mutations yet');
</script>
<div id=openhost>
<template shadowroot=open>
<slot></slot>
</template>
</div>
<div id=closedhost>
<template shadowroot=closed>
<slot></slot>
</template>
</div>
<div id=noroot>
<template>
<slot></slot>
</template>
</div>
<script>
test(t => {
t.add_cleanup(function() { observer.disconnect(); });
assert_equals(templatesSeen, 3);
// Open shadow root
let host = document.querySelector('#openhost');
assert_equals(host.querySelector('template'), null, 'No leftover template node');
assert_true(!!host.shadowRoot, 'Shadow root should exist');
// Closed shadow root
host = document.querySelector('#closedhost');
assert_equals(host.querySelector('template'), null, 'No leftover template node');
assert_true(!host.shadowRoot, 'Closed shadow root (can\'t detect)');
// No shadow root
host = document.querySelector('#noroot');
assert_true(!!host.querySelector('template'), 'Template node still present');
assert_true(!host.shadowRoot, 'No shadow root');
},'Declarative Shadow DOM: template .content() should be null');
</script>
</body>