Skip to content

Commit 6beef55

Browse files
authored
browser(firefox): wait for search and addon manager initialization (#4081)
It looks like terminating browser when search service or addon manager is not fully initialized results in a broken shutdown sequence. As of today, this results in multiple errors in the browser STDERR. In future, this might also result in browser stalling instead of terminating. This starts awaiting search and addon manager termination. References #3995
1 parent 3b42328 commit 6beef55

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

browser_patches/firefox/BUILD_NUMBER

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
1185
2-
Changed: [email protected] Wed Oct 7 08:45:05 PDT 2020
1+
1186
2+
Changed: [email protected] Wed Oct 7 09:26:45 PDT 2020

browser_patches/firefox/juggler/protocol/BrowserHandler.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
"use strict";
66

7+
const {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm");
78
const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
89
const {TargetRegistry} = ChromeUtils.import("chrome://juggler/content/TargetRegistry.js");
910
const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
@@ -45,6 +46,18 @@ class BrowserHandler {
4546

4647
for (const target of this._targetRegistry.targets())
4748
this._onTargetCreated(target);
49+
50+
// Wait to complete initialization of addon manager and search
51+
// service before returning from this method. Failing to do so will result
52+
// in a broken shutdown sequence and multiple errors in browser STDERR log.
53+
//
54+
// NOTE: we have to put this here instead of in the `Browser.close` handler
55+
// since browser shutdown can be initiated when the last tab is closed, e.g.
56+
// with persistent context.
57+
await Promise.all([
58+
waitForAddonManager(),
59+
waitForSearchService(),
60+
]);
4861
}
4962

5063
async ['Browser.createBrowserContext']({removeOnDetach}) {
@@ -243,6 +256,26 @@ class BrowserHandler {
243256
}
244257
}
245258

259+
async function waitForSearchService() {
260+
const searchService = Components.classes["@mozilla.org/browser/search-service;1"].getService(Components.interfaces.nsISearchService);
261+
await searchService.init();
262+
}
263+
264+
async function waitForAddonManager() {
265+
if (AddonManager.isReady)
266+
return;
267+
await new Promise(resolve => {
268+
let listener = {
269+
onStartup() {
270+
AddonManager.removeManagerListener(listener);
271+
resolve();
272+
},
273+
onShutdown() { },
274+
};
275+
AddonManager.addManagerListener(listener);
276+
});
277+
}
278+
246279
function nullToUndefined(value) {
247280
return value === null ? undefined : value;
248281
}

0 commit comments

Comments
 (0)