1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149
|
<?xml version="1.0"?>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<window title="Test for WorkerDebugger"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
<script src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>
<script type="application/javascript" src="dom_worker_helper.js"/>
<script type="application/javascript">
<![CDATA[
const WORKER_URL = "WorkerDebugger_worker.js";
const CHILD_WORKER_URL = "WorkerDebugger_childWorker.js";
const SHARED_WORKER_URL = "WorkerDebugger_sharedWorker.js";
add_task(
async function runTest() {
info("Create a top-level chrome worker that creates a non-top-level " +
"content worker and wait for their debuggers to be registered.");
let promise = waitForMultiple([
waitForRegister(WORKER_URL),
waitForRegister(CHILD_WORKER_URL)
]);
worker = new ChromeWorker(WORKER_URL, { name: "worker name" });
let [dbg, childDbg] = await promise;
info("Check that the top-level chrome worker debugger has the " +
"correct properties.");
is(dbg.isChrome, true,
"Chrome worker debugger should be chrome.");
is(dbg.parent, null,
"Top-level debugger should not have parent.");
is(dbg.type, Ci.nsIWorkerDebugger.TYPE_DEDICATED,
"Chrome worker debugger should be dedicated.");
is(dbg.window, window,
"Top-level dedicated worker debugger should have window.");
is(dbg.name, "worker name",
"Top-level worker name is exposed via name attribute.");
info("Check that the non-top-level content worker debugger has the " +
"correct properties.");
is(childDbg.isChrome, false,
"Content worker debugger should be content.");
is(childDbg.parent, dbg,
"Non-top-level worker debugger should have parent.");
is(childDbg.type, Ci.nsIWorkerDebugger.TYPE_DEDICATED,
"Content worker debugger should be dedicated.");
is(childDbg.window, window,
"Non-top-level worker debugger should have window.");
is(childDbg.name, "",
"Non-top-level worker doesn't have a custom name");
info("Terminate the top-level chrome worker and the non-top-level " +
"content worker, and wait for their debuggers to be " +
"unregistered and closed.");
promise = waitForMultiple([
waitForUnregister(CHILD_WORKER_URL),
waitForDebuggerClose(childDbg),
waitForUnregister(WORKER_URL),
waitForDebuggerClose(dbg),
]);
worker.terminate();
await promise;
info("Create a shared worker and wait for its debugger to be " +
"registered");
promise = waitForRegister(SHARED_WORKER_URL);
worker = new SharedWorker(SHARED_WORKER_URL);
let sharedDbg = await promise;
info("Check that the shared worker debugger has the correct " +
"properties.");
is(sharedDbg.isChrome, false,
"Shared worker debugger should be content.");
is(sharedDbg.parent, null,
"Shared worker debugger should not have parent.");
is(sharedDbg.type, Ci.nsIWorkerDebugger.TYPE_SHARED,
"Shared worker debugger should be shared.");
is(sharedDbg.window, null,
"Shared worker debugger should not have window.");
info("Create a shared worker with the same URL and check that its " +
"debugger is not registered again.");
let listener = {
onRegistered () {
ok(false,
"Shared worker debugger should not be registered again.");
},
};
wdm.addListener(listener);
let secondWorker = new SharedWorker(SHARED_WORKER_URL);
info("Send a message to the shared worker to tell it to close " +
"itself, and wait for its debugger to be closed.");
promise = waitForMultiple([
waitForUnregister(SHARED_WORKER_URL),
waitForDebuggerClose(sharedDbg)
]);
secondWorker.port.start();
secondWorker.port.postMessage("close");
await promise;
worker = null;
secondWorker = null;
info("Create a SharedWorker again for the infinite loop test.")
promise = waitForRegister(SHARED_WORKER_URL);
// Give it an explicit name so we don't reuse the above SharedWorker.
worker = new SharedWorker(SHARED_WORKER_URL, "loopy");
sharedDbg = await promise;
info("Send a message to the shared worker to tell it to close " +
"itself, then loop forever, and wait for its debugger to be closed.");
promise = waitForMultiple([
waitForUnregister(SHARED_WORKER_URL),
waitForDebuggerClose(sharedDbg)
]);
// When the closing process begins, we schedule a timer to terminate
// the worker in case it's in an infinite loop, which is exactly what
// we do in this test. The default delay is 30 seconds. This test
// previously waited 15 seconds for reasons that were poorly justified.
// We now set it to 100ms because we just want to make sure that the
// timeout mechanism to force cancellation from the parent properly
// works (as long as the parent thread isn't blocked).
await SpecialPowers.pushPrefEnv({"set": [[ "dom.worker.canceling.timeoutMilliseconds", 100 ]]});
worker.port.start();
worker.port.postMessage("close_loop");
await promise;
wdm.removeListener(listener);
}
);
]]>
</script>
<body xmlns="http://www.w3.org/1999/xhtml">
<p id="display"></p>
<div id="content" style="display:none;"></div>
<pre id="test"></pre>
</body>
<label id="test-result"/>
</window>
|