5 /* relative positioning ensures underlying RenderLayer */
13 var line = document.createElement("div");
14 line.textContent = message;
15 document.getElementById("console").appendChild(line);
18 var contentSources = [
38 "<div/><content/><div/>",
39 "<div/><content/><span/>",
40 "<span/><content/><span/>",
41 "<span/><content/><div/>",
43 "<div/><content/><div/>",
44 "<div/><content/><span/>",
45 "<span/><content/><span/>",
46 "<span/><content/><div/>",
48 "<div/>#text<content/>#text<div/>",
49 "<div/>#text<content/>#text<span/>",
50 "<span/>#text<content/>#text<span/>",
51 "<span/>#text<content/>#text<div/>",
53 "<div><content/></div>",
54 "<span><content/></span>"
57 function createTreeFrom(html)
59 var enhancedHtml = html.replace(/<span\/>/g, "<span> </span>").replace(/<div\/>/g, "<div> </div>").replace(/<content\/>/g, "<content></content>").replace(/#text/g, " ");
60 var root = document.createElement("blockquote");
61 root.innerHTML = enhancedHtml;
62 var contentPlaceholder = root.getElementsByTagName("CONTENT")[0];
63 if (contentPlaceholder) {
64 var contentParent = contentPlaceholder.parentNode;
65 contentParent.replaceChild(window.document.createElement('content'), contentPlaceholder);
71 function moveChildren(fromParent, toParent)
73 var children = fromParent.childNodes;
74 while (fromParent.firstChild)
75 toParent.appendChild(fromParent.firstChild);
78 function createTargetTree(contentHtml, shadowHtml)
80 var content = createTreeFrom(contentHtml);
81 var shadow = createTreeFrom(shadowHtml);
82 var host = document.createElement("blockquote");
83 var shadowRoot = host.createShadowRoot();
84 moveChildren(content, host);
85 moveChildren(shadow, shadowRoot);
89 function cleanupContainer(container)
91 var child = container.firstChild;
93 container.removeChild(child);
97 function testWithContentAndShadow(contentHtml, shadowHtml, label)
99 var targetContainer = document.getElementById("targetContainer");
100 cleanupContainer(targetContainer);
101 var target = createTargetTree(contentHtml, shadowHtml);
102 targetContainer.appendChild(target);
103 var targetRenderTree = removeContainerLines(window.internals.elementRenderTreeAsText(targetContainer));
105 var referenceContainer = document.getElementById("referenceContainer");
106 cleanupContainer(referenceContainer);
107 var separator = "<!-- -->"; // Uses a separator for keeping text node separate.
108 var referenceHtml = shadowHtml.replace("<content/>", (separator + contentHtml + separator));
109 var reference = createTreeFrom(referenceHtml);
110 referenceContainer.appendChild(reference);
111 var referenceRenderTree = removeContainerLines(window.internals.elementRenderTreeAsText(referenceContainer));
112 if (targetRenderTree == referenceRenderTree)
113 log("PASS[" + label + "]: content=" + contentHtml + " shadow=" + shadowHtml);
115 log("FAIL[" + label + "]: content=" + contentHtml + " shadow=" + shadowHtml);
116 log("Expected: (for " + reference.innerHTML + ")");
117 log(referenceRenderTree);
118 log("Actual: (for " + target.innerHTML + ")");
119 log(targetRenderTree);
123 function removeContainerLines(text)
125 var lines = text.split("\n");
127 return lines.join("\n");
132 testRunner.dumpAsText();
133 log("This test compares a shadow-based render tree with one for a reference DOM tree.");
134 log("Note that this test only runs on DRT.");
136 for (var i = 0; i < contentSources.length; ++i) {
137 for (var j = 0; j < shadowSources.length; ++j) {
138 var testLabel = i + "," + j;
139 testWithContentAndShadow(contentSources[i], shadowSources[j], testLabel);
143 document.getElementById("test").style.display = "none";
144 document.getElementById("console").style.display = "block";
148 <body onload="test()">
150 <div class="container" id="targetContainer"></div>
151 <div class="container" id="referenceContainer"></div>
153 <pre id="console" style="display: none;"></pre>