<!DOCTYPE html>
<html>
<head>
<style>
    .foo {}
</style>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test() {
    // FIXME: remove this once we know why this test is sometimes flaky.
    // See <https://www.webkit.org/b/148321> for more details.
    InspectorTest.dumpActivityToSystemConsole = true;

    var nodeStyles;
    var selectors = ["span.foo", "body > .foo"];
    var index = 0;

    function modifyRuleSelector(selector) {
        if (!nodeStyles.matchedRules.length) {
            InspectorTest.log("ERROR: missing matched rules");
            InspectorTest.completeTest();
            return;
        }

        var rule = nodeStyles.matchedRules[0];
        CSSAgent.setRuleSelector(rule.id, selector, function(error, payload) {
            if (error) {
                InspectorTest.log("ERROR: " + error);
                InspectorTest.completeTest();
                return;
            }

            var newSelector = payload.selectorList.text;
            InspectorTest.log("\nSelector before mutation: " + rule.selectorText);
            InspectorTest.log("Selector after mutation: " + newSelector);
            InspectorTest.assert(newSelector === selector, "FAIL: Selector " + newSelector + " should be updated to " + selector + ".");

            nodeStyles.refresh();
        });
    }

    // Every time the nodeStyles refreshes, attempt to change the selector
    // of the first rule to the next selector in the list.
    function onStylesRefreshed()
    {
        if (index >= selectors.length) {
            InspectorTest.completeTest();
            return;
        }

        modifyRuleSelector(selectors[index]);
        ++index;
    }

    WI.domManager.requestDocument(function(documentNode) {
        if (!documentNode) {
            InspectorTest.log("ERROR: document not found.");
            InspectorTest.completeTest();
            return;
        }

        WI.domManager.querySelector(documentNode.id, ".foo", function(contentNodeId) {
            if (!contentNodeId) {
                InspectorTest.log("ERROR: DOM node not found.");
                InspectorTest.completeTest();
                return;
            }

            var domNode = WI.domManager.nodeForId(contentNodeId);
            nodeStyles = WI.cssManager.stylesForNode(domNode);

            nodeStyles.addEventListener(WI.DOMNodeStyles.Event.Refreshed, onStylesRefreshed, this);
            if (!nodeStyles.needsRefresh)
                onStylesRefreshed();
        });
    });
}
</script>
</head>
<body onload="runTest()">
    <p>Testing that selectors are able to be modified more than once.</p>

    <span class="foo"></span>
</body>
</html>
