<!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>
