<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script>
function addExternalStyleSheet() {
    let link = document.createElement("link");
    link.id = "externalStyleSheetId";
    link.rel = "stylesheet";
    link.href = "resources/external.css";
    document.head.appendChild(link);
}

function removeExternalStyleSheet() {
    document.getElementById("externalStyleSheetId").remove();
}

function disableExternalStyleSheetViaMediaAttribute() {
    document.getElementById("externalStyleSheetId").media = "print";
}

function enableExternalStyleSheetViaMediaAttribute() {
    document.getElementById("externalStyleSheetId").media = "screen";
}

function addStyleTag() {
    let style = document.createElement("style");
    style.id = "inlineStyleId";
    style.textContent = "body { color: red; }";
    document.body.appendChild(style);
}

function removeStyleTag() {
    document.getElementById("inlineStyleId").remove();
}

function disableStyleSheet() {
    document.styleSheets[0].disabled = true;
}

function enableStyleSheet() {
    document.styleSheets[0].disabled = false;
}

function test()
{
    let suite = InspectorTest.createAsyncSuite("CSS.StyleSheetEvents.Basic");

    suite.addTestCase({
        name: "CheckNoStyleSheets",
        description: "Ensure there are currently no stylesheets.",
        test(resolve, reject) {
            InspectorTest.expectThat(WI.cssManager.styleSheets.length === 0, "Should be no stylesheets.");
            resolve();
        }
    });

    function appendStyleSheetTests(args) {
        let {title, addExpression, removeExpression, checkStyleSheetAddedCallback, checkStyleSheetRemovedCallback, extraEnableDisableTests} = args;

        let addedStyleSheet;

        suite.addTestCase({
            name: `Add${title}`,
            test(resolve, reject) {
                WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetAdded)
                .then((event) => {
                    addedStyleSheet = event.data.styleSheet;
                    InspectorTest.expectThat(addedStyleSheet instanceof WI.CSSStyleSheet, "StyleSheetAdded event should fire.");
                    if (checkStyleSheetRemovedCallback)
                        checkStyleSheetAddedCallback(addedStyleSheet);
                })
                .then(resolve, reject);

                InspectorTest.evaluateInPage(addExpression);
            }
        });

        suite.addTestCase({
            name: `Disable${title}`,
            description: "Disable the newly added stylesheet.",
            test(resolve, reject) {
                WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetRemoved)
                .then((event) => {
                    InspectorTest.assert(event.data.styleSheet instanceof WI.CSSStyleSheet, "Event data should be a CSSStyleSheet");
                    InspectorTest.expectThat(addedStyleSheet === event.data.styleSheet, "StyleSheetRemoved event should fire for the same CSSStyleSheet.");
                })
                .then(resolve, reject);

                InspectorTest.evaluateInPage("disableStyleSheet()");
            }
        });

        suite.addTestCase({
            name: `Enable${title}`,
            description: "Enable the just disabled stylesheet.",
            test(resolve, reject) {
                WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetAdded)
                .then((event) => {
                    InspectorTest.assert(event.data.styleSheet instanceof WI.CSSStyleSheet, "Event data should be a CSSStyleSheet");
                    InspectorTest.expectThat(addedStyleSheet !== event.data.styleSheet, "StyleSheetAdded event should fire with a new CSSStyleSheet.");
                    addedStyleSheet = event.data.styleSheet;
                })
                .then(resolve, reject);

                InspectorTest.evaluateInPage("enableStyleSheet()");
            }
        });

        if (extraEnableDisableTests) {
            let {title: extraDisableTitle, expression: extraDisableExpression} = extraEnableDisableTests.shift();
            let {title: extraEnableTitle, expression: extraEnableExpression} = extraEnableDisableTests.shift();

            suite.addTestCase({
                name: extraDisableTitle,
                test(resolve, reject) {
                    WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetRemoved)
                    .then((event) => {
                        InspectorTest.assert(event.data.styleSheet instanceof WI.CSSStyleSheet, "Event data should be a CSSStyleSheet");
                        InspectorTest.expectThat(addedStyleSheet === event.data.styleSheet, "StyleSheetRemoved event should fire for the same CSSStyleSheet.");
                    })
                    .then(resolve, reject);

                    InspectorTest.evaluateInPage(extraDisableExpression);
                }
            });

            suite.addTestCase({
                name: extraEnableTitle,
                test(resolve, reject) {
                    WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetAdded)
                    .then((event) => {
                        InspectorTest.assert(event.data.styleSheet instanceof WI.CSSStyleSheet, "Event data should be a CSSStyleSheet");
                        InspectorTest.expectThat(addedStyleSheet !== event.data.styleSheet, "StyleSheetAdded event should fire with a new CSSStyleSheet.");
                        addedStyleSheet = event.data.styleSheet;
                    })
                    .then(resolve, reject);

                    InspectorTest.evaluateInPage(extraEnableExpression);
                }
            });
        }

        suite.addTestCase({
            name: `Remove${title}`,
            test(resolve, reject) {
                WI.cssManager.awaitEvent(WI.CSSManager.Event.StyleSheetRemoved)
                .then((event) => {
                    InspectorTest.expectThat(event.data.styleSheet instanceof WI.CSSStyleSheet, "StyleSheetAdded event should fire.");
                    if (checkStyleSheetRemovedCallback)
                        checkStyleSheetRemovedCallback(event.data.styleSheet);
                    addedStyleSheet = null;
                })
                .then(resolve, reject);

                InspectorTest.evaluateInPage(removeExpression);
            }
        });
    }

    appendStyleSheetTests({
        title: "StyleTag",
        addExpression: "addStyleTag()",
        removeExpression: "removeStyleTag()",
    });

    appendStyleSheetTests({
        title: "ExternalStyleSheet",
        addExpression: "addExternalStyleSheet()",
        removeExpression: "removeExternalStyleSheet()",
        checkStyleSheetAddedCallback: (styleSheet) => { InspectorTest.log("Added StyleSheet with URL: " + sanitizeURL(styleSheet.url)); },
        checkStyleSheetRemovedCallback: (styleSheet) => { InspectorTest.log("Removed StyleSheet with URL: " + sanitizeURL(styleSheet.url)); },
        extraEnableDisableTests: [
            {title: "DisableExternalStyleSheetViaMediaAttribute", expression: "disableExternalStyleSheetViaMediaAttribute()"},
            {title: "EnableExternalStyleSheetViaMediaAttribute", expression: "enableExternalStyleSheetViaMediaAttribute()"},
        ],
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
    <p>Test for CSS.styleSheetAdded and CSS.styleSheetRemoved events.</p>
</body>
</html>
