<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createAsyncSuite("CSS.getMatchedStylesForNode.UserAgentShadowRoot");

    function nodeForId(id) {
        return WI.domManager.nodeForId(id)
    }

    function addTestCase({name, description, resolveTargetDOMNode, expectedSelectors})
    {
        suite.addTestCase({
            name,
            description,
            async test() {
                let documentNode = await WI.domManager.requestDocument();
                let domNode = await resolveTargetDOMNode(documentNode);
                InspectorTest.assert(domNode, `Should find DOM Node.`);

                let domNodeStyles = WI.cssManager.stylesForNode(domNode);
                await domNodeStyles.refreshIfNeeded();

                let matchedSelectorTexts = [];
                for (let rule of domNodeStyles.matchedRules) {
                    let selectorText = rule.selectorText
                    matchedSelectorTexts.push(selectorText)

                    // A sign of bad parsing from the backend is a disagreement between the individual selectors and the combined selector text.
                    for (let selector of rule.selectors)
                        InspectorTest.assert(selectorText.includes(selector.text), `Should find selector '${selector.text}' in whole selector text '${selectorText}'.`);
                }

                let matchedSelectors = domNodeStyles.matchedRules.map((rule) => rule.selectorText);
                for (let expectedSelector of expectedSelectors)
                    InspectorTest.expectThat(matchedSelectorTexts.includes(expectedSelector), `Should have matched rule for selector '${expectedSelector}'`);
            },
        });
    }

    addTestCase({
        name: "CSS.getMatchedStylesForNode.UserAgentShadowRoot.StyleFollowingNormallyInvalidSelector",
        description: "Ensure that rules declared after a normaly invalid selector (that is exempted due to being in a UA Shadow Root) are correctly resolved.",
        async resolveTargetDOMNode(documentNode) {
            let videoElement = nodeForId(await documentNode.querySelector("#target"));
            let shadowRoot = videoElement.shadowRoots()[0];
            return nodeForId(await shadowRoot.querySelector(".time-label"));
        },
        expectedSelectors: [
            ".media-controls .time-label, .media-controls .status-label",
            ".time-label",
            ".media-controls-container, .media-controls-container *",
            ":host(audio), :host(video.media-document.audio), *",
            "*",
        ],
    });

    suite.runTestCasesAndFinish();
}
</script>
<style>
</style>
</head>
<body onload="runTest()">
    <p>Tests for the CSS.getMatchedStylesForNode command styles inside user-agent shadow roots.</p>
    <video id="target" loop muted autoplay controls>
        <source src="../../http/tests/resources/test.mp4" />
    </video>
</body>
</html>
