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
--- 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);