<!DOCTYPE html>
<html>
<head>
<style>
#host {
  color: gray;
}
</style>
<script src="../../../resources/js-test-pre.js"></script>
<script src="resources/polyfill.js"></script>
<script>
function dumpComputedStyle(node)
{
    debug(node.id + ": " + document.defaultView.getComputedStyle(node, null).getPropertyValue('color'));
}

function preprocessForTest()
{
    var parent = document.getElementById("parent");
    parent.innerHTML = '<div id="host"><span>Hello</span></div>';
}

function testSimpleContentCase()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var shadow = host.webkitCreateShadowRoot();
    shadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function testSimpleShadowCase()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var shadow = host.webkitCreateShadowRoot();
    shadow.innerHTML = "<style>@host { div { color: red; } }</style><shadow></shadow>";
    dumpComputedStyle(host);
}

function testHostWithSelector()
{
    var parent = document.getElementById("parent");
    parent.innerHTML = "<style scoped> .host { color: gray };</style>"
        + "<div id='hostA' class='host'><span>Hello</span></div>"
        + "<span id='hostB' class='host'><span>World</span></span>";

    var hostA = document.getElementById("hostA");
    var shadowA = hostA.webkitCreateShadowRoot();
    var style = "<style>@host { div { color: red; } span { color: blue; } }</style>";
    shadowA.innerHTML = style + "<shadow></shadow>";

    var hostB = document.getElementById("hostB");
    var shadowB = hostB.webkitCreateShadowRoot();
    shadowB.innerHTML = style + "<shadow></shadow>";

    dumpComputedStyle(hostA);
    dumpComputedStyle(hostB);
}

function testPseudoHostWithScoped()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var shadow = host.webkitCreateShadowRoot();
    shadow.innerHTML = "<div><style scoped>@host { div { color: red; } }</style><shadow></shadow><div><style scoped>@host { div { color: blue; } }</style></div></div>";
    dumpComputedStyle(host);
}

function testPseudoHostWithFallbackShadow()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var oldestShadow = host.webkitCreateShadowRoot();
    var youngestShadow = host.webkitCreateShadowRoot();
    oldestShadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    youngestShadow.innerHTML = "<content><shadow></shadow></content>";
    dumpComputedStyle(host);
}

function testTwoShadowRootsCase()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var oldestShadow = host.webkitCreateShadowRoot();
    var youngestShadow = host.webkitCreateShadowRoot();
    oldestShadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    youngestShadow.innerHTML = "<style>@host { div { color: blue; } }</style><shadow></shadow>";
    dumpComputedStyle(host);
}

function testTwoShadowRootsCreatingDifferentOrderCase()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var oldestShadow = host.webkitCreateShadowRoot();
    var youngestShadow = host.webkitCreateShadowRoot();
    youngestShadow.innerHTML = "<style>@host { div { color: blue; } }</style><shadow></shadow>";
    oldestShadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function testMultipleShadowRootsWithInertShadowContent()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var oldestShadow = host.webkitCreateShadowRoot();
    var olderShadow = host.webkitCreateShadowRoot();
    var youngerShadow = host.webkitCreateShadowRoot();
    var youngestShadow = host.webkitCreateShadowRoot();

    youngestShadow.innerHTML = "<shadow></shadow>";
    youngerShadow.innerHTML = "<content></content>";
    olderShadow.innerHTML = "<style>@host { div { color: green; } }</style><shadow></shadow>";
    oldestShadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function testMultipleShadowRootsWithInertShadow()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var oldestShadow = host.webkitCreateShadowRoot();
    var olderShadow = host.webkitCreateShadowRoot();
    var youngerShadow = host.webkitCreateShadowRoot();
    var youngestShadow = host.webkitCreateShadowRoot();

    youngestShadow.innerHTML = "<style>@host { div { color: yellow; } }</style><shadow></shadow>";
    youngerShadow.innerHTML = "<style>@host { div { color: blue; } }</style><div>inert</div>";
    olderShadow.innerHTML = "<style>@host { div { color: green; } }</style><shadow></shadow>";
    oldestShadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function testNestedCase()
{
    preprocessForTest();
    var host = document.getElementById("host");
    var outerShadow = host.webkitCreateShadowRoot();
    outerShadow.innerHTML = '<style>@host { div { color: red; } }</style><div id="nestedHost">InnerShadow</div>';
    var nested = outerShadow.getElementById("nestedHost");
    var innerShadow = nested.webkitCreateShadowRoot();
    innerShadow.innerHTML = '<style>@host { div { color: blue; } }</style>Show <shadow></shadow> in outer.';
    dumpComputedStyle(host);
    dumpComputedStyle(nested);
}

function testHostVsScopedStyle()
{
    preprocessForTest();
    var host = document.getElementById("host");
    host.innerHTML = "<style scoped>#host { color: yellow; }</style><span>Hello</span>";
    var shadow = host.webkitCreateShadowRoot();
    shadow.innerHTML = "<style>@host { #host { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function testHostVsInlineStyle()
{
    preprocessForTest();
    var host = document.getElementById("host");
    host.style.color = "yellow";
    host.innerHTML = "<span>Hello</span>";
    var shadow = host.webkitCreateShadowRoot();
    shadow.innerHTML = "<style>@host { div { color: red; } }</style><content></content>";
    dumpComputedStyle(host);
}

function runTests()
{
    testSimpleContentCase();
    testSimpleShadowCase();
    testHostWithSelector();
    testPseudoHostWithScoped();
    testPseudoHostWithFallbackShadow();
    testTwoShadowRootsCase();
    testTwoShadowRootsCreatingDifferentOrderCase();
    testMultipleShadowRootsWithInertShadowContent();
    testMultipleShadowRootsWithInertShadow();
    testNestedCase();
    testHostVsScopedStyle();
    testHostVsInlineStyle();
}
</script>
</head>
<body onload="runTests()">
  <div id="parent">
  </div>
</body>
</html>
