Bug 1460046 - Make child modules behave the same way as parent modules; r?esawin draft
authorJim Chen <nchen@mozilla.com>
Fri, 11 May 2018 10:53:54 -0400
changeset 794211 ffb90ad2c1351bbf45a170975083444fa5832c4d
parent 794210 b516aa228cd4a973d05c2a75075cff87f6cfe733
push id109610
push userbmo:nchen@mozilla.com
push dateFri, 11 May 2018 14:55:17 +0000
reviewersesawin
bugs1460046
milestone62.0a1
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
mobile/android/chrome/geckoview/geckoview.js
mobile/android/modules/geckoview/GeckoViewContentModule.jsm
--- 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 });