Bug 1390433 - (From 1388078)Form Autofill: Delay adding the AOM upgrade listener until the XPI DB is loaded. draft
authorMatthew Noorenberghe <mozilla@noorenberghe.ca>
Thu, 10 Aug 2017 21:32:07 -0700
changeset 648821 6a24d91ffc94f8f9c20d81356da46175efa0f3cf
parent 648820 6f0432989960b1b0016bedf2d3e7f4ca43252d71
child 648822 2385f4af3c4eeda2c12650a1b73bbe4611a0d793
push id74896
push userschung@mozilla.com
push dateFri, 18 Aug 2017 10:48:05 +0000
bugs1390433, 1388078
milestone56.0
Bug 1390433 - (From 1388078)Form Autofill: Delay adding the AOM upgrade listener until the XPI DB is loaded. MozReview-Commit-ID: CPeAOrWhEVu
browser/extensions/formautofill/bootstrap.js
--- a/browser/extensions/formautofill/bootstrap.js
+++ b/browser/extensions/formautofill/bootstrap.js
@@ -9,16 +9,18 @@
 const {classes: Cc, interfaces: Ci, results: Cr, utils: Cu} = Components;
 const STYLESHEET_URI = "chrome://formautofill/content/formautofill.css";
 const CACHED_STYLESHEETS = new WeakMap();
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetter(this, "AddonManager", "resource://gre/modules/AddonManager.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "AddonManagerPrivate",
+                                  "resource://gre/modules/AddonManager.jsm");
 XPCOMUtils.defineLazyModuleGetter(this, "FormAutofillParent",
                                   "resource://formautofill/FormAutofillParent.jsm");
 
 function insertStyleSheet(domWindow, url) {
   let doc = domWindow.document;
   let styleSheetAttr = `href="${url}" type="text/css"`;
   let styleSheet = doc.createProcessingInstruction("xml-stylesheet", styleSheetAttr);
 
@@ -36,27 +38,39 @@ function onMaybeOpenPopup(evt) {
   if (CACHED_STYLESHEETS.has(domWindow)) {
     // This window already has autofill stylesheets.
     return;
   }
 
   insertStyleSheet(domWindow, STYLESHEET_URI);
 }
 
+function addUpgradeListener(instanceID) {
+  AddonManager.addUpgradeListener(instanceID, upgrade => {
+    // don't install the upgrade by doing nothing here.
+    // The upgrade will be installed upon next restart.
+  });
+}
+
 function startup(data) {
   if (Services.prefs.getStringPref("extensions.formautofill.available") != "on") {
     Services.prefs.clearUserPref("dom.forms.autocomplete.formautofill");
     return;
   }
 
   if (data.hasOwnProperty("instanceID") && data.instanceID) {
-    AddonManager.addUpgradeListener(data.instanceID, (upgrade) => {
-      // don't install the upgrade by doing nothing here.
-      // The upgrade will be installed upon next restart.
-    });
+    if (AddonManagerPrivate.isDBLoaded()) {
+      addUpgradeListener(data.instanceID);
+    } else {
+      // Wait for the extension database to be loaded so we don't cause its init.
+      Services.obs.addObserver(function xpiDatabaseLoaded() {
+        Services.obs.removeObserver(xpiDatabaseLoaded, "xpi-database-loaded");
+        addUpgradeListener(data.instanceID);
+      }, "xpi-database-loaded");
+    }
   } else {
     throw Error("no instanceID passed to bootstrap startup");
   }
 
   // This pref is used for web contents to detect the autocomplete feature.
   // When it's true, "element.autocomplete" will return tokens we currently
   // support -- otherwise it'll return an empty string.
   Services.prefs.setBoolPref("dom.forms.autocomplete.formautofill", true);