summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html')
-rw-r--r--testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html120
1 files changed, 120 insertions, 0 deletions
diff --git a/testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html b/testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html
new file mode 100644
index 0000000000..6c927b1bd7
--- /dev/null
+++ b/testing/web-platform/tests/shadow-dom/declarative/script-access.tentative.html
@@ -0,0 +1,120 @@
+<!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) {
+ document.querySelectorAll('.host').forEach(n => {
+ templatesSeen++;
+ n.className = 'done';
+ switch (n.id) {
+ case 'openhost':
+ case 'closedhost':
+ assert_equals(n.querySelector('template'),null,'No template ever for streaming declarative Shadow DOM');
+ assert_equals(n.innerHTML, "", 'Declarative shadow host innerHTML should be empty - all content is inside shadow');
+ break;
+ case 'noroot':
+ const template = n.querySelector('template');
+ assert_true(!!template,'Regular template should still be present');
+ // Make sure adding 'shadowrootmode' attribute doesn't trigger a shadow root,
+ // even if added before parsing completes.
+ template.setAttribute('shadowrootmode','open');
+ assert_not_equals(template.content, null, 'Regular template should have content, even after adding shadowrootmode attribute');
+ assert_not_equals(template.innerHTML, "", 'Regular template should have innerHTML, even after adding shadowrootmode attribute');
+ assert_not_equals(template.getInnerHTML({includeShadowRoots: true}), "", 'Regular template should have getInnerHTML(), even after adding shadowrootmode 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 class=host><template shadowrootmode=open>
+ <slot></slot>
+ <!-- Ensure observer runs at this point (https://github.com/web-platform-tests/wpt/issues/35393) -->
+ <script> // some content, which shouldn't be necessary </script>
+</template></div>
+
+<div id=closedhost class=host><template shadowrootmode=closed>
+ <slot></slot>
+ <!-- Ensure observer runs at this point (https://github.com/web-platform-tests/wpt/issues/35393) -->
+ <script> // some content, which shouldn't be necessary </script>
+</template></div>
+
+<div id=noroot class=host><template>
+ <slot></slot>
+ <!-- Ensure observer runs at this point (https://github.com/web-platform-tests/wpt/issues/35393) -->
+ <script> // some content, which shouldn't be necessary </script>
+</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 template nodes');
+ assert_true(!!host.shadowRoot, 'Shadow root should exist');
+
+ // Closed shadow root
+ host = document.querySelector('#closedhost');
+ assert_equals(host.querySelector('template'), null, 'No template nodes');
+ 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 for invalid shadowrootmode value');
+ assert_true(!host.shadowRoot, 'No shadow root');
+},'Streaming Declarative Shadow DOM: template .content() should be null');
+</script>
+
+
+<script>
+let synchronous_events_received = new Set();
+function synchronousHandler(e) {
+ synchronous_events_received.add(e.type);
+}
+const sync_events = ["DOMAttrModified","DOMAttributeNameChanged","DOMCharacterDataModified",
+ "DOMElementNameChanged","DOMNodeInserted","DOMNodeInsertedIntoDocument","DOMNodeRemoved",
+ "DOMNodeRemovedFromDocument","DOMSubtreeModified"];
+function addSyncObserver(evt) {
+ window.addEventListener(evt, synchronousHandler, true);
+}
+function removeSyncObserver(evt) {
+ window.removeEventListener(evt, synchronousHandler, true);
+}
+sync_events.forEach(e => addSyncObserver(e));
+</script>
+
+<div id=synchost1>
+ <template shadowrootmode=open>
+ <div class=foo>content</div>
+ <slot></slot>
+ </template>
+</div>
+
+<div id=synchost2>
+ <template shadowrootmode=closed>
+ <div class=foo>content</div>
+ <slot></slot>
+ </template>
+</div>
+
+<script>
+test(t => {
+ t.add_cleanup(function() { sync_events.forEach(e => removeSyncObserver(e)) });
+ assert_true(!synchronous_events_received.size,`Synchronous mutation events fired: ${Array.from(synchronous_events_received)}`);
+},'Synchronous mutation events should not be fired during streaming declarative shadow DOM parsing');
+</script>