<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function changeElementDisplayValue(id, value)
{
    document.getElementById(id).style.display = value;
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("CSS.getMatchedStyleForNode.MarkerPseudoId");

    function addTestCase({name, description, selector, domNodeStylesHandler})
    {
        suite.addTestCase({
            name,
            description,
            async test() {
                let documentNode = await WI.domManager.requestDocument();
                let nodeId = await documentNode.querySelector(selector);
                let domNode = WI.domManager.nodeForId(nodeId);
                InspectorTest.assert(domNode, `Should find DOM Node for selector '${selector}'.`);

                let domNodeStyles = WI.cssManager.stylesForNode(domNode);
                InspectorTest.assert(domNodeStyles, `Should find CSS Styles for DOM Node.`);
                await domNodeStyles.refreshIfNeeded();

                await domNodeStylesHandler(domNodeStyles);
            },
        });
    }

    async function changeElementDisplayValue(id, value)
    {
        await InspectorTest.evaluateInPage(`changeElementDisplayValue("${id}", "${value}")`);
    }

    addTestCase({
        name: "CSS.getMatchedStyleForNode.MarkerPseudoId.ListItem",
        description: "A list item should have both the User Agent and authored `::marker` rules.",
        selector: "#listItem",
        async domNodeStylesHandler(styles) {
            InspectorTest.expectEqual(styles.pseudoElements.get(WI.CSSManager.PseudoSelectorNames.Marker).matchedRules.length, 2, "Expected exactly 2 rules for selector `*::marker`.");
        }
    });

    addTestCase({
        name: "CSS.getMatchedStyleForNode.MarkerPseudoId.NonListItem",
        description: "A non-list item should have no `::marker` rules.",
        selector: "#nonListItem",
        async domNodeStylesHandler(styles) {
            InspectorTest.expectEqual(styles.pseudoElements.get(WI.CSSManager.PseudoSelectorNames.Marker), undefined, "Expected no rules entry for selector `*::marker`.");
        }
    });

    addTestCase({
        name: "CSS.getMatchedStyleForNode.MarkerPseudoId.NonListItemWithMarkerSpecified",
        description: "A non-list item with a `base-selector::marker` specified should not show the specified rule unless it becomes a list item.",
        selector: "#nonListItemWithMarkerSpecified",
        async domNodeStylesHandler(styles) {
            InspectorTest.expectEqual(styles.pseudoElements.get(WI.CSSManager.PseudoSelectorNames.Marker), undefined, "Expected no rules entry for selector `*::marker`.");
            await changeElementDisplayValue("nonListItemWithMarkerSpecified", "list-item");
            await styles.refresh();
            InspectorTest.expectEqual(styles.pseudoElements.get(WI.CSSManager.PseudoSelectorNames.Marker).matchedRules.length, 3, "Expected 3 rules for selector `*::marker`.");
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
<style>
    ::marker {
        color: red;
    }
    #nonListItemWithMarkerSpecified::marker {
        color: green;
    }
</style>
</head>
<body onload="runTest()">
    <p>Tests for the CSS.getMatchedStyleForNode command and the `::marker` CSS rule selector.</p>
    <ul>
        <li id="listItem"></li>
    </ul>
    <div id="nonListItem"></div>
    <div id="nonListItemWithMarkerSpecified"></div>
</body>
</html>
