Bug 1339007 - Replace async getEnabledStatus with initialProcessData for content process init, r?MattN draft
authorsteveck-chung <schung@mozilla.com>
Wed, 15 Feb 2017 18:33:52 +0800
changeset 487845 92a508eb1c0ec631dcf40720669b07c7c5a59b47
parent 487832 a180b976c165b6cd174d24bbb77941919cdc53cb
child 546576 0cc0251c5a4070d8b6902ae7e7e8d952aac6aeb3
push id46359
push userbmo:schung@mozilla.com
push dateWed, 22 Feb 2017 07:44:06 +0000
reviewersMattN
bugs1339007
milestone54.0a1
Bug 1339007 - Replace async getEnabledStatus with initialProcessData for content process init, r?MattN MozReview-Commit-ID: Eg0ulHpjpSL
browser/extensions/formautofill/FormAutofillContent.jsm
browser/extensions/formautofill/FormAutofillParent.jsm
browser/extensions/formautofill/test/unit/test_enabledStatus.js
--- a/browser/extensions/formautofill/FormAutofillContent.jsm
+++ b/browser/extensions/formautofill/FormAutofillContent.jsm
@@ -266,19 +266,20 @@ var FormAutofillContent = {
 
     Services.cpmm.addMessageListener("FormAutofill:enabledStatus", (result) => {
       if (result.data) {
         ProfileAutocomplete.ensureRegistered();
       } else {
         ProfileAutocomplete.ensureUnregistered();
       }
     });
-    Services.cpmm.sendAsyncMessage("FormAutofill:getEnabledStatus");
-    // TODO: use initialProcessData:
-    // Services.cpmm.initialProcessData.autofillEnabled
+
+    if (Services.cpmm.initialProcessData.autofillEnabled) {
+      ProfileAutocomplete.ensureRegistered();
+    }
   },
 
   /**
    * Get the input's information from cache which is created after page identified.
    *
    * @param {HTMLInputElement} element Focused input which triggered profile searching
    * @returns {Object|null}
    *          Return target input's information that cloned from content cache
--- a/browser/extensions/formautofill/FormAutofillParent.jsm
+++ b/browser/extensions/formautofill/FormAutofillParent.jsm
@@ -75,21 +75,20 @@ FormAutofillParent.prototype = {
     this._profileStore = new ProfileStorage(storePath);
     this._profileStore.initialize();
 
     Services.obs.addObserver(this, "advanced-pane-loaded", false);
 
     // Observing the pref and storage changes
     Services.prefs.addObserver(ENABLED_PREF, this, false);
     Services.obs.addObserver(this, "formautofill-storage-changed", false);
-    this._enabled = this._getStatus();
+
     // Force to trigger the onStatusChanged function for setting listeners properly
     // while initizlization
-    this._onStatusChanged();
-    Services.ppmm.addMessageListener("FormAutofill:getEnabledStatus", this);
+    this._setStatus(this._getStatus());
   },
 
   observe(subject, topic, data) {
     log.debug("observe:", topic, "with data:", data);
     switch (topic) {
       case "advanced-pane-loaded": {
         let formAutofillPreferences = new FormAutofillPreferences();
         let document = subject.document;
@@ -99,32 +98,30 @@ FormAutofillParent.prototype = {
         parentNode.insertBefore(prefGroup, insertBeforeNode);
         break;
       }
 
       case "nsPref:changed": {
         // Observe pref changes and update _enabled cache if status is changed.
         let currentStatus = this._getStatus();
         if (currentStatus !== this._enabled) {
-          this._enabled = currentStatus;
-          this._onStatusChanged();
+          this._setStatus(currentStatus);
         }
         break;
       }
 
       case "formautofill-storage-changed": {
         // Early exit if the action is not "add" nor "remove"
         if (data != "add" && data != "remove") {
           break;
         }
 
         let currentStatus = this._getStatus();
         if (currentStatus !== this._enabled) {
-          this._enabled = currentStatus;
-          this._onStatusChanged();
+          this._setStatus(currentStatus);
         }
         break;
       }
 
       default: {
         throw new Error(`FormAutofillParent: Unexpected topic observed: ${topic}`);
       }
     }
@@ -138,16 +135,19 @@ FormAutofillParent.prototype = {
     log.debug("_onStatusChanged: Status changed to", this._enabled);
     if (this._enabled) {
       Services.ppmm.addMessageListener("FormAutofill:GetProfiles", this);
     } else {
       Services.ppmm.removeMessageListener("FormAutofill:GetProfiles", this);
     }
 
     Services.ppmm.broadcastAsyncMessage("FormAutofill:enabledStatus", this._enabled);
+    // Sync process data autofillEnabled to make sure the value up to date
+    // no matter when the new content process is initialized.
+    Services.ppmm.initialProcessData.autofillEnabled = this._enabled;
   },
 
   /**
    * Query pref and storage status to determine the overall status for
    * form autofill feature.
    *
    * @returns {boolean} status of form autofill feature
    */
