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

function removeSubframe() {
    document.getElementById("subframe").remove();
}

function test()
{
    function logStyleSheets() {
        WI.cssStyleManager.styleSheets.sort((a, b) => a.url.localeCompare(b.url)).forEach((styleSheet) => {
            let frameString = styleSheet.parentFrame.id === WI.frameResourceManager.mainFrame.id ? "<mainframe>" : "<childframe>";
            InspectorTest.log(`URL: ${sanitizeURL(styleSheet.url)} ${frameString}`);
        });
    }

    let suite = InspectorTest.createAsyncSuite("CSS.StyleSheetEvents.MultipleDocuments");

    suite.addTestCase({
        name: "CheckStyleSheets",
        description: "Ensure there is currently one stylesheet.",
        test(resolve, reject) {
            InspectorTest.expectThat(WI.cssStyleManager.styleSheets.length === 1, "Should be one stylesheets.");
            logStyleSheets();
            resolve();
        }
    });

    suite.addTestCase({
        name: "CheckStyleSheetsAfterAddingSubframe",
        description: "Ensure subframe stylesheets are added.",
        test(resolve, reject) {
            WI.cssStyleManager.awaitEvent(WI.CSSStyleManager.Event.StyleSheetAdded)
            .then((event) => {
                InspectorTest.expectThat(WI.cssStyleManager.styleSheets.length === 2, "Should be two stylesheets.");
                InspectorTest.expectThat(event.data.styleSheet.parentFrame !== WI.frameResourceManager.mainFrame.id, "New StyleSheet is for a subframe");
                logStyleSheets();
            })
            .then(resolve, reject);

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

    suite.addTestCase({
        name: "CheckStyleSheetsAfterRemovingSubframe",
        description: "Ensure subframe stylesheets are removed.",
        test(resolve, reject) {
            WI.cssStyleManager.awaitEvent(WI.CSSStyleManager.Event.StyleSheetRemoved)
            .then((event) => {
                InspectorTest.expectThat(WI.cssStyleManager.styleSheets.length === 1, "Should be one stylesheet.");
                InspectorTest.expectThat(event.data.styleSheet.parentFrame !== WI.frameResourceManager.mainFrame.id, "Removed StyleSheet is for a subframe");
                logStyleSheets();
            })
            .then(resolve, reject);

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

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