Bug 1392744 - Pass the port along to the browser toolbox chrome uri;r=jryans draft
authorBrian Grinstead <bgrinstead@mozilla.com>
Thu, 24 Aug 2017 10:03:47 -0700
changeset 652234 a2f631bb9d67ce4eabb9e8b1a2c3c32a5b8fd574
parent 652136 892c8916ba32b7733e06bfbfdd4083ffae3ca028
child 728039 7903559eb6057dbd8d2ce58586be078f40f2fd44
push id76004
push userbgrinstead@mozilla.com
push dateThu, 24 Aug 2017 17:03:57 +0000
reviewersjryans
bugs1392744
milestone57.0a1
Bug 1392744 - Pass the port along to the browser toolbox chrome uri;r=jryans This allows multiple browser toolboxes to be opened at once, assuming the host profiles have different values for devtools.debugger.chrome-debugging-port MozReview-Commit-ID: 1bzsZFww4Zv
devtools/client/framework/ToolboxProcess.jsm
devtools/client/framework/toolbox-process-window.js
devtools/client/preferences/debugger.js
--- a/devtools/client/framework/ToolboxProcess.jsm
+++ b/devtools/client/framework/ToolboxProcess.jsm
@@ -140,27 +140,30 @@ BrowserToolboxProcess.prototype = {
     this.debuggerServer.init();
     // We mainly need a root actor and tab actors for opening a toolbox, even
     // against chrome/content/addon. But the "no auto hide" button uses the
     // preference actor, so also register the browser actors.
     this.debuggerServer.registerActors({ root: true, browser: true, tab: true });
     this.debuggerServer.allowChromeProcess = true;
     dumpn("initialized and added the browser actors for the DebuggerServer.");
 
-    let chromeDebuggingPort =
-      Services.prefs.getIntPref("devtools.debugger.chrome-debugging-port");
     let chromeDebuggingWebSocket =
       Services.prefs.getBoolPref("devtools.debugger.chrome-debugging-websocket");
     let listener = this.debuggerServer.createListener();
-    listener.portOrPath = chromeDebuggingPort;
+    listener.portOrPath = -1;
     listener.webSocket = chromeDebuggingWebSocket;
     listener.open();
+    this.port = listener.port;
+
+    if (!this.port) {
+      throw new Error("No debugger server port");
+    }
 
     dumpn("Finished initializing the chrome toolbox server.");
-    dumpn("Started listening on port: " + chromeDebuggingPort);
+    dump(`Debugger Server for Browser Toolbox listening on port: ${this.port}\n`);
   },
 
   /**
    * Initializes a profile for the remote debugger process.
    */
   _initProfile: function () {
     dumpn("Initializing the chrome toolbox user profile.");
 
@@ -237,20 +240,19 @@ BrowserToolboxProcess.prototype = {
   /**
    * Creates and initializes the profile & process for the remote debugger.
    */
   _create: function () {
     dumpn("Initializing chrome debugging process.");
 
     let command = Services.dirsvc.get("XREExeF", Ci.nsIFile).path;
 
-    let xulURI = DBG_XUL;
-
+    let xulURI = `${DBG_XUL}?port=${this.port}`;
     if (this._options.addonID) {
-      xulURI += "?addonID=" + this._options.addonID;
+      xulURI += `&addonID=${this._options.addonID}`;
     }
 
     dumpn("Running chrome debugging process.");
     let args = [
       "-no-remote",
       "-foreground",
       "-profile", this._dbgProfilePath,
       "-chrome", xulURI
--- a/devtools/client/framework/toolbox-process-window.js
+++ b/devtools/client/framework/toolbox-process-window.js
@@ -20,33 +20,41 @@ var { DebuggerClient } = require("devtoo
 var { PrefsHelper } = require("devtools/client/shared/prefs");
 var { Task } = require("devtools/shared/task");
 
 /**
  * Shortcuts for accessing various debugger preferences.
  */
 var Prefs = new PrefsHelper("devtools.debugger", {
   chromeDebuggingHost: ["Char", "chrome-debugging-host"],
-  chromeDebuggingPort: ["Int", "chrome-debugging-port"],
   chromeDebuggingWebSocket: ["Bool", "chrome-debugging-websocket"],
 });
 
 var gToolbox, gClient;
 
 var connect = Task.async(function* () {
   window.removeEventListener("load", connect);
+
   // Initiate the connection
+  const params = new URLSearchParams(window.location.search);
+
+  // A port needs to be passed in from the query string, for instance:
+  // `./mach run -chrome chrome://devtools/content/framework/toolbox-process-window.xul?port=6080`
+  if (!params.get("port")) {
+    throw new Error("Must specify a port on the query string");
+  }
+
   let transport = yield DebuggerClient.socketConnect({
     host: Prefs.chromeDebuggingHost,
-    port: Prefs.chromeDebuggingPort,
+    port: params.get("port"),
     webSocket: Prefs.chromeDebuggingWebSocket,
   });
   gClient = new DebuggerClient(transport);
   yield gClient.connect();
-  let addonID = getParameterByName("addonID");
+  let addonID = params.get("addonID");
 
   if (addonID) {
     let { addons } = yield gClient.listAddons();
     let addonActor = addons.filter(addon => addon.id === addonID).pop();
     let isTabActor = addonActor.isWebExtension;
     openToolbox({form: addonActor, chrome: true, isTabActor});
   } else {
     let response = yield gClient.getProcess();
@@ -211,15 +219,8 @@ function quitApp() {
              .createInstance(Ci.nsISupportsPRBool);
   Services.obs.notifyObservers(quit, "quit-application-requested");
 
   let shouldProceed = !quit.data;
   if (shouldProceed) {
     Services.startup.quit(Ci.nsIAppStartup.eForceQuit);
   }
 }
-
-function getParameterByName(name) {
-  name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
-  let regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
-  let results = regex.exec(window.location.search);
-  return results == null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
-}
--- a/devtools/client/preferences/debugger.js
+++ b/devtools/client/preferences/debugger.js
@@ -1,17 +1,16 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 pref("devtools.debugger.new-debugger-frontend", true);
 
 // Enable the Debugger
 pref("devtools.debugger.enabled", true);
 pref("devtools.debugger.chrome-debugging-host", "localhost");
-pref("devtools.debugger.chrome-debugging-port", 6080);
 pref("devtools.debugger.chrome-debugging-websocket", false);
 pref("devtools.debugger.remote-host", "localhost");
 pref("devtools.debugger.remote-timeout", 20000);
 pref("devtools.debugger.pause-on-exceptions", false);
 pref("devtools.debugger.ignore-caught-exceptions", false);
 pref("devtools.debugger.source-maps-enabled", true);
 pref("devtools.debugger.client-source-maps-enabled", true);
 pref("devtools.debugger.pretty-print-enabled", true);