blob: b4de58e59bd0b7f15d7ebefc24c6dd5a836c5a6c [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<style>
/* relative positioning ensures underlying RenderLayer */
.container {
position: relative;
}
</style>
<script>
function log(message)
{
var line = document.createElement("div");
line.textContent = message;
document.getElementById("console").appendChild(line);
}
var contentSources = [
"<div/>",
"#text<div/>",
"<div/>#text",
"#text<div/>#text",
"<span/>",
"#text<span/>",
"<span/>#text",
"#text<span/>#text",
"<span/>#text<div/>",
"<div/>#text<span/>",
"<div/><span/>",
"<span/><div/>"
];
var shadowSources = [
"<content/>",
"<div/><content/><div/>",
"<div/><content/><span/>",
"<span/><content/><span/>",
"<span/><content/><div/>",
"<div/><content/><div/>",
"<div/><content/><span/>",
"<span/><content/><span/>",
"<span/><content/><div/>",
"<div/>#text<content/>#text<div/>",
"<div/>#text<content/>#text<span/>",
"<span/>#text<content/>#text<span/>",
"<span/>#text<content/>#text<div/>",
"<div><content/></div>",
"<span><content/></span>"
];
function createTreeFrom(html)
{
var enhancedHtml = html.replace(/<span\/>/g, "<span> </span>").replace(/<div\/>/g, "<div> </div>").replace(/<content\/>/g, "<content></content>").replace(/#text/g, " ");
var root = document.createElement("blockquote");
root.innerHTML = enhancedHtml;
var contentPlaceholder = root.getElementsByTagName("CONTENT")[0];
if (contentPlaceholder) {
var contentParent = contentPlaceholder.parentNode;
contentParent.replaceChild(window.internals.createContentElement(), contentPlaceholder);
};
return root;
}
function moveChildren(fromParent, toParent)
{
var children = fromParent.childNodes;
while (fromParent.firstChild)
toParent.appendChild(fromParent.firstChild);
}
function createTargetTree(contentHtml, shadowHtml)
{
var content = createTreeFrom(contentHtml);
var shadow = createTreeFrom(shadowHtml);
var host = document.createElement("blockquote");
var shadowRoot = internals.ensureShadowRoot(host);
moveChildren(content, host);
moveChildren(shadow, shadowRoot);
return host;
}
function cleanupContainer(container)
{
var child = container.firstChild;
if (child)
container.removeChild(child);
container.offsetLeft;
}
function testWithContentAndShadow(contentHtml, shadowHtml, label)
{
var targetContainer = document.getElementById("targetContainer");
cleanupContainer(targetContainer);
var target = createTargetTree(contentHtml, shadowHtml);
targetContainer.appendChild(target);
var targetRenderTree = removeContainerLines(window.internals.elementRenderTreeAsText(targetContainer));
var referenceContainer = document.getElementById("referenceContainer");
cleanupContainer(referenceContainer);
var separator = "<!-- -->"; // Uses a separator for keeping text node separate.
var referenceHtml = shadowHtml.replace("<content/>", (separator + contentHtml + separator));
var reference = createTreeFrom(referenceHtml);
referenceContainer.appendChild(reference);
var referenceRenderTree = removeContainerLines(window.internals.elementRenderTreeAsText(referenceContainer));
if (targetRenderTree == referenceRenderTree)
log("PASS[" + label + "]: content=" + contentHtml + " shadow=" + shadowHtml);
else {
log("FAIL[" + label + "]: content=" + contentHtml + " shadow=" + shadowHtml);
log("Expected: (for " + reference.innerHTML + ")");
log(referenceRenderTree);
log("Actual: (for " + target.innerHTML + ")");
log(targetRenderTree);
}
}
function removeContainerLines(text)
{
var lines = text.split("\n");
lines.splice(0, 2);
return lines.join("\n");
}
function test()
{
testRunner.dumpAsText();
log("This test compares a shadow-based render tree with one for a reference DOM tree.");
log("Note that this test only runs on DRT.");
for (var i = 0; i < contentSources.length; ++i) {
for (var j = 0; j < shadowSources.length; ++j) {
var testLabel = i + "," + j;
testWithContentAndShadow(contentSources[i], shadowSources[j], testLabel);
}
}
document.getElementById("test").style.display = "none";
document.getElementById("console").style.display = "block";
}
</script>
</head>
<body onload="test()">
<div id="test">
<div class="container" id="targetContainer"></div>
<div class="container" id="referenceContainer"></div>
</div>
<pre id="console" style="display: none;"></pre>
</body>
</html>