<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="resources/log-active-stack-trace.js"></script>
<script src="resources/nested-calls.js"></script>
<script>
function test()
{
    InspectorTest.debug();
    let suite = InspectorTest.createAsyncSuite("Breakpoint.Resolve");

    suite.addTestCase({
        name: "Breakpoint.Resolve.WhenScriptAdded",
        description: "Test that breakpoints already sent to the backend automatically resolve when scripts matching that breakpoint are loaded.",
        async test() {
            InspectorTest.log("Waiting for script...");
            let script = await new Promise((resolve, reject) => {
                for (let resource of WI.networkManager.mainFrame.resourceCollection) {
                    if (resource.url.endsWith("resources/nested-calls.js")) {
                        resolve(resource);
                        return;
                    }
                }

                let listener = WI.networkManager.mainFrame.addEventListener(WI.Frame.Event.ResourceWasAdded, (event) => {
                    if (event.resource.url.endsWith("resources/nested-calls.js")) {
                        WI.networkManager.mainFrame.removeEventListener(WI.Frame.Event.ResourceWasAdded, listener);
                        resolve(event.resource);
                    }
                });
            });
            InspectorTest.pass("Found script.");

            let breakpoint = new WI.JavaScriptBreakpoint(script.createSourceCodeLocation(7, 0));

            InspectorTest.log("Adding breakpoint...");
            let breakpoingResolvedStateDidChangePromise = breakpoint.awaitEvent(WI.JavaScriptBreakpoint.Event.ResolvedStateDidChange);
            WI.debuggerManager.addBreakpoint(breakpoint);
            await breakpoingResolvedStateDidChangePromise;
            InspectorTest.assert(breakpoint.resolved, "Breakpoint should be resolved.");

            InspectorTest.log("Reloading page...");
            await Promise.all([
                WI.debuggerManager.awaitEvent(WI.DebuggerManager.Event.Paused),
                InspectorTest.reloadPage(),
            ]);
            InspectorTest.pass("Paused");
            logActiveStackTrace();

            InspectorTest.log("Removing breakpoint...");
            breakpoint.remove();

            InspectorTest.log("Resuming...");
            await WI.debuggerManager.resume();
        },
   });

   suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests for breakpoint resolving behavior.</p>
</body>
</html>