@@ -155,31 +155,37 @@ FormAutofillParent.prototype = {
     if (!Services.prefs.getBoolPref(ENABLED_PREF)) {
       return false;
     }
 
     return this._profileStore.getAll().length > 0;
   },
 
   /**
+   * Set status and trigger _onStatusChanged.
+   *
+   * @param {boolean} newStatus The latest status we want to set for _enabled
+   */
+  _setStatus(newStatus) {
+    this._enabled = newStatus;
+    this._onStatusChanged();
+  },
+
+  /**
    * Handles the message coming from FormAutofillContent.
    *
    * @param   {string} message.name The name of the message.
    * @param   {object} message.data The data of the message.
    * @param   {nsIFrameMessageManager} message.target Caller's message manager.
    */
   receiveMessage({name, data, target}) {
     switch (name) {
       case "FormAutofill:GetProfiles":
         this._getProfiles(data, target);
         break;
-      case "FormAutofill:getEnabledStatus":
-        Services.ppmm.broadcastAsyncMessage("FormAutofill:enabledStatus",
-                                            this._enabled);
-        break;
     }
   },
 
   /**
    * Returns the instance of ProfileStorage. To avoid syncing issues, anyone
    * who needs to access the profile should request the instance by this instead
    * of creating a new one.
    *
--- a/browser/extensions/formautofill/test/unit/test_enabledStatus.js
+++ b/browser/extensions/formautofill/test/unit/test_enabledStatus.js
@@ -3,60 +3,62 @@
  */
 
 "use strict";
 
 Cu.import("resource://formautofill/FormAutofillParent.jsm");
 
 add_task(function* test_enabledStatus_init() {
   let formAutofillParent = new FormAutofillParent();
-  sinon.spy(formAutofillParent, "_onStatusChanged");
+  sinon.spy(formAutofillParent, "_setStatus");
 
   // Default status is false before initialization
   do_check_eq(formAutofillParent._enabled, false);
+  do_check_eq(Services.ppmm.initialProcessData.autofillEnabled, undefined);
 
   formAutofillParent.init();
-  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+  do_check_eq(formAutofillParent._setStatus.called, true);
+  do_check_eq(Services.ppmm.initialProcessData.autofillEnabled, false);
 
   formAutofillParent._uninit();
 });
 
 add_task(function* test_enabledStatus_observe() {
   let formAutofillParent = new FormAutofillParent();
   sinon.stub(formAutofillParent, "_getStatus");
-  sinon.spy(formAutofillParent, "_onStatusChanged");
+  sinon.spy(formAutofillParent, "_setStatus");
 
   // _enabled = _getStatus() => No need to trigger onStatusChanged
   formAutofillParent._enabled = true;
   formAutofillParent._getStatus.returns(true);
   formAutofillParent.observe(null, "nsPref:changed", "browser.formautofill.enabled");
-  do_check_eq(formAutofillParent._onStatusChanged.called, false);
+  do_check_eq(formAutofillParent._setStatus.called, false);
 
   // _enabled != _getStatus() => Need to trigger onStatusChanged
   formAutofillParent._getStatus.returns(false);
   formAutofillParent.observe(null, "nsPref:changed", "browser.formautofill.enabled");
-  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+  do_check_eq(formAutofillParent._setStatus.called, true);
 
   // profile added => Need to trigger onStatusChanged
   formAutofillParent._getStatus.returns(!formAutofillParent._enabled);
-  formAutofillParent._onStatusChanged.reset();
+  formAutofillParent._setStatus.reset();
   formAutofillParent.observe(null, "formautofill-storage-changed", "add");
-  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+  do_check_eq(formAutofillParent._setStatus.called, true);
 
   // profile removed => Need to trigger onStatusChanged
   formAutofillParent._getStatus.returns(!formAutofillParent._enabled);
-  formAutofillParent._onStatusChanged.reset();
+  formAutofillParent._setStatus.reset();
   formAutofillParent.observe(null, "formautofill-storage-changed", "remove");
-  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+  do_check_eq(formAutofillParent._setStatus.called, true);
 
   // profile updated => no need to trigger onStatusChanged
   formAutofillParent._getStatus.returns(!formAutofillParent._enabled);
-  formAutofillParent._onStatusChanged.reset();
+  formAutofillParent._setStatus.reset();
   formAutofillParent.observe(null, "formautofill-storage-changed", "update");
-  do_check_eq(formAutofillParent._onStatusChanged.called, false);
+  do_check_eq(formAutofillParent._setStatus.called, false);
 });
 
 add_task(function* test_enabledStatus_getStatus() {
   let formAutofillParent = new FormAutofillParent();
   do_register_cleanup(function cleanup() {
     Services.prefs.clearUserPref("browser.formautofill.enabled");
   });
 
@@ -77,8 +79,24 @@ add_task(function* test_enabledStatus_ge
   // pref is enabled and profile is not empty.
   Services.prefs.setBoolPref("browser.formautofill.enabled", true);
   do_check_eq(formAutofillParent._getStatus(), true);
 
   // pref is disabled and profile is not empty.
   Services.prefs.setBoolPref("browser.formautofill.enabled", false);
   do_check_eq(formAutofillParent._getStatus(), false);
 });
+
+add_task(function* test_enabledStatus_setStatus() {
+  let formAutofillParent = new FormAutofillParent();
+  sinon.spy(formAutofillParent, "_onStatusChanged");
+
+  formAutofillParent._setStatus(true);
+  do_check_eq(formAutofillParent._enabled, true);
+  do_check_eq(Services.ppmm.initialProcessData.autofillEnabled, true);
+  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+
+  formAutofillParent._onStatusChanged.reset();
+  formAutofillParent._setStatus(false);
+  do_check_eq(formAutofillParent._enabled, false);
+  do_check_eq(Services.ppmm.initialProcessData.autofillEnabled, false);
+  do_check_eq(formAutofillParent._onStatusChanged.called, true);
+});