| <!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> |