<!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) {
            WI.domTreeManager.querySelector(documentNode.id, "#host-user-agent", (nodeId) => {
                let domNode = WI.domTreeManager.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) {
            WI.domTreeManager.querySelector(documentNode.id, "#host-closed", (nodeId) => {
                let domNode = WI.domTreeManager.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) {
            WI.domTreeManager.querySelector(documentNode.id, "#host-open", (nodeId) => {
                let domNode = WI.domTreeManager.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) {
            WI.domTreeManager.querySelector(documentNode.id, "#no-host", (nodeId) => {
                let domNode = WI.domTreeManager.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.domTreeManager.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>
