<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function test()
{
    let nodeStyles = null;
    let suite = InspectorTest.createAsyncSuite("NodeStylesRefreshed");

    suite.addTestCase({
        name: "NodeStylesRefreshed.ClassAdded",
        async test() {
            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() {
            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() {
            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() {
            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();
        }
    });

    WI.domManager.requestDocument((documentNode) => {
        documentNode.querySelector("body", (contentNodeId) => {
            if (contentNodeId) {
                let domNode = WI.domManager.nodeForId(contentNodeId);
                nodeStyles = WI.cssManager.stylesForNode(domNode);

                nodeStyles.refreshIfNeeded().then(function() {
                    suite.runTestCasesAndFinish();
                });
            } else {
                InspectorTest.fail("DOM node not found.");
                InspectorTest.completeTest();
            }
        });
    });
}
</script>
</head>
<body onLoad="runTest()" class="foo bar">
<p>Testing that WI.DOMNodeStyles.Event.Refreshed event dispatches with correct significantChange flag.</p>
<style>
.foo {font-size: 12px;}
.bar {background: lightyellow;}
.baz {color: darkgreen;}
</style>
</body>
</html>
