<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function removeRemovableNode()
{
    window.__removableNode = document.getElementById("removable-node");
    window.__removableNode.remove();
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("NodeStylesRefreshed");

    async function nodeStylesForSelector(selector) {
        let documentNode = await WI.domManager.requestDocument();
        let nodeId = await documentNode.querySelector(selector);
        let node = WI.domManager.nodeForId(nodeId);

        let nodeStyles = WI.cssManager.stylesForNode(node);
        await nodeStyles.refreshIfNeeded();

        return nodeStyles;
    }

    suite.addTestCase({
        name: "NodeStylesRefreshed.ClassAdded",
        async test() {
            let nodeStyles = await nodeStylesForSelector("body");

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectTrue(event.data.significantChange, `Adding '.baz' class should cause a significant change.`);
            });

            InspectorTest.evaluateInPage(`document.body.classList.add("baz")`);
            await nodeStyles.refresh();
        }
    });

    suite.addTestCase({
        name: "NodeStylesRefreshed.ClassRemoved",
        async test() {
            let nodeStyles = await nodeStylesForSelector("body");

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectTrue(event.data.significantChange, `Removing '.foo' class should cause a significant change.`);
            });

            InspectorTest.evaluateInPage(`document.body.classList.remove("foo")`);
            await nodeStyles.refresh();
        }
    });

    suite.addTestCase({
        name: "NodeStylesRefreshed.IrrelevantClassAdded",
        async test() {
            let nodeStyles = await nodeStylesForSelector("body");

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectFalse(event.data.significantChange, `Adding '.blah' class shouldn't cause a significant change.`);
            });

            InspectorTest.evaluateInPage(`document.body.classList.add("blah")`);
            await nodeStyles.refresh();
        }
    });

    suite.addTestCase({
        name: "NodeStylesRefreshed.IrrelevantClassRemoved",
        async test() {
            let nodeStyles = await nodeStylesForSelector("body");

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectFalse(event.data.significantChange, `Removing '.blah' class shouldn't cause a significant change.`);
            });

            InspectorTest.evaluateInPage(`document.body.classList.remove("blah")`);
            await nodeStyles.refresh();
        }
    });

    suite.addTestCase({
        name: "NodeStylesRefreshed.DisconnectedNode",
        description: "Ensure that changing the style of a disconnected node does not crash.",
        async test() {
            let nodeStyles = await nodeStylesForSelector("#removable-node");

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectFalse(event.data.significantChange, `Refreshing styles of an unchanged node should not be a significant change.`);
            });

            InspectorTest.log("Refreshing styles before removal.")
            await nodeStyles.refresh();

            nodeStyles.singleFireEventListener(WI.DOMNodeStyles.Event.Refreshed, (event) => {
                InspectorTest.expectTrue(event.data.significantChange, `Refreshing styles of a now detached node should be a significant change.`);
            });

            InspectorTest.log("Removing node from DOM tree.")
            InspectorTest.evaluateInPage(`removeRemovableNode();`);

            InspectorTest.log("Refreshing styles after removal.")
            await nodeStyles.refresh();
        }
    });

    suite.runTestCasesAndFinish();

}
</script>
</head>
<body onLoad="runTest()" class="foo bar">
<p>Testing that WI.DOMNodeStyles.Event.Refreshed event dispatches with correct significantChange flag.</p>
<div id="removable-node" class="foo bar"></div>
<style>
.foo {font-size: 12px;}
.bar {background: lightyellow;}
.baz {color: darkgreen;}
</style>
</body>
</html>
