|
4 | 4 |
|
5 | 5 | "use strict";
|
6 | 6 |
|
| 7 | +const {AddonManager} = ChromeUtils.import("resource://gre/modules/AddonManager.jsm"); |
7 | 8 | const {Services} = ChromeUtils.import("resource://gre/modules/Services.jsm");
|
8 | 9 | const {TargetRegistry} = ChromeUtils.import("chrome://juggler/content/TargetRegistry.js");
|
9 | 10 | const {Helper} = ChromeUtils.import('chrome://juggler/content/Helper.js');
|
@@ -45,6 +46,18 @@ class BrowserHandler {
|
45 | 46 |
|
46 | 47 | for (const target of this._targetRegistry.targets())
|
47 | 48 | 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 | + ]); |
48 | 61 | }
|
49 | 62 |
|
50 | 63 | async ['Browser.createBrowserContext']({removeOnDetach}) {
|
@@ -243,6 +256,26 @@ class BrowserHandler {
|
243 | 256 | }
|
244 | 257 | }
|
245 | 258 |
|
| 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 | + |
246 | 279 | function nullToUndefined(value) {
|
247 | 280 | return value === null ? undefined : value;
|
248 | 281 | }
|
|
0 commit comments