Bug 1339007 - Replace async getEnabledStatus with initialProcessData for content process init, r?MattN
MozReview-Commit-ID: Eg0ulHpjpSL
--- 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);
+});