Bug 1459605 - Wait for all workers to have registrationActors before unregistering;r=ladybenko
MozReview-Commit-ID: 729BNJ1hWxC
--- a/devtools/client/application/test/head.js
+++ b/devtools/client/application/test/head.js
@@ -51,19 +51,25 @@ async function openNewTabAndApplicationP
await target.makeRemote();
let toolbox = await gDevTools.showToolbox(target, "application");
let panel = toolbox.getCurrentPanel();
return { panel, tab, target, toolbox };
}
async function unregisterAllWorkers(client) {
- info("Unregister all service workers");
+ info("Wait until all workers have a valid registrationActor");
+ let workers;
+ await asyncWaitUntil(async function() {
+ workers = await client.mainRoot.listAllWorkers();
+ const allWorkersRegistered =
+ workers.service.every(worker => !!worker.registrationActor);
+ return allWorkersRegistered;
+ });
- let { service } = await client.mainRoot.listAllWorkers();
-
- for (let worker of service) {
+ info("Unregister all service workers");
+ for (let worker of workers.service) {
await client.request({
to: worker.registrationActor,
type: "unregister"
});
}
}
--- a/devtools/client/shared/test/shared-head.js
+++ b/devtools/client/shared/test/shared-head.js
@@ -460,16 +460,29 @@ function waitUntil(predicate, interval =
return new Promise(resolve => {
setTimeout(function() {
waitUntil(predicate, interval).then(() => resolve(true));
}, interval);
});
}
/**
+ * Variant of waitUntil that accepts a predicate returning a promise.
+ */
+async function asyncWaitUntil(predicate, interval = 10) {
+ let success = await predicate();
+ while (!success) {
+ // Wait for X milliseconds.
+ await new Promise(resolve => setTimeout(resolve, interval));
+ // Test the predicate again.
+ success = await predicate();
+ }
+}
+
+/**
* Takes a string `script` and evaluates it directly in the content
* in potentially a different process.
*/
let MM_INC_ID = 0;
function evalInDebuggee(script, browser = gBrowser.selectedBrowser) {
return new Promise(resolve => {
let id = MM_INC_ID++;
let mm = browser.messageManager;