<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/inspector-test.js"></script>
<script src="../debugger/resources/log-pause-location.js"></script>
<script src="resources/worker-utilities.js"></script>
<script>
TestPage.allowUncaughtExceptions = true;
TestPage.needToSanitizeUncaughtExceptionURLs = true;

let worker = new Worker("resources/worker-debugger-pause.js");

function test()
{
    let workerTarget = Array.from(WI.targets).find((target) => target.type === WI.TargetType.Worker);
    let workerDebuggerData = WI.debuggerManager.dataForTarget(workerTarget);
    if (!workerTarget) {
        InspectorTest.fail("Missing Worker Target");
        InspectorTest.completeTest();
        return;
    }

    // In each test, the Worker pauses and the Main Thread is waiting to
    // pause on the next statement. Do an InspectorTest.log, which evaluates
    // JavaScript in the page and should pause. Then later run work.
    // In WebKit1, because the VM is shared between the inspector and
    // inspected page we need to put an artificial break between our
    // Inspector JavaScript, the Page JavaScript, and back to the Inspector.
    function pauseTheMainThread() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                InspectorTest.log("");
                setTimeout(resolve);
            });
        });
    }

    WI.debuggerManager.uncaughtExceptionsBreakpoint.disabled = false;
    WI.debuggerManager.assertionFailuresBreakpoint.disabled = false;


    let suite = InspectorTest.createAsyncSuite("Worker.Debugger.Pause");

    suite.addTestCase({
        name: "Worker.Debugger.Pause.DebuggerStatement",
        description: "Worker should pause on debugger statement.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage(`worker.postMessage("triggerDebuggerStatement")`);
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                pauseTheMainThread().then(() => {
                    InspectorTest.pass("Paused");
                    InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame.");
                    InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.DebuggerStatement, "Pause reason should be a debugger statement.");
                    logPauseLocation();
                    WI.debuggerManager.resume().then(resolve, reject);
                });
            });
        }
    });

    suite.addTestCase({
        name: "Worker.Debugger.Pause.Breakpoint",
        description: "Worker should pause on breakpoint.",
        test(resolve, reject) {
            let location = workerTarget.mainResource.createSourceCodeLocation(8, 0);
            let breakpoint = new WI.Breakpoint(location);
            WI.debuggerManager.addBreakpoint(breakpoint);
            InspectorTest.evaluateInPage(`worker.postMessage("triggerBreakpoint")`);
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                pauseTheMainThread().then(() => {
                    InspectorTest.pass("Paused");
                    InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame.");
                    InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Breakpoint, "Pause reason should be a breakpoint.");
                    logPauseLocation();
                    WI.debuggerManager.resume().then(resolve, reject);
                });
            });
        }
    });

    suite.addTestCase({
        name: "Worker.Debugger.Pause.Exception",
        description: "Worker should pause on exception.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage(`worker.postMessage("triggerException")`);
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                pauseTheMainThread().then(() => {
                    InspectorTest.pass("Paused");
                    InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame.");
                    InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Exception, "Pause reason should be an exception.");
                    logPauseLocation();
                    WI.debuggerManager.resume().then(resolve, reject);
                });
            });
        }
    });

    suite.addTestCase({
        name: "Worker.Debugger.Pause.Assert",
        description: "Worker should pause on assert.",
        test(resolve, reject) {
            InspectorTest.evaluateInPage(`worker.postMessage("triggerAssertion")`);
            WI.debuggerManager.singleFireEventListener(WI.DebuggerManager.Event.Paused, (event) => {
                pauseTheMainThread().then(() => {
                    InspectorTest.pass("Paused");
                    InspectorTest.expectEqual(WI.debuggerManager.activeCallFrame.target, workerTarget, "Should be paused in a Worker CallFrame.");
                    InspectorTest.expectEqual(workerDebuggerData.pauseReason, WI.DebuggerManager.PauseReason.Assertion, "Pause reason should be an exception.");
                    logPauseLocation();
                    WI.debuggerManager.resume().then(resolve, reject);
                });
            });
        }
    });

    awaitTargetMainResource(workerTarget).then(() => {
        window.loadLinesFromSourceCode(workerTarget.mainResource).then(() => {
            suite.runTestCasesAndFinish();
        });
    });
}
</script>
</head>
<body onload="runTest()">
<p>Ensure we can pause in Workers.</p>
</body>
</html>
