Bug 1460046 - Make child modules behave the same way as parent modules; r?esawin
Update content modules to use the "GeckoView:UpdateModuleState" message
instead of "GeckoView:Register"/"GeckoView:Unregister", similar to what
we already do for parent modules. Also only call onSettingsUpdate in
content module when the module is enabled, similar to what we already do
for parent modules.
MozReview-Commit-ID: C30W9iEd7Rz
--- a/mobile/android/chrome/geckoview/geckoview.js
+++ b/mobile/android/chrome/geckoview/geckoview.js
@@ -79,23 +79,23 @@ var ModuleManager = {
this._modules.forEach(aCallback, this);
},
_updateSettings(aSettings) {
Object.assign(this._settings, aSettings);
this._frozenSettings = Object.freeze(Object.assign({}, this._settings));
this.forEach(module => {
- if (!module.enabled) {
- return;
+ if (module.enabled) {
+ module.impl.onSettingsUpdate();
}
- module.impl.onSettingsUpdate();
- this._browser.messageManager.sendAsyncMessage("GeckoView:UpdateSettings",
- this._settings);
});
+
+ this._browser.messageManager.sendAsyncMessage("GeckoView:UpdateSettings",
+ aSettings);
},
onEvent(aEvent, aData, aCallback) {
switch (aEvent) {
case "GeckoView:UpdateModuleState": {
const module = this._modules.get(aData.module);
if (module) {
module.enabled = aData.enabled;
@@ -170,32 +170,31 @@ class ModuleInfo {
}
set enabled(aEnabled) {
if (aEnabled === this._enabled) {
return;
}
if (!aEnabled) {
- this._manager.messageManager.sendAsyncMessage("GeckoView:Unregister", {
- module: this._name,
- });
this._impl.onDisable();
}
this._enabled = aEnabled;
if (aEnabled) {
this._impl.onEnable();
this._impl.onSettingsUpdate();
- this._manager.messageManager.sendAsyncMessage("GeckoView:Register", {
- module: this._name,
- settings: this._manager.settings,
- });
}
+
+ this._manager.messageManager.sendAsyncMessage("GeckoView:UpdateModuleState", {
+ module: this._name,
+ enabled: aEnabled,
+ settings: aEnabled ? this._manager.settings : null,
+ });
}
}
function createBrowser() {
const browser = window.browser = document.createElement("browser");
browser.setAttribute("type", "content");
browser.setAttribute("primary", "true");
browser.setAttribute("flex", "1");
--- a/mobile/android/modules/geckoview/GeckoViewContentModule.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewContentModule.jsm
@@ -20,16 +20,18 @@ class GeckoViewContentModule {
static create(aGlobal, aModuleName) {
return new this(aModuleName || this._moduleName, aGlobal);
}
constructor(aModuleName, aGlobal) {
this.moduleName = aModuleName;
this.messageManager = aGlobal;
+ this.enabled = false;
+ this.settings = {};
if (!aGlobal._gvEventDispatcher) {
aGlobal._gvEventDispatcher =
GeckoViewUtils.getDispatcherForWindow(aGlobal.content);
aGlobal.addEventListener("unload", event => {
if (event.target === this.messageManager) {
aGlobal._gvEventDispatcher.finalize();
}
@@ -37,34 +39,50 @@ class GeckoViewContentModule {
mozSystemGroup: true,
});
}
this.eventDispatcher = aGlobal._gvEventDispatcher;
this.messageManager.addMessageListener(
"GeckoView:UpdateSettings",
aMsg => {
- this.settings = aMsg.data;
- this.onSettingsUpdate();
- }
- );
- this.messageManager.addMessageListener(
- "GeckoView:Register",
- aMsg => {
- if (aMsg.data.module == this.moduleName) {
- this.settings = aMsg.data.settings;
- this.onEnable();
+ Object.assign(this.settings, aMsg.data);
+ if (this.enabled) {
+ this.onSettingsUpdate();
}
}
);
+
this.messageManager.addMessageListener(
- "GeckoView:Unregister",
+ "GeckoView:UpdateModuleState",
aMsg => {
- if (aMsg.data.module == this.moduleName) {
- this.onDisable();
+ if (aMsg.data.module !== this.moduleName) {
+ return;
+ }
+
+ const {enabled, settings} = aMsg.data;
+
+ if (settings) {
+ Object.assign(this.settings, settings);
+ }
+
+ if (enabled !== this.enabled) {
+ if (!enabled) {
+ this.onDisable();
+ }
+
+ this.enabled = enabled;
+
+ if (enabled) {
+ this.onEnable();
+ }
+ }
+
+ if (settings && enabled) {
+ this.onSettingsUpdate();
}
}
);
this.onInit();
this.messageManager.sendAsyncMessage(
"GeckoView:ContentRegistered", { module: this.moduleName });