Several tests introspect workers through the nsIWorkerDebuggerManager -- by
enumerating it, matching a worker by its (relative) script URL, or checking
process placement. With the parent-process RemoteWorkerDebugger on by default a
worker registers its debugger in the parent process, which reports the absolute
script URL, registers asynchronously over IPC, and (for content workers) is no
longer visible in the content-process manager. These tests assume the local
WorkerDebugger's synchronous, content-process, relative-URL behaviour and fail.
Pin dom.worker.remoteDebugger.enabled to false in these tests so they keep using
the local WorkerDebugger. These checks are debugger-location-dependent: the
legacy worker-introspection path still needs to be modernized to the
RemoteWorkerDebugger model, and each pin (or test) should be removed once the
local WorkerDebugger mechanism is removed:
- devtools/client/shared/test/browser_dbg_listworkers.js
- devtools/shared/webconsole/test/chrome/test_console_worker.html
- devtools/shared/webconsole/test/chrome/test_jsterm_autocomplete.html
- dom/workers/test/test_shutdownCheck.xhtml
- dom/workers/test/browser_privilegedmozilla_remoteworker.js
- dom/workers/test/browser_serviceworker_fetch_new_process.js
- dom/base/crashtests/eventSource_invalid_scheme_worker_shutdown.html
- toolkit/components/extensions/test/browser/browser_ext_background_serviceworker.js
The extension service-worker xpcshell helper (head_service_worker.js) is instead
updated to watch the parent-process WorkerDebuggerManager when the pref is on, so
test_ext_background_service_worker keeps working through the remote debugger
rather than being pinned.
dom_worker_helper.js matches a debugger by absolute or relative script URL (the
parent reports the absolute URL), and test_WorkerDebugger.xhtml only asserts
nsIWorkerDebugger.window for the local debugger, since a remote worker has no
window in the parent process.
Run the worker tests that exercise worker debugging under both pref values, so
both the local WorkerDebugger and the parent-process RemoteWorkerDebugger stay
covered on CI regardless of the channel default. dom_worker_helper.js gains an
addTaskWithBothWorkerDebuggers helper, and each of the following runs once with
dom.worker.remoteDebugger.enabled=false and once with it true:
- the WorkerDebugger* / WorkerDebuggerGlobalScope* chrome mochitests (except
test_WorkerDebugger_frozen.xhtml)
- dom/workers/test/browser_WorkerDebugger{,_waiting}.initialize.js
- devtools browser_worker_tracer.js and browser_target_command_tab_workers.js
- the WebDriver BiDi browser_WorkerListener_{chromeWorker,serviceWorker,
sharedWorker}.js tests
A few worker tests keep global state that does not reset cleanly between the two
runs -- browser_target_command_browser_workers.js enumerates every worker in the
browser and its parent-process workers linger, test_WorkerDebugger_frozen.xhtml
manipulates frozen/suspended state, and browser_WorkerListener.js drives multiple
tabs -- so they keep running at the channel default rather than twice.
Add tests covering the parent-process worker debugging that the
RemoteWorkerDebugger enables:
- browser_parent_worker_nested.js: a chrome worker and the nested worker it
spawns both register through the parent-process RemoteWorkerDebugger, and the
nested worker's debugger URL is resolved to an absolute URL.
- browser_resources_thread_states_parent_worker.js: THREAD_STATE resources let
DevTools interactively pause and resume a chrome worker via main-process
(Browser Toolbox) commands.
Differential Revision: https://phabricator.services.mozilla.com/D306652
71 lines
2.1 KiB
HTML
71 lines
2.1 KiB
HTML
<?xml version="1.0"?>
|
|
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
|
|
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
|
|
|
|
<window title="Worker shutdown check"
|
|
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
|
|
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
|
|
|
|
<!-- test results are displayed in the html:body -->
|
|
<body xmlns="http://www.w3.org/1999/xhtml">
|
|
</body>
|
|
|
|
<!-- test code goes here -->
|
|
<script type="application/javascript">
|
|
<![CDATA[
|
|
|
|
SimpleTest.waitForExplicitFinish()
|
|
|
|
const URL = "worker_shutdownCheck.js";
|
|
|
|
function checkWorker() {
|
|
const wdm = Cc["@mozilla.org/dom/workers/workerdebuggermanager;1"].
|
|
getService(Ci.nsIWorkerDebuggerManager);
|
|
|
|
let e = wdm.getWorkerDebuggerEnumerator();
|
|
while (e.hasMoreElements()) {
|
|
let dbg = e.getNext().QueryInterface(Ci.nsIWorkerDebugger);
|
|
if (dbg.url == URL) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
// This test synchronously enumerates the WorkerDebuggerManager right after
|
|
// creating the worker and matches the relative script URL. The parent-process
|
|
// RemoteWorkerDebugger registers asynchronously over IPC and reports the
|
|
// absolute script URL, so force the local WorkerDebugger (bug 1944240). Remove
|
|
// this pin (or the test) once the local WorkerDebugger mechanism is removed;
|
|
// this legacy synchronous worker-introspection path still needs to be
|
|
// modernized to the RemoteWorkerDebugger model.
|
|
SpecialPowers.pushPrefEnv({
|
|
set: [["dom.worker.remoteDebugger.enabled", false]],
|
|
}).then(() => new Promise(resolve => {
|
|
var w = new Worker(URL);
|
|
ok(checkWorker(), "We have the worker");
|
|
w.onmessage = () => { resolve(); }
|
|
})).then(() => {
|
|
info("Waiting...");
|
|
|
|
// We don't know if the worker thread is able to shutdown when calling
|
|
// CC/GC. Better to check again in case.
|
|
function checkGC() {
|
|
Cu.forceCC();
|
|
Cu.forceGC();
|
|
if (!checkWorker()) {
|
|
ok(true, "We don't have the worker");
|
|
SimpleTest.finish();
|
|
return;
|
|
}
|
|
setTimeout(checkGC, 200);
|
|
}
|
|
|
|
checkGC();
|
|
});
|
|
|
|
]]>
|
|
</script>
|
|
</window>
|