<!DOCTYPE html>
<html>
<head>
<style>
.foo, .bar { color: red; }
</style>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
// Insert a rule at the beginning of the inline stylesheet above that would shift all rule ordinals down.
document.styleSheets[0].insertRule("body { padding: 10px; }", 0);

function test() {
    var nodeStyles;

    function validateSelectors()
    {
        for (var i = 0; i < nodeStyles.matchedRules.length; ++i) {
            var rule = nodeStyles.matchedRules[i];
            if (rule.type !== WI.CSSStyleSheet.Type.Author)
                continue;

            for (var selector of rule.selectors)
                InspectorTest.log(selector.text);
        }

        InspectorTest.completeTest();
    }

    function onStylesRefreshed()
    {
        nodeStyles.removeEventListener(WI.DOMNodeStyles.Event.Refreshed, onStylesRefreshed, this);
        validateSelectors();
    }

    WI.domTreeManager.requestDocument(function(documentNode) {
        WI.domTreeManager.querySelector(documentNode.id, ".bar", function(contentNodeId) {
            if (contentNodeId) {
                var domNode = WI.domTreeManager.nodeForId(contentNodeId);
                nodeStyles = WI.cssStyleManager.stylesForNode(domNode);

                if (nodeStyles.needsRefresh)
                    nodeStyles.addEventListener(WI.DOMNodeStyles.Event.Refreshed, onStylesRefreshed, this);
                else
                    validateSelectors();
            } else {
                InspectorTest.log("DOM node not found.");
                InspectorTest.completeTest();
            }
        });
    });
}
</script>
</head>
<body onload="runTest()">
    <p>Testing that we get expected values for selectors after a stylesheet has mutations.</p>
    <div class="bar"></div>
</body>
</html>
