summaryrefslogtreecommitdiffstats
path: root/layout/inspector/tests/test_bug522601-shadow.xhtml
diff options
context:
space:
mode:
Diffstat (limited to 'layout/inspector/tests/test_bug522601-shadow.xhtml')
-rw-r--r--layout/inspector/tests/test_bug522601-shadow.xhtml273
1 files changed, 273 insertions, 0 deletions
diff --git a/layout/inspector/tests/test_bug522601-shadow.xhtml b/layout/inspector/tests/test_bug522601-shadow.xhtml
new file mode 100644
index 0000000000..d790527791
--- /dev/null
+++ b/layout/inspector/tests/test_bug522601-shadow.xhtml
@@ -0,0 +1,273 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<!--
+https://bugzilla.mozilla.org/show_bug.cgi?id=522601
+-->
+<head>
+ <title>Test for Bug 522601</title>
+ <script src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<template id="template"><div><slot/></div><slot name="foo"/></template>
+<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=522601">Mozilla Bug 522601</a>
+<custom-element id="display">
+ <span slot="foo" id="s">This is some text</span>
+ More text
+ <b id="b">Even more <i id="i1">Italic</i>text<i id="i2">And more italic</i></b></custom-element>
+<div id="content" style="display: none">
+</div>
+<div id="subdoc">
+ <iframe id="frame1" src="file_bug522601.html">frame text</iframe>
+</div>
+<pre id="test">
+<script>
+<![CDATA[
+
+/** Test for Bug 522601 **/
+SimpleTest.waitForExplicitFinish();
+
+customElements.define("custom-element", class extends HTMLElement {
+ constructor() {
+ super();
+ const template = document.getElementById("template");
+ const shadowRoot = this.attachShadow({mode: "open"})
+ .appendChild(template.content.cloneNode(true));
+ }
+});
+
+function testFunc(walker, func, expectedNode, str) {
+ var oldCurrent = SpecialPowers.unwrap(walker.currentNode);
+ var newNode = SpecialPowers.unwrap(walker[func]());
+ is(newNode, expectedNode, "Unexpected node after " + str);
+ is(SpecialPowers.unwrap(walker.currentNode), newNode ? newNode : oldCurrent,
+ "Unexpected current node after " + str);
+}
+
+addLoadEvent(function() {
+ var walkerSubDocument =
+ SpecialPowers.Cc["@mozilla.org/inspector/deep-tree-walker;1"]
+ .createInstance(SpecialPowers.Ci.inIDeepTreeWalker);
+ walkerSubDocument.showAnonymousContent = false;
+ walkerSubDocument.showSubDocuments = true;
+ walkerSubDocument.init($("frame1"));
+
+ is(SpecialPowers.unwrap(walkerSubDocument.currentNode), $("frame1"), "Unexpected sub-doc root");
+ testFunc(walkerSubDocument, "firstChild", $("frame1").contentDocument.doctype,
+ "step to sub documents doctype");
+ testFunc(walkerSubDocument, "nextSibling", $("frame1").contentDocument.documentElement,
+ "step to sub documents documentElement");
+
+ walkerSubDocument =
+ SpecialPowers.Cc["@mozilla.org/inspector/deep-tree-walker;1"]
+ .createInstance(SpecialPowers.Ci.inIDeepTreeWalker);
+ walkerSubDocument.showAnonymousContent = false;
+ walkerSubDocument.showSubDocuments = true;
+ walkerSubDocument.showDocumentsAsNodes = true;
+ walkerSubDocument.init($("frame1"));
+
+ is(SpecialPowers.unwrap(walkerSubDocument.currentNode), $("frame1"), "Unexpected sub-doc root");
+ testFunc(walkerSubDocument, "firstChild", $("frame1").contentDocument,
+ "step to sub document");
+ testFunc(walkerSubDocument, "firstChild", $("frame1").contentDocument.doctype,
+ "step to sub documents doctype");
+ testFunc(walkerSubDocument, "nextSibling", $("frame1").contentDocument.documentElement,
+ "step to sub documents documentElement");
+
+ walkerSubDocument.currentNode = $("frame1").contentDocument;
+ is(SpecialPowers.unwrap(walkerSubDocument.currentNode), $("frame1").contentDocument,
+ "setting currentNode to sub document");
+ testFunc(walkerSubDocument, "nextSibling", null,
+ "nextSibling for sub document is null");
+
+ var walkerFrameChild =
+ SpecialPowers.Cc["@mozilla.org/inspector/deep-tree-walker;1"]
+ .createInstance(SpecialPowers.Ci.inIDeepTreeWalker);
+ walkerFrameChild.showAnonymousContent = false;
+ walkerFrameChild.showSubDocuments = false;
+ walkerFrameChild.init($("frame1"));
+
+ is(SpecialPowers.unwrap(walkerFrameChild.currentNode), $("frame1"), "Unexpected sub-doc root");
+ testFunc(walkerFrameChild, "firstChild", $("frame1").firstChild,
+ "step to frames child");
+
+ var walkerNonAnon =
+ SpecialPowers.Cc["@mozilla.org/inspector/deep-tree-walker;1"]
+ .createInstance(SpecialPowers.Ci.inIDeepTreeWalker);
+ walkerNonAnon.init($("display"));
+ walkerNonAnon.showAnonymousContent = false;
+
+ is(SpecialPowers.unwrap(walkerNonAnon.currentNode), $("display"), "Unexpected non-anon root");
+ testFunc(walkerNonAnon, "nextNode", $("s").previousSibling,
+ "step to some text");
+ testFunc(walkerNonAnon, "nextNode", $("s"), "step to span");
+ testFunc(walkerNonAnon, "nextNode", $("s").firstChild, "step to span text");
+ testFunc(walkerNonAnon, "nextNode", $("s").nextSibling, "step to more text");
+ testFunc(walkerNonAnon, "nextNode", $("b"), "step to bold");
+ testFunc(walkerNonAnon, "nextNode", $("b").firstChild, "step to bold text");
+ testFunc(walkerNonAnon, "nextNode", $("i1"), "step to first italic");
+ testFunc(walkerNonAnon, "nextNode", $("i1").firstChild,
+ "step to first italic text");
+ testFunc(walkerNonAnon, "nextNode", $("i1").nextSibling,
+ "step to more bold text");
+ testFunc(walkerNonAnon, "nextNode", $("i2"), "step to second italic");
+ testFunc(walkerNonAnon, "nextNode", $("i2").firstChild,
+ "step to second italic text");
+ testFunc(walkerNonAnon, "nextNode", null, "step past end");
+ testFunc(walkerNonAnon, "parentNode", $("i2"), "step up to second italic");
+ testFunc(walkerNonAnon, "parentNode", $("b"), "step up to bold");
+ testFunc(walkerNonAnon, "nextNode", $("b").firstChild, "step to bold text again");
+ testFunc(walkerNonAnon, "parentNode", $("b"), "step up to bold again");
+ testFunc(walkerNonAnon, "parentNode", $("display"), "step up to display");
+ testFunc(walkerNonAnon, "parentNode", null, "step up past root");
+ testFunc(walkerNonAnon, "firstChild", $("s").previousSibling,
+ "step firstChild to display first child");
+ testFunc(walkerNonAnon, "nextSibling", $("s"),
+ "step nextSibling to span");
+ testFunc(walkerNonAnon, "nextSibling", $("s").nextSibling,
+ "step nextSibling to more text");
+ testFunc(walkerNonAnon, "nextSibling", $("b"), "step nextSibling to bold");
+ testFunc(walkerNonAnon, "nextSibling", null, "step nextSibling past end");
+ testFunc(walkerNonAnon, "previousSibling", $("s").nextSibling,
+ "step previousSibling to more text");
+ testFunc(walkerNonAnon, "previousSibling", $("s"),
+ "step previousSibling to span");
+ testFunc(walkerNonAnon, "previousSibling", $("s").previousSibling,
+ "step previousSibling to display first child");
+ testFunc(walkerNonAnon, "previousSibling", null,
+ "step previousSibling past end");
+
+ // Move the walker over to the end
+ while (walkerNonAnon.nextNode()) { /* do nothing */ }
+
+ is(SpecialPowers.unwrap(walkerNonAnon.currentNode), $("i2").firstChild, "unexpected last node");
+ testFunc(walkerNonAnon, "previousNode", $("i2"), "step back to second italic");
+ testFunc(walkerNonAnon, "previousNode", $("i1").nextSibling,
+ "step back to more bold text");
+ testFunc(walkerNonAnon, "previousNode", $("i1").firstChild,
+ "step back to first italic text");
+ testFunc(walkerNonAnon, "previousNode", $("i1"), "step back to first italic");
+ testFunc(walkerNonAnon, "previousNode", $("b").firstChild,
+ "step back to bold text");
+ testFunc(walkerNonAnon, "previousNode", $("b"), "step back to bold");
+ testFunc(walkerNonAnon, "previousNode", $("s").nextSibling, "step back to more text");
+ testFunc(walkerNonAnon, "previousNode", $("s").firstChild, "step back to span text");
+ testFunc(walkerNonAnon, "previousNode", $("s"), "step back to span");
+ testFunc(walkerNonAnon, "previousNode", $("s").previousSibling,
+ "step back to some text");
+ testFunc(walkerNonAnon, "previousNode", $("display"),
+ "step back to root");
+ testFunc(walkerNonAnon, "previousNode", null,
+ "step back past root");
+
+ walkerNonAnon.currentNode = $("s");
+ is(SpecialPowers.unwrap(walkerNonAnon.currentNode), SpecialPowers.unwrap($("s")),
+ "Setting currentNode to span");
+
+ var anonDiv = $("display").shadowRoot.children[0];
+
+ try {
+ walkerNonAnon.currentNode = anonDiv;
+ // See bug 1586916.
+ todo(false, "Setting current node to a node that is otherwise unreachable," +
+ " with the current visibility settings should throw");
+ } catch(e) {
+ ok(e.toString().indexOf("NS_ERROR_ILLEGAL_VALUE") > -1, "Setting current node to an anon node should throw" +
+ " NS_ERROR_ILLEGAL_VALUE if showAnonymousContent is set to false");
+ is(SpecialPowers.unwrap(walkerNonAnon.currentNode), SpecialPowers.unwrap($("s")),
+ "An unsuccessfull set currentNode should leave behind the old state");
+ testFunc(walkerNonAnon, "nextSibling", $("s").nextSibling, "nextSibling after set currentNode");
+ }
+
+ var slot = $("display").shadowRoot.querySelectorAll("slot")[0];
+ var namedSlot = $("display").shadowRoot.querySelectorAll("slot")[1];
+
+ var walkerAnon =
+ SpecialPowers.Cc["@mozilla.org/inspector/deep-tree-walker;1"]
+ .createInstance(SpecialPowers.Ci.inIDeepTreeWalker);
+ walkerAnon.showAnonymousContent = true;
+ walkerAnon.init($("display"));
+
+ is(SpecialPowers.unwrap(walkerAnon.currentNode), $("display"), "Unexpected anon root");
+ testFunc(walkerAnon, "nextNode", $("display").shadowRoot,
+ "step to shadow root");
+ testFunc(walkerAnon, "nextNode", anonDiv,
+ "step to anonymous div");
+ testFunc(walkerAnon, "nextNode", slot, "step into slot");
+ testFunc(walkerAnon, "nextNode", namedSlot, "step into named slot");
+ testFunc(walkerAnon, "nextNode", $("s").previousSibling, "step to light dom text (out of shadow tree)");
+ testFunc(walkerAnon, "nextNode", $("s"), "step to span (anon)");
+ testFunc(walkerAnon, "nextNode", $("s").firstChild, "step to span text (anon)");
+ testFunc(walkerAnon, "nextNode", $("s").nextSibling, "step to more text (anon)");
+ testFunc(walkerAnon, "nextNode", $("b"), "step to bold (anon)");
+ testFunc(walkerAnon, "nextNode", $("b").firstChild, "step to bold text (anon)");
+ testFunc(walkerAnon, "nextNode", $("i1"), "step to first italic (anon)");
+ testFunc(walkerAnon, "nextNode", $("i1").firstChild,
+ "step to first italic text (anon)");
+ testFunc(walkerAnon, "nextNode", $("i1").nextSibling,
+ "step to more bold text (anon)");
+ testFunc(walkerAnon, "nextNode", $("i2"), "step to second italic (anon)");
+ testFunc(walkerAnon, "nextNode", $("i2").firstChild,
+ "step to second italic text (anon)");
+ testFunc(walkerAnon, "nextNode", null, "step past end (anon)");
+ testFunc(walkerAnon, "parentNode", $("i2"), "step up to italic (anon)");
+ testFunc(walkerAnon, "parentNode", $("b"), "step up to bold (anon)");
+ testFunc(walkerAnon, "parentNode", $("display"), "step up to display (anon)");
+ testFunc(walkerAnon, "nextNode", $("display").shadowRoot, "step to shadow root again");
+ testFunc(walkerAnon, "parentNode", $("display"),
+ "step up to display again (anon)")
+ testFunc(walkerAnon, "parentNode", null, "step up past root (anon)");
+ testFunc(walkerAnon, "firstChild", $("display").shadowRoot,
+ "step firstChild to display first child (anon)");
+ testFunc(walkerAnon, "nextSibling", $("s").previousSibling,
+ "step nextSibling text (anon)");
+ testFunc(walkerAnon, "nextSibling", $("s"),
+ "step nextSibling span (anon)");
+ testFunc(walkerAnon, "nextSibling", $("s").nextSibling,
+ "step nextSibling more text (anon)");
+ testFunc(walkerAnon, "nextSibling", $("b"),
+ "step nextSibling bold (anon)");
+ testFunc(walkerAnon, "nextSibling", null, "step nextSibling past end (anon)");
+ testFunc(walkerAnon, "previousSibling", $("s").nextSibling,
+ "step previousSibling to more text");
+ testFunc(walkerAnon, "previousSibling", $("s"),
+ "step previousSibling to span");
+ testFunc(walkerAnon, "previousSibling", $("s").previousSibling,
+ "step previousSibling to prev text");
+ testFunc(walkerAnon, "previousSibling", $("display").shadowRoot,
+ "step shadowRoot");
+ testFunc(walkerAnon, "previousSibling", null, "step previousSibling past end (anon)");
+
+ // Move the walker over to the end
+ while (walkerAnon.nextNode()) { /* do nothing */ }
+
+ testFunc(walkerAnon, "previousNode", $("i2"), "step back to second italic (anon)");
+ testFunc(walkerAnon, "previousNode", $("i1").nextSibling,
+ "step back to more bold text (anon)");
+ testFunc(walkerAnon, "previousNode", $("i1").firstChild,
+ "step back to first italic text (anon)");
+ testFunc(walkerAnon, "previousNode", $("i1"), "step back to first italic (anon)");
+ testFunc(walkerAnon, "previousNode", $("b").firstChild, "step back to bold text (anon)");
+ testFunc(walkerAnon, "previousNode", $("b"), "step back to bold (anon)");
+ testFunc(walkerAnon, "previousNode", $("s").nextSibling, "step back to more text (anon)");
+ testFunc(walkerAnon, "previousNode", $("s").firstChild,
+ "step back to span text (anon)");
+ testFunc(walkerAnon, "previousNode", $("s"),
+ "step back to span (anon)");
+ testFunc(walkerAnon, "previousNode", $("s").previousSibling,
+ "step back to some text (anon)");
+ testFunc(walkerAnon, "previousNode", namedSlot, "step back to named slot");
+ testFunc(walkerAnon, "previousNode", slot, "step back to slot");
+ testFunc(walkerAnon, "previousNode", anonDiv,
+ "step back to anonymous div");
+ testFunc(walkerAnon, "previousNode", $("display").shadowRoot, "step back to shadow root (anon)");
+ testFunc(walkerAnon, "previousNode", $("display"), "step back to root (anon)");
+ testFunc(walkerAnon, "previousNode", null, "step back past root (anon)");
+
+ SimpleTest.finish();
+});
+
+]]>
+</script>
+</pre>
+</body>
+</html>