| |
1 <!DOCTYPE HTML> |
| |
2 <html> |
| |
3 <!-- |
| |
4 https://bugzilla.mozilla.org/show_bug.cgi?id=806506 |
| |
5 --> |
| |
6 <head> |
| |
7 <title>Test for ShadowRoot</title> |
| |
8 <script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script> |
| |
9 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> |
| |
10 </head> |
| |
11 <body> |
| |
12 <div id="movedtoshadow" class="testclass"></div> |
| |
13 <svg id="svgmovedtoshadow"></svg> |
| |
14 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=806506">Bug 806506</a> |
| |
15 <script> |
| |
16 // Create ShadowRoot. |
| |
17 var element = document.createElement("div"); |
| |
18 ok(!element.shadowRoot, "div element should not have a shadow root."); |
| |
19 var shadow = element.createShadowRoot(); |
| |
20 is(element.shadowRoot, shadow, "shadowRoot property should return the same shadow root that was just created."); |
| |
21 |
| |
22 // Move an element from the document to the ShadowRoot. |
| |
23 var inShadowEl = document.getElementById("movedtoshadow"); |
| |
24 var inShadowSVGEl = document.getElementById("svgmovedtoshadow"); |
| |
25 |
| |
26 // Test getElementById |
| |
27 ok(!shadow.getElementById("movedtoshadow"), "Element not in ShadowRoot should not be accessible from ShadowRoot API."); |
| |
28 ok(!shadow.getElementById("svgmovedtoshadow"), "SVG element not in ShadowRoot should not be accessible from ShadowRoot API."); |
| |
29 shadow.appendChild(inShadowEl); |
| |
30 shadow.appendChild(inShadowSVGEl); |
| |
31 is(shadow.getElementById("movedtoshadow"), inShadowEl, "Element appended to a ShadowRoot should be accessible from ShadowRoot API."); |
| |
32 ok(!document.getElementById("movedtoshadow"), "Element appended to a ShadowRoot should not be accessible from document."); |
| |
33 is(shadow.getElementById("svgmovedtoshadow"), inShadowSVGEl, "SVG element appended to a ShadowRoot should be accessible from ShadowRoot API."); |
| |
34 ok(!document.getElementById("svgmovedtoshadow"), "SVG element appended to a ShadowRoot should not be accessible from document."); |
| |
35 |
| |
36 // Test getElementsByClassName |
| |
37 is(document.getElementsByClassName("testclass").length, 0, "Element removed from DOM should not be accessible by DOM accessors."); |
| |
38 is(shadow.getElementsByClassName("testclass").length, 1, "Element added to ShadowRoot should be accessible by ShadowRoot API."); |
| |
39 |
| |
40 // Test getElementsByTagName{NS} |
| |
41 is(document.getElementsByTagName("div").length, 0, "Element removed from DOM should not be accessible from DOM accessors."); |
| |
42 is(shadow.getElementsByTagName("div").length, 1, "Elements in the ShadowRoot should be accessible from the ShadowRoot API."); |
| |
43 is(document.getElementsByTagName("svg").length, 0, "SVG elements removed from DOM should not be accessible from DOM accessors."); |
| |
44 is(shadow.getElementsByTagName("svg").length, 1, "SVG element in the ShadowRoot should be accessible from the ShadowRoot API."); |
| |
45 is(shadow.getElementsByTagNameNS("http://www.w3.org/2000/svg", "svg").length, 1, "SVG element in the ShadowRoot should be accessible from the ShadowRoot API."); |
| |
46 |
| |
47 // Remove elements from ShadowRoot and make sure that they are no longer accessible via the ShadowRoot API. |
| |
48 shadow.removeChild(inShadowEl); |
| |
49 shadow.removeChild(inShadowSVGEl); |
| |
50 ok(!shadow.getElementById("movedtoshadow"), "ShadowRoot API should not be able to access elements removed from ShadowRoot."); |
| |
51 ok(!shadow.getElementById("svgmovedtoshadow"), "ShadowRoot API should not be able to access elements removed from ShadowRoot."); |
| |
52 is(shadow.getElementsByClassName("testclass").length, 0, "ShadowRoot getElementsByClassName should not be able to access elements removed from ShadowRoot."); |
| |
53 is(shadow.getElementsByTagName("svg").length, 0, "ShadowRoot getElementsByTagName should not be able to access elements removed from ShadowRoot."); |
| |
54 is(shadow.getElementsByTagNameNS("http://www.w3.org/2000/svg", "svg").length, 0, "ShadowRoot getElementsByTagNameNS should not be able to access elements removed from ShadowRoot."); |
| |
55 |
| |
56 // Test querySelector on element in a ShadowRoot. |
| |
57 element = document.createElement("div"); |
| |
58 shadow = element.createShadowRoot(); |
| |
59 var parentDiv = document.createElement("div"); |
| |
60 var childSpan = document.createElement("span"); |
| |
61 childSpan.id = "innerdiv"; |
| |
62 parentDiv.appendChild(childSpan); |
| |
63 is(parentDiv.querySelector("#innerdiv"), childSpan, "ID query selector should work on element in ShadowRoot."); |
| |
64 is(parentDiv.querySelector("span"), childSpan, "Tag query selector should work on element in ShadowRoot."); |
| |
65 |
| |
66 // Test that exception is thrown when trying to create a cycle with host node. |
| |
67 element = document.createElement("div"); |
| |
68 shadow = element.createShadowRoot(); |
| |
69 try { |
| |
70 shadow.appendChild(element); |
| |
71 ok(false, "Excpetion should be thrown when creating a cycle with host content."); |
| |
72 } catch (ex) { |
| |
73 ok(true, "Excpetion should be thrown when creating a cycle with host content."); |
| |
74 } |
| |
75 |
| |
76 // Basic innerHTML tests. |
| |
77 shadow.innerHTML = '<span id="first"></span><div id="second"></div>'; |
| |
78 is(shadow.childNodes.length, 2, "There should be two children in the ShadowRoot."); |
| |
79 is(shadow.getElementById("second").tagName, "DIV", "Elements created by innerHTML should be accessible by ShadowRoot API."); |
| |
80 |
| |
81 </script> |
| |
82 </body> |
| |
83 </html> |