gecko-dev/dom/workers/test/test_WorkerDebuggerManager.xhtml
Andrew Sutherland 8fe3655427 Bug 1454935 - Fix and re-enable test_WorkerDebugger(Manager).xhtml r=dom-worker-reviewers,smaug
Building on my changes in bug 1828084, we:
- Leverage the changes to `dom_worker_helper.js`'s waitForMultiple to
  moot erroneous ordering dependencies.
- Modernize the tests to use add_task so thrown exceptions turn into
  rejections that the test framework can experience.
- Avoid a potential GC race involving the creation of a SharedWorker by
  ensuring that we root both workers.
- Avoid a potential SharedWorker creation race where the test wants to
  create a new SharedWorker but could potentially catch the previous
  SharedWorker with the same script URL by using a name for the
  SharedWorker.
- Reduce the arbitrary choice of 15 seconds for the worker
  self-cancellation-on-close behavior to 100ms because there was no
  meaningful reason to take so long.

Both now pass --verify locally for me.

Differential Revision: https://phabricator.services.mozilla.com/D191823
2023-10-28 00:29:52 +00:00

100 lines
3.8 KiB
HTML

<?xml version="1.0"?>
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/
-->
<window title="Test for WorkerDebuggerManager"
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 = "WorkerDebuggerManager_worker.js";
const CHILD_WORKER_URL = "WorkerDebuggerManager_childWorker.js";
add_task(
async function runTest() {
info("Check that worker debuggers are not enumerated before they are " +
"registered.");
ok(!findDebugger(WORKER_URL),
"Worker debugger should not be enumerated before it is registered.");
ok(!findDebugger(CHILD_WORKER_URL),
"Child worker debugger should not be enumerated before it is " +
"registered.");
info("Create a worker that creates a child worker, and wait for " +
"their debuggers to be registered.");
let promise = waitForMultiple([
waitForRegister(WORKER_URL),
waitForRegister(CHILD_WORKER_URL)
]);
let worker = new Worker(WORKER_URL);
let [dbg, childDbg] = await promise;
info("Check that worker debuggers are enumerated after they are " +
"registered.");
ok(findDebugger(WORKER_URL),
"Worker debugger should be enumerated after it is registered.");
ok(findDebugger(CHILD_WORKER_URL),
"Child worker debugger should be enumerated after it is " +
"registered.");
info("Check that worker debuggers are not closed before they are " +
"unregistered.");
is(dbg.isClosed, false,
"Worker debugger should not be closed before it is unregistered.");
is(childDbg.isClosed, false,
"Child worker debugger should not be closed before it is " +
"unregistered");
info("Terminate the worker and the child worker, and wait for their " +
"debuggers to be unregistered.");
promise = waitForMultiple([
waitForUnregister(CHILD_WORKER_URL),
waitForUnregister(WORKER_URL),
]);
worker.terminate();
await promise;
info("Check that worker debuggers are not enumerated after they are " +
"unregistered.");
ok(!findDebugger(WORKER_URL),
"Worker debugger should not be enumerated after it is " +
"unregistered.");
ok(!findDebugger(CHILD_WORKER_URL),
"Child worker debugger should not be enumerated after it is " +
"unregistered.");
info("Check that worker debuggers are closed after they are " +
"unregistered.");
is(dbg.isClosed, true,
"Worker debugger should be closed after it is unregistered.");
is(childDbg.isClosed, true,
"Child worker debugger should be closed after it is unregistered.");
info("Check that property accesses on worker debuggers throws " +
"after they are closed.");
assertThrows(() => dbg.url,
"Property accesses on worker debugger should throw " +
"after it is closed.");
assertThrows(() => childDbg.url,
"Property accesses on child worker debugger should " +
"throw after it is closed.");
}
);
]]>
</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>