<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let documentNode;

    let suite = InspectorTest.createAsyncSuite("DOMNode.shadowRootType");

    suite.addTestCase({
        name: "ShadowRootType.UserAgent",
        test(resolve, reject) {
            documentNode.querySelector("#host-user-agent", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for #host-user-agent");
                InspectorTest.expectThat(domNode.shadowRoots().length === 1, "DOMNode has a single shadow root.");
                InspectorTest.expectThat(domNode.shadowRoots()[0].shadowRootType() === WI.DOMNode.ShadowRootType.UserAgent, "DOMNode has UserAgent shadow root type.");
                InspectorTest.expectThat(domNode.shadowRoots()[0].isInUserAgentShadowTree(), "DOMNode is in a UserAgent shadow tree.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ShadowRootType.Closed",
        test(resolve, reject) {
            documentNode.querySelector("#host-closed", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for #host-closed");
                InspectorTest.expectThat(domNode.shadowRoots().length === 1, "DOMNode has a single shadow root.");
                InspectorTest.expectThat(domNode.shadowRoots()[0].shadowRootType() === WI.DOMNode.ShadowRootType.Closed, "DOMNode has Closed shadow root type.");
                InspectorTest.expectThat(!domNode.shadowRoots()[0].isInUserAgentShadowTree(), "DOMNode is not in a UserAgent shadow tree.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "ShadowRootType.Open",
        test(resolve, reject) {
            documentNode.querySelector("#host-open", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for #host-open");
                InspectorTest.expectThat(domNode.shadowRoots().length === 1, "DOMNode has a single shadow root.");
                InspectorTest.expectThat(domNode.shadowRoots()[0].shadowRootType() === WI.DOMNode.ShadowRootType.Open, "DOMNode has Open shadow root type.");
                InspectorTest.expectThat(!domNode.shadowRoots()[0].isInUserAgentShadowTree(), "DOMNode is not in a UserAgent shadow tree.");
                resolve();
            });
        }
    });

    suite.addTestCase({
        name: "NoShadowRootType",
        test(resolve, reject) {
            documentNode.querySelector("#no-host", (nodeId) => {
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, "Got DOMNode for #no-host");
                InspectorTest.expectThat(domNode.shadowRoots().length === 0, "DOMNode has no shadow roots.");
                InspectorTest.expectThat(domNode.shadowRootType() === undefined, "DOMNode has no shadow root type.");
                resolve();
            });
        }
    });

    WI.domManager.requestDocument((node) => {
        documentNode = node;
        suite.runTestCasesAndFinish();
    });
}
</script>
</head>
<body onload="runTest()">
<p>Test for DOMNode.shadowRootType.</p>
<div style="display: none">
    <input id="host-user-agent" controls>
    <div id="host-closed"></div>
    <div id="host-open"></div>
    <div id="no-host"></div>
</div>
<script>
(function() {
    var shadowRootClosed = document.getElementById("host-closed").attachShadow({mode: "closed"});
    shadowRootClosed.appendChild(document.createTextNode("closed"));

    var shadowRootOpen = document.getElementById("host-open").attachShadow({mode: "open"});
    shadowRootOpen.appendChild(document.createTextNode("open"));
})();
</script>
</body>
</html>
