<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test() {
    WI.domManager.requestDocument(function(documentNode) {
        documentNode.querySelector("#none", function(nodeId) {
            var domNode = WI.domManager.nodeForId(nodeId);
            InspectorTest.log("");
            InspectorTest.expectThat(domNode, "Got DOMNode for #none");
            InspectorTest.assert(!domNode.pseudoType());
            InspectorTest.expectThat(!domNode.hasPseudoElements(), "DOMNode has no pseudo elements");
            InspectorTest.assert(domNode.pseudoElements().size === 0);
            InspectorTest.assert(!domNode.beforePseudoElement());
            InspectorTest.assert(!domNode.afterPseudoElement());
        });

        documentNode.querySelector("#b", function(nodeId) {
            var domNode = WI.domManager.nodeForId(nodeId);
            InspectorTest.log("");
            InspectorTest.expectThat(domNode, "Got DOMNode for #b");
            InspectorTest.assert(!domNode.pseudoType());
            InspectorTest.expectThat(domNode.hasPseudoElements(), "DOMNode has pseudo elements");
            InspectorTest.expectThat(domNode.pseudoElements().size === 1, "DOMNode has 1 pseudo elements");
            InspectorTest.expectThat(domNode.beforePseudoElement(), "DOMNode has a before pseudo element");
            InspectorTest.expectThat(!domNode.afterPseudoElement(), "DOMNode does not have an after pseudo element");
            InspectorTest.expectThat(domNode.beforePseudoElement().pseudoType() === WI.DOMNode.PseudoElementType.Before, "DOMNode for before pseudo element has the right type");
        });

        documentNode.querySelector("#a", function(nodeId) {
            var domNode = WI.domManager.nodeForId(nodeId);
            InspectorTest.log("");
            InspectorTest.expectThat(domNode, "Got DOMNode for #a");
            InspectorTest.assert(!domNode.pseudoType());
            InspectorTest.expectThat(domNode.hasPseudoElements(), "DOMNode has pseudo elements");
            InspectorTest.expectThat(domNode.pseudoElements().size === 1, "DOMNode has 1 pseudo elements");
            InspectorTest.expectThat(!domNode.beforePseudoElement(), "DOMNode does not have a before pseudo element");
            InspectorTest.expectThat(domNode.afterPseudoElement(), "DOMNode has an after pseudo element");
            InspectorTest.expectThat(domNode.afterPseudoElement().pseudoType() === WI.DOMNode.PseudoElementType.After, "DOMNode for after pseudo element has the right type");
        });

        documentNode.querySelector("#x", function(nodeId) {
            var domNode = WI.domManager.nodeForId(nodeId);
            InspectorTest.log("");
            InspectorTest.expectThat(domNode, "Got DOMNode for #x");
            InspectorTest.assert(!domNode.pseudoType());
            InspectorTest.expectThat(domNode.hasPseudoElements(), "DOMNode has pseudo elements");
            InspectorTest.expectThat(domNode.pseudoElements().size === 2, "DOMNode has 2 pseudo elements");
            InspectorTest.expectThat(domNode.beforePseudoElement(), "DOMNode has a before pseudo element");
            InspectorTest.expectThat(domNode.afterPseudoElement(), "DOMNode has an after pseudo element");
            InspectorTest.expectThat(domNode.beforePseudoElement().pseudoType() === WI.DOMNode.PseudoElementType.Before, "DOMNode for before pseudo element has the right type");
            InspectorTest.expectThat(domNode.afterPseudoElement().pseudoType() === WI.DOMNode.PseudoElementType.After, "DOMNode for after pseudo element has the right type");
            InspectorTest.completeTest();
        });
    });
}
</script>
</head>
<body onload="runTest()">
    <p>Test for basic DOMNode pseudo element support.</p>

    <style>
    #x:before, #b:before { content: "before"; }
    #x:after, #a:after { content: "after"; }
    </style>

    <div id="none">TEST ELEMENT: No Pseudo Elements</div>
    <div id="b">TEST ELEMENT: Has Before Pseudo Element</div>
    <div id="a">TEST ELEMENT: Has After Pseudo Element</div>
    <div id="x">TEST ELEMENT: Has Before and After Pseudo Elements</div>

</body>
</html>
