<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
let worker;
let expectingWorkerMessage = false;

function createWorker() {
    log("PAGE: Creating the worker.");
    worker = new Worker("resources/worker-1.js");
    worker.postMessage("hello");
    worker.onmessage = function(event) {
        if (expectingWorkerMessage) {
            log("PASS: Worker recovered.");
            testRunner.notifyDone();
        } else {
            log("FAIL: Worker should have been paused!");
            log(event.data);
            testRunner.notifyDone();
        }
    }
}

function closeInspectorFrontendAndCompleteTest() {
    log("PAGE: Closing the inspector.");
    expectingWorkerMessage = true;
    window.internals.closeDummyInspectorFrontend();
    setTimeout(() => {
        log("FAIL: Never received message!");
        testRunner.notifyDone();
    }, 1000);
}

function test()
{
    let workerId;

    let suite = ProtocolTest.createAsyncSuite("Worker.CreateAndTerminate");

    suite.addTestCase({
        name: "Worker.enable",
        description: "Worker.enable informs the frontend of the two existing Workers",
        test(resolve, reject) {
            InspectorProtocol.awaitCommand({method: "Worker.enable", params: {}});
            ProtocolTest.evaluateInPage("createWorker()");
            InspectorProtocol.awaitEvent({event: "Worker.workerCreated"}).then((messageObject) => {
                ProtocolTest.pass("Worker.workerCreated");

                // Give the worker 50ms to prove it is waiting for Inspection initialization
                // and is unable to message the page. Closing the inspector, the Worker should
                // recover and resume execution.
                setTimeout(() => {
                    ProtocolTest.evaluateInPage("closeInspectorFrontendAndCompleteTest()");
                }, 50);
            }).catch(reject);
        }
    });

    suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="runTest()">
<p>Tests that a Worker recovers and resumes if Web Inspector closes before sending Worker.initialized.</p>
</body>
</html>
