<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function test()
{
    Promise.resolve()
    .then(() => {
        ProtocolTest.log("Requesting document...");
        return InspectorProtocol.awaitCommand({
            method: "DOM.getDocument",
            params: {},
        });
    })
    .then(({root}) => {
        ProtocolTest.log("Querying for \"div#x\"...");
        return InspectorProtocol.awaitCommand({
            method: "DOM.querySelector",
            params: {
                nodeId: root.nodeId,
                selector: "div#x",
            },
        });
    })
    .then(({nodeId}) => {
        ProtocolTest.log("Getting matched styles for \"div#x\"...");
        return InspectorProtocol.awaitCommand({
            method: "CSS.getMatchedStylesForNode",
            params: {
                nodeId,
                includePseudo: true,
                includeInherited: true,
            },
        });
    })
    .then(({matchedCSSRules, pseudoElements, inherited}) => {
        function filterRuleMatches(ruleMatches) {
            return ruleMatches.filter((ruleMatch) => ruleMatch.rule.origin !== "user-agent");
        }

        function replacer(key, value) {
            if (key === "ruleId" || key === "styleId" || key === "range" || key === "sourceLine" || key === "sourceURL")
                return "<filtered>";
            return value;
        }

        ProtocolTest.log("");
        ProtocolTest.log("Matched:");
        matchedCSSRules = filterRuleMatches(matchedCSSRules);
        ProtocolTest.json(matchedCSSRules, replacer);

        ProtocolTest.log("");
        ProtocolTest.log("Pseudo:");
        pseudoElements = pseudoElements.filter((pseudoIdMatch) => {
            pseudoIdMatch.matches = filterRuleMatches(pseudoIdMatch.matches);
            return pseudoIdMatch.matches.length;
        });
        ProtocolTest.json(pseudoElements, replacer);

        ProtocolTest.log("");
        ProtocolTest.log("Inherited:");
        inherited = inherited.filter((inheritedStyleEntry) => {
            inheritedStyleEntry.matchedCSSRules = filterRuleMatches(inheritedStyleEntry.matchedCSSRules);
            return inheritedStyleEntry.matchedCSSRules.length;
        });
        ProtocolTest.json(inherited, replacer);
    })
    .catch((error) => {
        ProtocolTest.log(error);
    })
    .finally(() => {
        ProtocolTest.completeTest();
    });
}
</script>
</head>
<body onLoad="runTest()">
    <p>Testing CSS.getMatchedStylesForNode.</p>

    <style>
    body { z-index: 0; }

    div#x { z-index: 100; }
    #x { z-index: 200; }
    div { z-index: 300; }

    div::first-line { z-index: 1; }
    div::first-letter { z-index: 2; }
    div::marker { z-index: 3; }
    div::before { z-index: 4; }
    div::after { z-index: 5; }
    div::selection { z-index: 6; }
    div::-webkit-scrollbar { z-index: 7; }
    div::-webkit-scrollbar-thumb { z-index: 8; }
    div::-webkit-scrollbar-button { z-index: 9; }
    div::-webkit-scrollbar-track { z-index: 10; }
    div::-webkit-scrollbar-track-piece { z-index: 11; }
    div::-webkit-scrollbar-corner { z-index: 12; }
    div::-webkit-resizer { z-index: 13; }
    </style>
    <div id="x"></div>
</body>
</html>
