зеркало из https://github.com/mozilla/gecko-dev.git
Bug 741324 - Make it possible to start a debugger in a new firefox instance; r=past,rcampbell,zpao
This commit is contained in:
Родитель
f496b1f174
Коммит
5eed6b0f7e
|
@ -1061,9 +1061,14 @@ pref("devtools.layoutview.open", false);
|
||||||
|
|
||||||
// Enable the Debugger
|
// Enable the Debugger
|
||||||
pref("devtools.debugger.enabled", false);
|
pref("devtools.debugger.enabled", false);
|
||||||
|
pref("devtools.debugger.remote-enabled", false);
|
||||||
|
pref("devtools.debugger.remote-host", "localhost");
|
||||||
|
pref("devtools.debugger.remote-port", 6000);
|
||||||
|
|
||||||
// The default Debugger UI height
|
// The default Debugger UI height
|
||||||
pref("devtools.debugger.ui.height", 250);
|
pref("devtools.debugger.ui.height", 250);
|
||||||
|
pref("devtools.debugger.ui.remote-win.width", 900);
|
||||||
|
pref("devtools.debugger.ui.remote-win.height", 400);
|
||||||
|
|
||||||
// Enable the style inspector
|
// Enable the style inspector
|
||||||
pref("devtools.styleinspector.enabled", true);
|
pref("devtools.styleinspector.enabled", true);
|
||||||
|
|
|
@ -201,6 +201,10 @@
|
||||||
label="&debuggerMenu.label;"
|
label="&debuggerMenu.label;"
|
||||||
key="key_debugger"
|
key="key_debugger"
|
||||||
command="Tools:Debugger"/>
|
command="Tools:Debugger"/>
|
||||||
|
<menuitem id="appmenu_remoteDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&remoteDebuggerMenu.label;"
|
||||||
|
command="Tools:RemoteDebugger"/>
|
||||||
<menuitem id="appmenu_scratchpad"
|
<menuitem id="appmenu_scratchpad"
|
||||||
hidden="true"
|
hidden="true"
|
||||||
label="&scratchpad.label;"
|
label="&scratchpad.label;"
|
||||||
|
|
|
@ -559,6 +559,10 @@
|
||||||
label="&debuggerMenu.label;"
|
label="&debuggerMenu.label;"
|
||||||
key="key_debugger"
|
key="key_debugger"
|
||||||
command="Tools:Debugger"/>
|
command="Tools:Debugger"/>
|
||||||
|
<menuitem id="menu_remoteDebugger"
|
||||||
|
hidden="true"
|
||||||
|
label="&remoteDebuggerMenu.label;"
|
||||||
|
command="Tools:RemoteDebugger"/>
|
||||||
<menuitem id="menu_scratchpad"
|
<menuitem id="menu_scratchpad"
|
||||||
hidden="true"
|
hidden="true"
|
||||||
label="&scratchpad.label;"
|
label="&scratchpad.label;"
|
||||||
|
|
|
@ -130,6 +130,7 @@
|
||||||
<command id="Tools:WebConsole" oncommand="HUDConsoleUI.toggleHUD();"/>
|
<command id="Tools:WebConsole" oncommand="HUDConsoleUI.toggleHUD();"/>
|
||||||
<command id="Tools:Inspect" oncommand="InspectorUI.toggleInspectorUI();" disabled="true"/>
|
<command id="Tools:Inspect" oncommand="InspectorUI.toggleInspectorUI();" disabled="true"/>
|
||||||
<command id="Tools:Debugger" oncommand="DebuggerUI.toggleDebugger();" disabled="true"/>
|
<command id="Tools:Debugger" oncommand="DebuggerUI.toggleDebugger();" disabled="true"/>
|
||||||
|
<command id="Tools:RemoteDebugger" oncommand="DebuggerUI.toggleRemoteDebugger();" disabled="true"/>
|
||||||
<command id="Tools:Scratchpad" oncommand="Scratchpad.openScratchpad();" disabled="true"/>
|
<command id="Tools:Scratchpad" oncommand="Scratchpad.openScratchpad();" disabled="true"/>
|
||||||
<command id="Tools:StyleEditor" oncommand="StyleEditor.openChrome();" disabled="true"/>
|
<command id="Tools:StyleEditor" oncommand="StyleEditor.openChrome();" disabled="true"/>
|
||||||
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
|
<command id="Tools:Addons" oncommand="BrowserOpenAddonsMgr();"/>
|
||||||
|
|
|
@ -1734,6 +1734,16 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
|
||||||
document.getElementById("developer-toolbar-debugger").hidden = false;
|
document.getElementById("developer-toolbar-debugger").hidden = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enable Remote Debugger?
|
||||||
|
let enabled = gPrefService.getBoolPref("devtools.debugger.remote-enabled");
|
||||||
|
if (enabled) {
|
||||||
|
document.getElementById("menu_remoteDebugger").hidden = false;
|
||||||
|
document.getElementById("Tools:RemoteDebugger").removeAttribute("disabled");
|
||||||
|
#ifdef MENUBAR_CAN_AUTOHIDE
|
||||||
|
document.getElementById("appmenu_remoteDebugger").hidden = false;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Enable Error Console?
|
// Enable Error Console?
|
||||||
// XXX Temporarily always-enabled, see bug 601201
|
// XXX Temporarily always-enabled, see bug 601201
|
||||||
let consoleEnabled = true || gPrefService.getBoolPref("devtools.errorconsole.enabled");
|
let consoleEnabled = true || gPrefService.getBoolPref("devtools.errorconsole.enabled");
|
||||||
|
|
|
@ -45,7 +45,13 @@ const Cc = Components.classes;
|
||||||
const Ci = Components.interfaces;
|
const Ci = Components.interfaces;
|
||||||
const Cu = Components.utils;
|
const Cu = Components.utils;
|
||||||
|
|
||||||
|
const DBG_XUL = "chrome://browser/content/debugger.xul";
|
||||||
|
const REMOTE_PROFILE_NAME = "_remote-debug";
|
||||||
|
|
||||||
|
Cu.import("resource://gre/modules/devtools/dbg-server.jsm");
|
||||||
Cu.import("resource://gre/modules/Services.jsm");
|
Cu.import("resource://gre/modules/Services.jsm");
|
||||||
|
Cu.import("resource://gre/modules/FileUtils.jsm");
|
||||||
|
Cu.import("resource://gre/modules/XPCOMUtils.jsm");
|
||||||
|
|
||||||
let EXPORTED_SYMBOLS = ["DebuggerUI"];
|
let EXPORTED_SYMBOLS = ["DebuggerUI"];
|
||||||
|
|
||||||
|
@ -89,6 +95,21 @@ DebuggerUI.prototype = {
|
||||||
return new DebuggerPane(this, tab);
|
return new DebuggerPane(this, tab);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a remote debugger in a new process, or stops it if already started.
|
||||||
|
* @see DebuggerProcess.constructor
|
||||||
|
* @return DebuggerProcess if the debugger is started, null if it's stopped.
|
||||||
|
*/
|
||||||
|
toggleRemoteDebugger: function DUI_toggleRemoteDebugger(aOnClose, aOnRun) {
|
||||||
|
let win = this.chromeWindow;
|
||||||
|
|
||||||
|
if (win._remoteDebugger) {
|
||||||
|
win._remoteDebugger.close();
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return new DebuggerProcess(win, aOnClose, aOnRun);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the debugger for a specified tab.
|
* Get the debugger for a specified tab.
|
||||||
* @return DebuggerPane if a debugger exists for the tab, null otherwise
|
* @return DebuggerPane if a debugger exists for the tab, null otherwise
|
||||||
|
@ -102,7 +123,7 @@ DebuggerUI.prototype = {
|
||||||
* @return object
|
* @return object
|
||||||
*/
|
*/
|
||||||
get preferences() {
|
get preferences() {
|
||||||
return DebuggerUIPreferences;
|
return DebuggerPreferences;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -115,11 +136,22 @@ DebuggerUI.prototype = {
|
||||||
function DebuggerPane(aDebuggerUI, aTab) {
|
function DebuggerPane(aDebuggerUI, aTab) {
|
||||||
this._globalUI = aDebuggerUI;
|
this._globalUI = aDebuggerUI;
|
||||||
this._tab = aTab;
|
this._tab = aTab;
|
||||||
|
this._initServer();
|
||||||
this._create();
|
this._create();
|
||||||
}
|
}
|
||||||
|
|
||||||
DebuggerPane.prototype = {
|
DebuggerPane.prototype = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the debugger server.
|
||||||
|
*/
|
||||||
|
_initServer: function DP__initServer() {
|
||||||
|
if (!DebuggerServer.initialized) {
|
||||||
|
DebuggerServer.init();
|
||||||
|
DebuggerServer.addBrowserActors();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates and initializes the widgets containing the debugger UI.
|
* Creates and initializes the widgets containing the debugger UI.
|
||||||
*/
|
*/
|
||||||
|
@ -133,7 +165,7 @@ DebuggerPane.prototype = {
|
||||||
this._splitter.setAttribute("class", "hud-splitter");
|
this._splitter.setAttribute("class", "hud-splitter");
|
||||||
|
|
||||||
this._frame = ownerDocument.createElement("iframe");
|
this._frame = ownerDocument.createElement("iframe");
|
||||||
this._frame.height = DebuggerUIPreferences.height;
|
this._frame.height = DebuggerPreferences.height;
|
||||||
|
|
||||||
this._nbox = gBrowser.getNotificationBox(this._tab.linkedBrowser);
|
this._nbox = gBrowser.getNotificationBox(this._tab.linkedBrowser);
|
||||||
this._nbox.appendChild(this._splitter);
|
this._nbox.appendChild(this._splitter);
|
||||||
|
@ -154,7 +186,7 @@ DebuggerPane.prototype = {
|
||||||
self.getBreakpoint = bkp.getBreakpoint;
|
self.getBreakpoint = bkp.getBreakpoint;
|
||||||
}, true);
|
}, true);
|
||||||
|
|
||||||
this._frame.setAttribute("src", "chrome://browser/content/debugger.xul");
|
this._frame.setAttribute("src", DBG_XUL);
|
||||||
|
|
||||||
this._globalUI.refreshCommand();
|
this._globalUI.refreshCommand();
|
||||||
},
|
},
|
||||||
|
@ -166,10 +198,10 @@ DebuggerPane.prototype = {
|
||||||
if (!this._tab) {
|
if (!this._tab) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._tab._scriptDebugger = null;
|
delete this._tab._scriptDebugger;
|
||||||
this._tab = null;
|
this._tab = null;
|
||||||
|
|
||||||
DebuggerUIPreferences.height = this._frame.height;
|
DebuggerPreferences.height = this._frame.height;
|
||||||
this._frame.removeEventListener("Debugger:Close", this.close, true);
|
this._frame.removeEventListener("Debugger:Close", this.close, true);
|
||||||
this._frame.removeEventListener("unload", this.close, true);
|
this._frame.removeEventListener("unload", this.close, true);
|
||||||
|
|
||||||
|
@ -205,9 +237,112 @@ DebuggerPane.prototype = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Various debugger UI preferences (currently just the pane height).
|
* Creates a process that will hold the remote debugger.
|
||||||
|
*
|
||||||
|
* @param function aOnClose
|
||||||
|
* Optional, a function called when the process exits.
|
||||||
|
* @param function aOnRun
|
||||||
|
* Optional, a function called when the process starts running.
|
||||||
|
* @param nsIDOMWindow aWindow
|
||||||
|
* The chrome window for which the remote debugger instance is created.
|
||||||
*/
|
*/
|
||||||
let DebuggerUIPreferences = {
|
function DebuggerProcess(aWindow, aOnClose, aOnRun) {
|
||||||
|
this._win = aWindow;
|
||||||
|
this._closeCallback = aOnClose;
|
||||||
|
this._runCallback = aOnRun;
|
||||||
|
this._initProfile();
|
||||||
|
this._create();
|
||||||
|
}
|
||||||
|
|
||||||
|
DebuggerProcess.prototype = {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the debugger server.
|
||||||
|
*/
|
||||||
|
_initServer: function RDP__initServer() {
|
||||||
|
if (!DebuggerServer.initialized) {
|
||||||
|
DebuggerServer.init();
|
||||||
|
DebuggerServer.addBrowserActors();
|
||||||
|
}
|
||||||
|
DebuggerServer.closeListener();
|
||||||
|
DebuggerServer.openListener(DebuggerPreferences.remotePort, false);
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes a profile for the remote debugger process.
|
||||||
|
*/
|
||||||
|
_initProfile: function RDP__initProfile() {
|
||||||
|
let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]
|
||||||
|
.createInstance(Ci.nsIToolkitProfileService);
|
||||||
|
|
||||||
|
let dbgProfileName;
|
||||||
|
try {
|
||||||
|
dbgProfileName = profileService.selectedProfile.name + REMOTE_PROFILE_NAME;
|
||||||
|
} catch(e) {
|
||||||
|
dbgProfileName = REMOTE_PROFILE_NAME;
|
||||||
|
Cu.reportError(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dbgProfile = profileService.createProfile(null, null, dbgProfileName);
|
||||||
|
profileService.flush();
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates and initializes the profile & process for the remote debugger.
|
||||||
|
*/
|
||||||
|
_create: function RDP__create() {
|
||||||
|
this._win._remoteDebugger = this;
|
||||||
|
|
||||||
|
let file = FileUtils.getFile("CurProcD",
|
||||||
|
[Services.appinfo.OS == "WINNT" ? "firefox.exe"
|
||||||
|
: "firefox-bin"]);
|
||||||
|
|
||||||
|
let process = Cc["@mozilla.org/process/util;1"].createInstance(Ci.nsIProcess);
|
||||||
|
process.init(file);
|
||||||
|
|
||||||
|
let args = [
|
||||||
|
"-no-remote", "-P", this._dbgProfile.name,
|
||||||
|
"-chrome", DBG_XUL,
|
||||||
|
"-width", DebuggerPreferences.remoteWinWidth,
|
||||||
|
"-height", DebuggerPreferences.remoteWinHeight];
|
||||||
|
|
||||||
|
process.runwAsync(args, args.length, { observe: this.close.bind(this) });
|
||||||
|
this._dbgProcess = process;
|
||||||
|
|
||||||
|
if (typeof this._runCallback === "function") {
|
||||||
|
this._runCallback.call({}, this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Closes the remote debugger, removing the profile and killing the process.
|
||||||
|
*/
|
||||||
|
close: function RDP_close() {
|
||||||
|
if (!this._win) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
delete this._win._remoteDebugger;
|
||||||
|
this._win = null;
|
||||||
|
|
||||||
|
if (this._dbgProcess.isRunning) {
|
||||||
|
this._dbgProcess.kill();
|
||||||
|
}
|
||||||
|
if (this._dbgProfile) {
|
||||||
|
this._dbgProfile.remove(false);
|
||||||
|
}
|
||||||
|
if (typeof this._closeCallback === "function") {
|
||||||
|
this._closeCallback.call({}, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
this._dbgProcess = null;
|
||||||
|
this._dbgProfile = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Various debugger preferences.
|
||||||
|
*/
|
||||||
|
let DebuggerPreferences = {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the preferred height of the debugger pane.
|
* Gets the preferred height of the debugger pane.
|
||||||
|
@ -229,3 +364,35 @@ let DebuggerUIPreferences = {
|
||||||
this._height = value;
|
this._height = value;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred width of the remote debugger window.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteWinWidth", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.ui.remote-win.width");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred height of the remote debugger window.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteWinHeight", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.ui.remote-win.height");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging host.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remoteHost", function() {
|
||||||
|
return Services.prefs.getCharPref("devtools.debugger.remote-host");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging port.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(DebuggerPreferences, "remotePort", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.remote-port");
|
||||||
|
});
|
||||||
|
|
|
@ -114,6 +114,7 @@ let DebuggerController = {
|
||||||
|
|
||||||
this.dispatchEvent("Debugger:Unloaded");
|
this.dispatchEvent("Debugger:Unloaded");
|
||||||
this._disconnect();
|
this._disconnect();
|
||||||
|
this._isRemote && this._quitApp();
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,12 +122,10 @@ let DebuggerController = {
|
||||||
* wiring event handlers as necessary.
|
* wiring event handlers as necessary.
|
||||||
*/
|
*/
|
||||||
_connect: function DC__connect() {
|
_connect: function DC__connect() {
|
||||||
if (!DebuggerServer.initialized) {
|
let transport =
|
||||||
DebuggerServer.init();
|
this._isRemote ? debuggerSocketConnect(Prefs.remoteHost, Prefs.remotePort)
|
||||||
DebuggerServer.addBrowserActors();
|
: DebuggerServer.connectPipe();
|
||||||
}
|
|
||||||
|
|
||||||
let transport = DebuggerServer.connectPipe();
|
|
||||||
let client = this.client = new DebuggerClient(transport);
|
let client = this.client = new DebuggerClient(transport);
|
||||||
|
|
||||||
client.addListener("tabNavigated", this._onTabNavigated);
|
client.addListener("tabNavigated", this._onTabNavigated);
|
||||||
|
@ -220,6 +219,31 @@ let DebuggerController = {
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if this is a remote debugger instance.
|
||||||
|
* @return boolean
|
||||||
|
*/
|
||||||
|
get _isRemote() {
|
||||||
|
return !window.parent.content;
|
||||||
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Attempts to quit the current process if allowed.
|
||||||
|
*/
|
||||||
|
_quitApp: function DC__quitApp() {
|
||||||
|
let canceled = Cc["@mozilla.org/supports-PRBool;1"]
|
||||||
|
.createInstance(Ci.nsISupportsPRBool);
|
||||||
|
|
||||||
|
Services.obs.notifyObservers(canceled, "quit-application-requested", null);
|
||||||
|
|
||||||
|
// Somebody canceled our quit request.
|
||||||
|
if (canceled.data) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Services.startup.quit(Ci.nsIAppStartup.eAttemptQuit);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convenience method, dispatching a custom event.
|
* Convenience method, dispatching a custom event.
|
||||||
*
|
*
|
||||||
|
@ -767,6 +791,22 @@ SourceScripts.prototype = {
|
||||||
return aUrl;
|
return aUrl;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the prePath for a script URL.
|
||||||
|
*
|
||||||
|
* @param string aUrl
|
||||||
|
* The script url.
|
||||||
|
* @return string
|
||||||
|
* The script prePath if the url is valid, null otherwise.
|
||||||
|
*/
|
||||||
|
_getScriptPrePath: function SS__getScriptDomain(aUrl) {
|
||||||
|
try {
|
||||||
|
return Services.io.newURI(aUrl, null, null).prePath + "/";
|
||||||
|
} catch (e) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets a unique, simplified label from a script url.
|
* Gets a unique, simplified label from a script url.
|
||||||
* ex: a). ici://some.address.com/random/subrandom/
|
* ex: a). ici://some.address.com/random/subrandom/
|
||||||
|
@ -783,7 +823,7 @@ SourceScripts.prototype = {
|
||||||
* The script url.
|
* The script url.
|
||||||
* @param string aHref
|
* @param string aHref
|
||||||
* The content location href to be used. If unspecified, it will
|
* The content location href to be used. If unspecified, it will
|
||||||
* defalult to debugged panrent window location.
|
* default to the script url prepath.
|
||||||
* @return string
|
* @return string
|
||||||
* The simplified label.
|
* The simplified label.
|
||||||
*/
|
*/
|
||||||
|
@ -794,15 +834,18 @@ SourceScripts.prototype = {
|
||||||
return this._labelsCache[url];
|
return this._labelsCache[url];
|
||||||
}
|
}
|
||||||
|
|
||||||
let href = aHref || window.parent.content.location.href;
|
let content = window.parent.content;
|
||||||
|
let domain = content ? content.location.href : this._getScriptPrePath(aUrl);
|
||||||
|
|
||||||
|
let href = aHref || domain;
|
||||||
let pathElements = url.split("/");
|
let pathElements = url.split("/");
|
||||||
let label = pathElements.pop() || (pathElements.pop() + "/");
|
let label = pathElements.pop() || (pathElements.pop() + "/");
|
||||||
|
|
||||||
// if the label as a leaf name is alreay present in the scripts list
|
// If the label as a leaf name is already present in the scripts list.
|
||||||
if (DebuggerView.Scripts.containsLabel(label)) {
|
if (DebuggerView.Scripts.containsLabel(label)) {
|
||||||
label = url.replace(href.substring(0, href.lastIndexOf("/") + 1), "");
|
label = url.replace(href.substring(0, href.lastIndexOf("/") + 1), "");
|
||||||
|
|
||||||
// if the path/to/script is exactly the same, we're in different domains
|
// If the path/to/script is exactly the same, we're in different domains.
|
||||||
if (DebuggerView.Scripts.containsLabel(label)) {
|
if (DebuggerView.Scripts.containsLabel(label)) {
|
||||||
label = url;
|
label = url;
|
||||||
}
|
}
|
||||||
|
@ -897,7 +940,7 @@ SourceScripts.prototype = {
|
||||||
* Handles notifications to load a source script from the cache or from a
|
* Handles notifications to load a source script from the cache or from a
|
||||||
* local file.
|
* local file.
|
||||||
*
|
*
|
||||||
* XXX: Tt may be better to use nsITraceableChannel to get to the sources
|
* XXX: It may be better to use nsITraceableChannel to get to the sources
|
||||||
* without relying on caching when we can (not for eval, etc.):
|
* without relying on caching when we can (not for eval, etc.):
|
||||||
* http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/
|
* http://www.softwareishard.com/blog/firebug/nsitraceablechannel-intercept-http-traffic/
|
||||||
*/
|
*/
|
||||||
|
@ -988,7 +1031,7 @@ SourceScripts.prototype = {
|
||||||
* The failure status code.
|
* The failure status code.
|
||||||
*/
|
*/
|
||||||
_logError: function SS__logError(aUrl, aStatus) {
|
_logError: function SS__logError(aUrl, aStatus) {
|
||||||
Components.utils.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus]));
|
Cu.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus]));
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1279,6 +1322,27 @@ XPCOMUtils.defineLazyGetter(L10N, "stringBundle", function() {
|
||||||
return Services.strings.createBundle(DBG_STRINGS_URI);
|
return Services.strings.createBundle(DBG_STRINGS_URI);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Shortcuts for accessing various debugger preferences.
|
||||||
|
*/
|
||||||
|
let Prefs = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging host.
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(Prefs, "remoteHost", function() {
|
||||||
|
return Services.prefs.getCharPref("devtools.debugger.remote-host");
|
||||||
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the preferred default remote debugging port.
|
||||||
|
* @return number
|
||||||
|
*/
|
||||||
|
XPCOMUtils.defineLazyGetter(Prefs, "remotePort", function() {
|
||||||
|
return Services.prefs.getIntPref("devtools.debugger.remote-port");
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preliminary setup for the DebuggerController object.
|
* Preliminary setup for the DebuggerController object.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -46,6 +46,7 @@ include $(DEPTH)/config/autoconf.mk
|
||||||
include $(topsrcdir)/config/rules.mk
|
include $(topsrcdir)/config/rules.mk
|
||||||
|
|
||||||
_BROWSER_TEST_FILES = \
|
_BROWSER_TEST_FILES = \
|
||||||
|
browser_dbg_createRemote.js \
|
||||||
browser_dbg_debuggerstatement.js \
|
browser_dbg_debuggerstatement.js \
|
||||||
browser_dbg_listtabs.js \
|
browser_dbg_listtabs.js \
|
||||||
browser_dbg_tabactor-01.js \
|
browser_dbg_tabactor-01.js \
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
/* vim:set ts=2 sw=2 sts=2 et: */
|
||||||
|
/*
|
||||||
|
* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||||
|
*/
|
||||||
|
var gProcess = null;
|
||||||
|
var gTab = null;
|
||||||
|
var gDebuggee = null;
|
||||||
|
|
||||||
|
function test() {
|
||||||
|
remote_debug_tab_pane(STACK_URL, aOnClosing, function(aTab, aDebuggee, aProcess) {
|
||||||
|
gTab = aTab;
|
||||||
|
gDebuggee = aDebuggee;
|
||||||
|
gProcess = aProcess;
|
||||||
|
|
||||||
|
testSimpleCall();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function testSimpleCall() {
|
||||||
|
Services.tm.currentThread.dispatch({ run: function() {
|
||||||
|
|
||||||
|
ok(gProcess._dbgProcess,
|
||||||
|
"The remote debugger process wasn't created properly!");
|
||||||
|
ok(gProcess._dbgProcess.isRunning,
|
||||||
|
"The remote debugger process isn't running!");
|
||||||
|
is(typeof gProcess._dbgProcess.pid, "number",
|
||||||
|
"The remote debugger process doesn't have a pid (?!)");
|
||||||
|
|
||||||
|
info("process location: " + gProcess._dbgProcess.location);
|
||||||
|
info("process pid: " + gProcess._dbgProcess.pid);
|
||||||
|
info("process name: " + gProcess._dbgProcess.processName);
|
||||||
|
info("process sig: " + gProcess._dbgProcess.processSignature);
|
||||||
|
|
||||||
|
ok(gProcess._dbgProfile,
|
||||||
|
"The remote debugger profile wasn't created properly!");
|
||||||
|
ok(gProcess._dbgProfile.localDir,
|
||||||
|
"The remote debugger profile doesn't have a localDir...");
|
||||||
|
ok(gProcess._dbgProfile.rootDir,
|
||||||
|
"The remote debugger profile doesn't have a rootDir...");
|
||||||
|
ok(gProcess._dbgProfile.name,
|
||||||
|
"The remote debugger profile doesn't have a name...");
|
||||||
|
|
||||||
|
info("profile localDir: " + gProcess._dbgProfile.localDir);
|
||||||
|
info("profile rootDir: " + gProcess._dbgProfile.rootDir);
|
||||||
|
info("profile name: " + gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
let profileService = Cc["@mozilla.org/toolkit/profile-service;1"]
|
||||||
|
.createInstance(Ci.nsIToolkitProfileService);
|
||||||
|
|
||||||
|
let profile = profileService.getProfileByName(gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
ok(profile,
|
||||||
|
"The remote debugger profile wasn't *actually* created properly!");
|
||||||
|
is(profile.localDir.path, gProcess._dbgProfile.localDir.path,
|
||||||
|
"The remote debugger profile doesn't have the correct localDir!");
|
||||||
|
is(profile.rootDir.path, gProcess._dbgProfile.rootDir.path,
|
||||||
|
"The remote debugger profile doesn't have the correct rootDir!");
|
||||||
|
|
||||||
|
DebuggerUI.toggleRemoteDebugger();
|
||||||
|
}}, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
function aOnClosing() {
|
||||||
|
ok(!gProcess._dbgProcess.isRunning,
|
||||||
|
"The remote debugger process isn't closed as it should be!");
|
||||||
|
is(gProcess._dbgProcess.exitValue, (Services.appinfo.OS == "WINNT" ? 0 : 256),
|
||||||
|
"The remote debugger process didn't die cleanly.");
|
||||||
|
|
||||||
|
info("process exit value: " + gProcess._dbgProcess.exitValue);
|
||||||
|
|
||||||
|
info("profile localDir: " + gProcess._dbgProfile.localDir.path);
|
||||||
|
info("profile rootDir: " + gProcess._dbgProfile.rootDir.path);
|
||||||
|
info("profile name: " + gProcess._dbgProfile.name);
|
||||||
|
|
||||||
|
executeSoon(function() {
|
||||||
|
finish();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
registerCleanupFunction(function() {
|
||||||
|
removeTab(gTab);
|
||||||
|
gProcess = null;
|
||||||
|
gTab = null;
|
||||||
|
gDebuggee = null;
|
||||||
|
});
|
|
@ -92,7 +92,6 @@ function debug_tab_pane(aURL, aOnDebugging)
|
||||||
{
|
{
|
||||||
let tab = addTab(aURL, function() {
|
let tab = addTab(aURL, function() {
|
||||||
gBrowser.selectedTab = gTab;
|
gBrowser.selectedTab = gTab;
|
||||||
|
|
||||||
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
||||||
|
|
||||||
let pane = DebuggerUI.toggleDebugger();
|
let pane = DebuggerUI.toggleDebugger();
|
||||||
|
@ -106,3 +105,17 @@ function debug_tab_pane(aURL, aOnDebugging)
|
||||||
}, true);
|
}, true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function remote_debug_tab_pane(aURL, aOnClosing, aOnDebugging)
|
||||||
|
{
|
||||||
|
let tab = addTab(aURL, function() {
|
||||||
|
gBrowser.selectedTab = gTab;
|
||||||
|
let debuggee = tab.linkedBrowser.contentWindow.wrappedJSObject;
|
||||||
|
|
||||||
|
DebuggerUI.toggleRemoteDebugger(aOnClosing, function dbgRan(process) {
|
||||||
|
|
||||||
|
// Wait for the remote debugging process to start...
|
||||||
|
aOnDebugging(tab, debuggee, process);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
@ -11,6 +11,10 @@
|
||||||
- application menu item that opens the debugger UI. -->
|
- application menu item that opens the debugger UI. -->
|
||||||
<!ENTITY debuggerMenu.label "Script Debugger">
|
<!ENTITY debuggerMenu.label "Script Debugger">
|
||||||
|
|
||||||
|
<!-- LOCALIZATION NOTE (remoteDebuggerMenu.label): This is the label for the
|
||||||
|
- application menu item that opens the remote debugger UI. -->
|
||||||
|
<!ENTITY remoteDebuggerMenu.label "Remote Debugger">
|
||||||
|
|
||||||
<!-- LOCALIZATION NOTE (debuggerMenu.commandkey): This is the command key that
|
<!-- LOCALIZATION NOTE (debuggerMenu.commandkey): This is the command key that
|
||||||
- launches the debugger UI. Do not translate this one! -->
|
- launches the debugger UI. Do not translate this one! -->
|
||||||
<!ENTITY debuggerMenu.commandkey "S">
|
<!ENTITY debuggerMenu.commandkey "S">
|
||||||
|
|
Загрузка…
Ссылка в новой задаче