<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../debugger/resources/log-active-stack-trace.js"></script>
<script>

function getProperty(name) {
    let node = document.getElementById("test");
    return node.style.getPropertyValue(name);
}

function setProperty(name, value) {
    let node = document.getElementById("test");
    if (value)
        node.style.setProperty(name, value);
    else
        node.style.removeProperty(name);
}

function test()
{
    InspectorTest.debug();

    let suite = InspectorTest.createAsyncSuite("DOMBreakpoints.AttributeModified.Style");

    async function checkPropertyValue(name, expectedValue) {
        InspectorTest.log(`Getting '${name}'...`);
        let value = await InspectorTest.evaluateInPage(`getProperty("${name}")`);
        InspectorTest.expectEqual(value, expectedValue, `'${name}' should have the value '${expectedValue}'.`);
    }

    function addTestCase({name, propertyName, propertyValueBefore, propertyValueAfter}) {
        suite.addTestCase({
            name,
            async test() {
                await checkPropertyValue(propertyName, propertyValueBefore);

                let pausedPromise = WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused);

                if (propertyValueAfter)
                    InspectorTest.log(`Setting '${propertyName}: ${propertyValueAfter};'...`);
                else
                    InspectorTest.log(`Removing '${propertyName}'...`);
                let evaluatePromise = InspectorTest.evaluateInPage(`setProperty("${propertyName}", "${propertyValueAfter}")`);

                await pausedPromise;
                InspectorTest.pass("Paused.");

                await checkPropertyValue(propertyName, propertyValueBefore);

                await WI.debuggerManager.resume();
                InspectorTest.pass("Resumed.");

                await evaluatePromise;

                await checkPropertyValue(propertyName, propertyValueAfter);
            },
        });
    }

    addTestCase({
        name: "DOMBreakpoints.AttributeModified.Style.Add",
        propertyName: "display",
        propertyValueBefore: "",
        propertyValueAfter: "none",
    });
    addTestCase({
        name: "DOMBreakpoints.AttributeModified.Style.ReplaceSame",
        propertyName: "display",
        propertyValueBefore: "none",
        propertyValueAfter: "none",
    });
    addTestCase({
        name: "DOMBreakpoints.AttributeModified.Style.ReplaceDifferent",
        propertyName: "display",
        propertyValueBefore: "none",
        propertyValueAfter: "block",
    });
    addTestCase({
        name: "DOMBreakpoints.AttributeModified.Style.Remove",
        propertyName: "display",
        propertyValueBefore: "block",
        propertyValueAfter: "",
    });

    suite.addTestCase({
        name: "DOMBreakpoints.AttributeModified.Style.Text",
        async test() {
            await checkPropertyValue("display", "");

            let pausedPromise = WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused);

            InspectorTest.log(`Setting style text to ''...`);
            let evaluatePromise = InspectorTest.evaluateInPage(`document.getElementById("test").style.cssText = "display: none;";`);

            await pausedPromise;
            InspectorTest.pass("Paused.");

            await checkPropertyValue("display", "");

            await WI.debuggerManager.resume();
            InspectorTest.pass("Resumed.");

            await evaluatePromise;

            await checkPropertyValue("display", "none");
        },
    });

    WI.domManager.requestDocument((documentNode) => {
        if (!documentNode) {
            InspectorTest.fail("Missing document node");
            InspectorTest.completeTest();
            return;
        }

        WI.domManager.querySelector(documentNode.id, "#test", async (nodeId) => {
            let testNode = WI.domManager.nodeForId(nodeId);
            if (!testNode) {
                InspectorTest.fail("Missing #test node");
                InspectorTest.completeTest();
                return;
            }

            let promise = WI.domDebuggerManager.awaitEvent(WI.DOMDebuggerManager.Event.DOMBreakpointAdded)
            .then((event) => {
                InspectorTest.pass("Added attribute modified breakpoint to #test.");
            });

            InspectorTest.log("Adding attribute modified breakpoint to #test...");
            WI.domDebuggerManager.addDOMBreakpoint(new WI.DOMBreakpoint(testNode, WI.DOMBreakpoint.Type.AttributeModified));
            await promise;

            InspectorTest.assert(!WI.debuggerManager.paused, "Should not be paused.");

            suite.runTestCasesAndFinish();
        });
    });
}
</script>
</head>
<body onload="runTest()">
    <p>Tests functionality of attribute modified DOM breakpoints when modifying the inline style attribute.</p>
    <div id="test"></div>
</body>
</html>
