Bug 1458375 - Add a new browser-idle-startup-tasks-finished notification. r?felipe draft
authorMike Conley <mconley@mozilla.com>
Tue, 29 May 2018 12:47:54 -0400
changeset 806907 68b436d08670064db113b1819e7e344e5e27a190
parent 806906 3671cb4a05e726bd367dc0dcd42a60e78044caee
child 806908 4903d1de25ad8f6c26cba23bfde79dff87fad48c
push id112986
push usermconley@mozilla.com
push dateTue, 12 Jun 2018 19:30:14 +0000
reviewersfelipe
bugs1458375
milestone62.0a1
Bug 1458375 - Add a new browser-idle-startup-tasks-finished notification. r?felipe This notification fires when a browser window finishes running its idle tasks. Note that it might never run if every window goes away before the idle tasks can run. MozReview-Commit-ID: IEH98S29jhV
browser/base/content/browser.js
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -1156,16 +1156,17 @@ if (document.documentElement.getAttribut
 
 let _resolveDelayedStartup;
 var delayedStartupPromise = new Promise(resolve => {
   _resolveDelayedStartup = resolve;
 });
 
 var gBrowserInit = {
   delayedStartupFinished: false,
+  idleTasksFinished: false,
 
   _tabToAdopt: undefined,
 
   getTabToAdopt() {
     if (this._tabToAdopt !== undefined) {
       return this._tabToAdopt;
     }
 
@@ -1772,16 +1773,24 @@ var gBrowserInit = {
       try {
         DownloadsCommon.initializeAllDataLinks();
         ChromeUtils.import("resource:///modules/DownloadsTaskbar.jsm", {})
           .DownloadsTaskbar.registerIndicator(window);
       } catch (ex) {
         Cu.reportError(ex);
       }
     }, {timeout: 10000});
+
+    // This should always go last, since the idle tasks (except for the ones with
+    // timeouts) should execute in order. Note that this observer notification is
+    // not guaranteed to fire, since the window could close before we get here.
+    scheduleIdleTask(() => {
+      this.idleTasksFinished = true;
+      Services.obs.notifyObservers(window, "browser-idle-startup-tasks-finished");
+    });
   },
 
   // Returns the URI(s) to load at startup if it is immediately known, or a
   // promise resolving to the URI to load.
   get _uriToLoadPromise() {
     delete this._uriToLoadPromise;
     return this._uriToLoadPromise = function() {
       // window.arguments[0]: URI to load (string), or an nsIArray of