Bug 1454441 - 4. Fix Fennec remote debugging; r?esawin draft
authorJim Chen <nchen@mozilla.com>
Mon, 23 Apr 2018 12:07:34 -0400
changeset 786584 2621fd683f44b6d245ad04a9b384808cac763a32
parent 786583 7d7f6c1d367c467a40a79557cc9d02d05cc8cb8c
push id107530
push userbmo:nchen@mozilla.com
push dateMon, 23 Apr 2018 16:15:55 +0000
reviewersesawin
bugs1454441
milestone61.0a1
Bug 1454441 - 4. Fix Fennec remote debugging; r?esawin Currently Fennec remote debugging has a bug where custom tabs / PWA can permanently override debugging of Fennec tabs. Fix that bug by switching between the browser/geckoview window types depending on if the Fennec window is gaining or losing focus. MozReview-Commit-ID: 2BhAOPFz3c0
mobile/android/chrome/content/RemoteDebugger.js
mobile/android/chrome/content/browser.js
mobile/android/tests/browser/chrome/test_debugger_server.html
--- a/mobile/android/chrome/content/RemoteDebugger.js
+++ b/mobile/android/chrome/content/RemoteDebugger.js
@@ -7,19 +7,40 @@
 
 XPCOMUtils.defineLazyGetter(this, "DebuggerServer", () => {
   let { require } = ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
   let { DebuggerServer } = require("devtools/server/main");
   return DebuggerServer;
 });
 
 var RemoteDebugger = {
-  init() {
+  init(aWindow) {
+    this._windowType = "navigator:browser";
+
     USBRemoteDebugger.init();
     WiFiRemoteDebugger.init();
+
+    const listener = (event) => {
+      if (event.target !== aWindow) {
+        return;
+      }
+
+      const newType = (event.type === "activate") ? "navigator:browser"
+                                                  : "navigator:geckoview";
+      if (this._windowType === newType) {
+        return;
+      }
+
+      this._windowType = newType;
+      if (this.isAnyEnabled) {
+        this.initServer();
+      }
+    };
+    aWindow.addEventListener("activate", listener, { mozSystemGroup: true });
+    aWindow.addEventListener("deactivate", listener, { mozSystemGroup: true });
   },
 
   get isAnyEnabled() {
     return USBRemoteDebugger.isEnabled || WiFiRemoteDebugger.isEnabled;
   },
 
   /**
    * Prompt the user to accept or decline the incoming connection.
@@ -179,16 +200,17 @@ var RemoteDebugger = {
     DebuggerServer.init();
 
     // Add browser and Fennec specific actors
     DebuggerServer.registerAllActors();
     DebuggerServer.registerModule("resource://gre/modules/dbg-browser-actors.js");
 
     // Allow debugging of chrome for any process
     DebuggerServer.allowChromeProcess = true;
+    DebuggerServer.chromeWindowType = this._windowType;
   }
 };
 
 RemoteDebugger.allowConnection =
   RemoteDebugger.allowConnection.bind(RemoteDebugger);
 RemoteDebugger.receiveOOB =
   RemoteDebugger.receiveOOB.bind(RemoteDebugger);
 
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -423,17 +423,17 @@ var BrowserApp = {
       }
     });
 
     NativeWindow.init();
     IndexedDB.init();
     XPInstallObserver.init();
     CharacterEncoding.init();
     ActivityObserver.init();
-    RemoteDebugger.init();
+    RemoteDebugger.init(window);
     DesktopUserAgent.init();
     Distribution.init();
     Tabs.init();
     SearchEngines.init();
     Experiments.init();
 
     // XXX maybe we don't do this if the launch was kicked off from external
     Services.io.offline = false;
--- a/mobile/android/tests/browser/chrome/test_debugger_server.html
+++ b/mobile/android/tests/browser/chrome/test_debugger_server.html
@@ -18,17 +18,17 @@ Migrated from Robocop: https://bugzilla.
 
   ChromeUtils.import("resource://gre/modules/Services.jsm");
   const { require } =
     ChromeUtils.import("resource://devtools/shared/Loader.jsm", {});
   const { DebuggerServer } = require("devtools/server/main");
 
   let win = Services.wm.getMostRecentWindow("navigator:browser");
 
-  win.RemoteDebugger.init();
+  win.RemoteDebugger.init(win);
 
   SimpleTest.registerCleanupFunction(function() {
     Services.prefs.clearUserPref(DEBUGGER_USB_ENABLED);
   });
 
   // Enable the debugger via the pref it listens for
   Services.prefs.setBoolPref(DEBUGGER_USB_ENABLED, true);