<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/log-pause-location.js"></script>
<script src="resources/source-map.js"></script>
<script>
function test()
{
    let suite = InspectorTest.createAsyncSuite("Debugger.setShouldBlackboxURL");

    const sourceMappingURL = "source-map.js.map";

    async function getSourceMap() {
        for (let sourceMap of WI.SourceMap.instances) {
            if (sourceMap.sourceMappingURL.endsWith(sourceMappingURL))
                return sourceMap
        }

        while (true) {
            let sourceMapAddedEvent = await WI.SourceCode.awaitEvent(WI.SourceCode.Event.SourceMapAdded);
            let {sourceMap} = sourceMapAddedEvent.data;
            if (sourceMap.sourceMappingURL.endsWith(sourceMappingURL))
                return sourceMap;
        }
    }

    async function getResources() {
        let sourceMap = await getSourceMap();

        let inner = sourceMap.resources.find((resource) => resource.url.endsWith("inner.js"));
        let middle = sourceMap.resources.find((resource) => resource.url.endsWith("middle.js"));
        let outer = sourceMap.resources.find((resource) => resource.url.endsWith("outer.js"));
        InspectorTest.assert(inner && middle && outer, "All resources should exist when the WI.SourceMap is added.");
        return {inner, middle, outer};
    }

    WI.debuggerManager.addEventListener(WI.DebuggerManager.Event.CallFramesDidChange, (event) => {
        if (!WI.debuggerManager.activeCallFrame)
            return;
        logPauseLocation();
        WI.debuggerManager.stepInto();
    });

    suite.addTestCase({
        name: "Debugger.setShouldBlackboxURL.SourceMap.Pause.inner.Blackbox.inner",
        async test() {
            InspectorTest.log("Fetching scripts...");
            let {inner} = await getResources();

            InspectorTest.log("Blackboxing script...");
            WI.debuggerManager.setShouldBlackboxScript(inner, true);

            InspectorTest.log("Finding pause location...");
            let location = inner.createSourceCodeLocation(1, 0); // first line of `inner`

            InspectorTest.log("Creating breakpoint...");
            let breakpoint = new WI.JavaScriptBreakpoint(location);

            InspectorTest.log("Adding breakpoint...");
            WI.debuggerManager.addBreakpoint(breakpoint);

            InspectorTest.log("Triggering pause...");
            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Resumed),
                InspectorTest.evaluateInPage(`outer(42)`),
            ]);

            InspectorTest.log("Removing breakpoint...");
            WI.debuggerManager.removeBreakpoint(breakpoint);

            InspectorTest.log("Unblackboxing script...");
            WI.debuggerManager.setShouldBlackboxScript(inner, false);
        },
    });

    suite.addTestCase({
        name: "Debugger.setShouldBlackboxURL.SourceMap.Pause.inner.Blackbox.middle",
        async test() {
            InspectorTest.log("Fetching scripts...");
            let {inner} = await getResources();

            InspectorTest.log("Finding pause location...");
            let location = inner.createSourceCodeLocation(1, 0); // first line of `inner`

            InspectorTest.log("Creating breakpoint...");
            let breakpoint = new WI.JavaScriptBreakpoint(location);

            InspectorTest.log("Adding breakpoint...");
            WI.debuggerManager.addBreakpoint(breakpoint);

            InspectorTest.log("Triggering pause...");
            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Resumed),
                InspectorTest.evaluateInPage(`outer(42)`),
            ]);

            InspectorTest.log("Removing breakpoint...");
            WI.debuggerManager.removeBreakpoint(breakpoint);
        },
    });

    suite.addTestCase({
        name: "Debugger.setShouldBlackboxURL.SourceMap.Pause.inner.Blackbox.outer",
        async test() {
            InspectorTest.log("Fetching scripts...");
            let {inner, outer} = await getResources();

            InspectorTest.log("Blackboxing script...");
            WI.debuggerManager.setShouldBlackboxScript(outer, true);

            InspectorTest.log("Finding pause location...");
            let location = inner.createSourceCodeLocation(1, 0); // first line of `inner`

            InspectorTest.log("Creating breakpoint...");
            let breakpoint = new WI.JavaScriptBreakpoint(location);

            InspectorTest.log("Adding breakpoint...");
            WI.debuggerManager.addBreakpoint(breakpoint);

            InspectorTest.log("Triggering pause...");
            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Resumed),
                InspectorTest.evaluateInPage(`outer(42)`),
            ]);

            InspectorTest.log("Removing breakpoint...");
            WI.debuggerManager.removeBreakpoint(breakpoint);

            InspectorTest.log("Unblackboxing script...");
            WI.debuggerManager.setShouldBlackboxScript(outer, false);
        },
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests Debugger.setShouldBlackboxURL.</p>
</body>
</html>
