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

    function validateStyles() {
        InspectorTest.log("");

        InspectorTest.expectThat(!nodeStyles.inlineStyle, "No Inline Styles");
        InspectorTest.expectThat(!nodeStyles.attributesStyle, "No Attribute Styles");
        InspectorTest.expectThat(!nodeStyles.inheritedRules.length, "No Inherited Styles");
        InspectorTest.expectThat(!Object.keys(nodeStyles.pseudoElements).length, "No Pseudo Element Styles");

        InspectorTest.expectThat(nodeStyles.computedStyle, "Has Computed Styles");

        function logProperty(propertyName) {
            const dontCreateIfMissing = true;
            let property = nodeStyles.computedStyle.propertyForName(propertyName, dontCreateIfMissing);
            InspectorTest.log(`PROPERTY: ${property.name}: ${property.value};`);
        }

        logProperty("content");
        logProperty("color");

        for (var rule of nodeStyles.matchedRules) {
            InspectorTest.log("MATCHED RULE:");
            for (var i = 0; i < rule.selectors.length; ++i) {
                var selector = rule.selectors[i];
                var matched = rule.matchedSelectorIndices.includes(i);
                InspectorTest.log("  SELECTOR: " + selector.text + (matched ? " [matched]" : ""));
            }
        }

        InspectorTest.completeTest();
    }

    WI.domManager.requestDocument(function(documentNode) {
        documentNode.querySelector("#x", function(contentNodeId) {
            var domNode = WI.domManager.nodeForId(contentNodeId);
            InspectorTest.assert(domNode);
            var beforePseudoElementDOMNode = domNode.beforePseudoElement();
            InspectorTest.expectThat(beforePseudoElementDOMNode, "Got ::before pseudo element for #x");
            InspectorTest.log("Refreshing styles for ::before pseudo element");
            nodeStyles = WI.cssManager.stylesForNode(beforePseudoElementDOMNode);
            nodeStyles.addEventListener(WI.DOMNodeStyles.Event.Refreshed, validateStyles);
            nodeStyles.refresh();
        });
    });

}
</script>
</head>
<body onload="runTest()">
    <p>Testing that we can get computed and matched rules for pseudo element nodes.</p>

    <style>
    input:before, #x:before, div { content: "before"; color: blue; }
    </style>

    <div id="x">TEST ELEMENT: Has Before Pseudo Element</div>
</body>
</html>
