Backout the merge from fx-team because of Ts regressions (no bug)

This is the backed out range:
http://hg.mozilla.org/mozilla-central/pushloghtml?changeset=a974c45914eb
This commit is contained in:
Ehsan Akhgari 2012-05-02 16:20:02 -04:00
parent afc10add1d
commit 9583e92170
117 changed files with 6173 additions and 10263 deletions

View File

@ -31,7 +31,7 @@
is(root.parentDocument, null, is(root.parentDocument, null,
"Wrong parent document of root accessible"); "Wrong parent document of root accessible");
is(root.childDocumentCount, SEAMONKEY ? 1 : 3, is(root.childDocumentCount, 1,
"Wrong child document count of root accessible"); "Wrong child document count of root accessible");
is(root.getChildDocumentAt(0), tabDoc, is(root.getChildDocumentAt(0), tabDoc,
"Wrong child document at index 0 of root accessible"); "Wrong child document at index 0 of root accessible");

View File

@ -1045,9 +1045,6 @@ pref("services.sync.prefs.sync.xpinstall.whitelist.required", true);
// Disable the error console // Disable the error console
pref("devtools.errorconsole.enabled", false); pref("devtools.errorconsole.enabled", false);
// Enable the developer toolbar
pref("devtools.toolbar.enabled", false);
// Enable the Inspector // Enable the Inspector
pref("devtools.inspector.enabled", true); pref("devtools.inspector.enabled", true);
pref("devtools.inspector.htmlHeight", 112); pref("devtools.inspector.htmlHeight", 112);
@ -1061,14 +1058,9 @@ 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);
@ -1091,14 +1083,8 @@ pref("devtools.styleeditor.transitions", true);
// Enable tools for Chrome development. // Enable tools for Chrome development.
pref("devtools.chrome.enabled", false); pref("devtools.chrome.enabled", false);
// Display the introductory text // Disable the GCLI enhanced command line.
pref("devtools.gcli.hideIntro", false); pref("devtools.gcli.enable", false);
// How eager are we to show help: never=1, sometimes=2, always=3
pref("devtools.gcli.eagerHelper", 2);
// Do we allow the 'pref set' command
pref("devtools.gcli.allowSet", false);
// The last Web Console height. This is initially 0 which means that the Web // The last Web Console height. This is initially 0 which means that the Web
// Console will use the default height next time it shows. // Console will use the default height next time it shows.

View File

@ -176,14 +176,8 @@
<menuseparator class="appmenu-menuseparator"/> <menuseparator class="appmenu-menuseparator"/>
<menu id="appmenu_webDeveloper" <menu id="appmenu_webDeveloper"
label="&appMenuWebDeveloper.label;"> label="&appMenuWebDeveloper.label;">
<menupopup id="appmenu_webDeveloper_popup"> <menupopup id="appmenu_webDeveloper_popup"
<menuitem id="appmenu_devToolbar" onpopupshowing="onWebDeveloperMenuShowing();">
type="checkbox"
autocheck="false"
hidden="true"
label="&devToolbarMenu.label;"
command="Tools:DevToolbar"
key="key_devToolbar"/>
<menuitem id="appmenu_webConsole" <menuitem id="appmenu_webConsole"
label="&webConsoleCmd.label;" label="&webConsoleCmd.label;"
type="checkbox" type="checkbox"
@ -197,14 +191,9 @@
key="key_inspect"/> key="key_inspect"/>
<menuitem id="appmenu_debugger" <menuitem id="appmenu_debugger"
hidden="true" hidden="true"
type="checkbox"
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;"

View File

@ -225,7 +225,7 @@ var FullZoom = {
return; return;
// Avoid the cps roundtrip and apply the default/global pref. // Avoid the cps roundtrip and apply the default/global pref.
if (aURI.spec == "about:blank") { if (isBlankPageURL(aURI.spec)) {
this._applyPrefToSetting(undefined, aBrowser); this._applyPrefToSetting(undefined, aBrowser);
return; return;
} }

View File

@ -531,15 +531,8 @@
<menu id="webDeveloperMenu" <menu id="webDeveloperMenu"
label="&webDeveloperMenu.label;" label="&webDeveloperMenu.label;"
accesskey="&webDeveloperMenu.accesskey;"> accesskey="&webDeveloperMenu.accesskey;">
<menupopup id="menuWebDeveloperPopup"> <menupopup id="menuWebDeveloperPopup"
<menuitem id="menu_devToolbar" onpopupshowing="onWebDeveloperMenuShowing();">
type="checkbox"
autocheck="false"
hidden="true"
label="&devToolbarMenu.label;"
accesskey="&devToolbarMenu.accesskey;"
key="key_devToolbar"
command="Tools:DevToolbar"/>
<menuitem id="webConsole" <menuitem id="webConsole"
type="checkbox" type="checkbox"
label="&webConsoleCmd.label;" label="&webConsoleCmd.label;"
@ -555,14 +548,9 @@
command="Tools:Inspect"/> command="Tools:Inspect"/>
<menuitem id="menu_debugger" <menuitem id="menu_debugger"
hidden="true" hidden="true"
type="checkbox"
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;"

View File

@ -126,11 +126,9 @@
<command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/> <command id="Tools:Search" oncommand="BrowserSearch.webSearch();"/>
<command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/> <command id="Tools:Downloads" oncommand="BrowserDownloadsUI();"/>
<command id="Tools:DevToolbar" oncommand="DeveloperToolbar.toggle();" disabled="true"/>
<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();"/>
@ -257,13 +255,6 @@
#endif #endif
<key id="key_openAddons" key="&addons.commandkey;" command="Tools:Addons" modifiers="accel,shift"/> <key id="key_openAddons" key="&addons.commandkey;" command="Tools:Addons" modifiers="accel,shift"/>
<key id="key_errorConsole" key="&errorConsoleCmd.commandkey;" oncommand="toJavaScriptConsole();" modifiers="accel,shift" disabled="true"/> <key id="key_errorConsole" key="&errorConsoleCmd.commandkey;" oncommand="toJavaScriptConsole();" modifiers="accel,shift" disabled="true"/>
<key id="key_devToolbar" key="&devToolbar.commandkey;" command="Tools:DevToolbar"
#ifdef XP_MACOSX
modifiers="accel,alt"
#else
modifiers="accel,shift"
#endif
/>
<key id="key_webConsole" key="&webConsoleCmd.commandkey;" oncommand="HUDConsoleUI.toggleHUD();" <key id="key_webConsole" key="&webConsoleCmd.commandkey;" oncommand="HUDConsoleUI.toggleHUD();"
#ifdef XP_MACOSX #ifdef XP_MACOSX
modifiers="accel,alt" modifiers="accel,alt"

View File

@ -179,12 +179,6 @@ XPCOMUtils.defineLazyGetter(this, "PopupNotifications", function () {
} }
}); });
XPCOMUtils.defineLazyGetter(this, "DeveloperToolbar", function() {
let tmp = {};
Cu.import("resource:///modules/devtools/DeveloperToolbar.jsm", tmp);
return new tmp.DeveloperToolbar(window, document.getElementById("developer-toolbar"));
});
XPCOMUtils.defineLazyGetter(this, "InspectorUI", function() { XPCOMUtils.defineLazyGetter(this, "InspectorUI", function() {
let tmp = {}; let tmp = {};
Cu.import("resource:///modules/inspector.jsm", tmp); Cu.import("resource:///modules/inspector.jsm", tmp);
@ -1702,16 +1696,6 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
setUrlAndSearchBarWidthForConditionalForwardButton(); setUrlAndSearchBarWidthForConditionalForwardButton();
}); });
// Enable developer toolbar?
let devToolbarEnabled = gPrefService.getBoolPref("devtools.toolbar.enabled");
if (devToolbarEnabled) {
document.getElementById("menu_devToolbar").hidden = false;
document.getElementById("Tools:DevToolbar").removeAttribute("disabled");
#ifdef MENUBAR_CAN_AUTOHIDE
document.getElementById("appmenu_devToolbar").hidden = false;
#endif
}
// Enable Inspector? // Enable Inspector?
let enabled = gPrefService.getBoolPref("devtools.inspector.enabled"); let enabled = gPrefService.getBoolPref("devtools.inspector.enabled");
if (enabled) { if (enabled) {
@ -1720,7 +1704,6 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
#ifdef MENUBAR_CAN_AUTOHIDE #ifdef MENUBAR_CAN_AUTOHIDE
document.getElementById("appmenu_pageInspect").hidden = false; document.getElementById("appmenu_pageInspect").hidden = false;
#endif #endif
document.getElementById("developer-toolbar-inspector").hidden = false;
} }
// Enable Debugger? // Enable Debugger?
@ -1730,17 +1713,6 @@ function delayedStartup(isLoadingBlank, mustLoadSidebar) {
document.getElementById("Tools:Debugger").removeAttribute("disabled"); document.getElementById("Tools:Debugger").removeAttribute("disabled");
#ifdef MENUBAR_CAN_AUTOHIDE #ifdef MENUBAR_CAN_AUTOHIDE
document.getElementById("appmenu_debugger").hidden = false; document.getElementById("appmenu_debugger").hidden = false;
#endif
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 #endif
} }
@ -9309,6 +9281,10 @@ var StyleEditor = {
} }
}; };
function onWebDeveloperMenuShowing() {
document.getElementById("Tools:WebConsole").setAttribute("checked", HUDConsoleUI.getOpenHUD() != null);
}
XPCOMUtils.defineLazyGetter(window, "gShowPageResizers", function () { XPCOMUtils.defineLazyGetter(window, "gShowPageResizers", function () {
#ifdef XP_WIN #ifdef XP_WIN

View File

@ -1039,60 +1039,6 @@
tooltiptext="&inspectCloseButton.tooltiptext;"/> tooltiptext="&inspectCloseButton.tooltiptext;"/>
#endif #endif
</toolbar> </toolbar>
<panel id="gcli-tooltip"
type="arrow"
noautofocus="true"
noautohide="true"
class="gcli-panel">
<iframe id="gcli-tooltip-frame"
src="chrome://browser/content/devtools/gcliblank.xhtml"
flex="1"/>
</panel>
<panel id="gcli-output"
type="arrow"
noautofocus="true"
noautohide="true"
class="gcli-panel">
<iframe id="gcli-output-frame"
src="chrome://browser/content/devtools/gcliblank.xhtml"
flex="1"/>
</panel>
<toolbar id="developer-toolbar"
class="devtools-toolbar"
hidden="true">
#ifdef XP_MACOSX
<toolbarbutton id="developer-toolbar-closebutton"
oncommand="DeveloperToolbar.hide();"
tooltiptext="&devToolbarCloseButton.tooltiptext;"/>
#endif
<stack class="gclitoolbar-stack-node" flex="1">
<description class="gclitoolbar-prompt">&#187;</description>
<description class="gclitoolbar-complete-node"/>
<textbox class="gclitoolbar-input-node" rows="1"/>
</stack>
<toolbarbutton id="developer-toolbar-webconsole"
label="&webConsoleButton.label;"
class="devtools-toolbarbutton"
command="Tools:WebConsole"/>
<toolbarbutton id="developer-toolbar-inspector"
label="&inspectorButton.label;"
class="devtools-toolbarbutton"
hidden="true"
command="Tools:Inspect"/>
<toolbarbutton id="developer-toolbar-debugger"
label="&scriptsButton.label;"
class="devtools-toolbarbutton"
hidden="true"
command="Tools:Debugger"/>
#ifndef XP_MACOSX
<toolbarbutton id="developer-toolbar-closebutton"
oncommand="DeveloperToolbar.hide();"
tooltiptext="&devToolbarCloseButton.tooltiptext;"/>
#endif
</toolbar>
<toolbar id="addon-bar" <toolbar id="addon-bar"
toolbarname="&addonBarCmd.label;" accesskey="&addonBarCmd.accesskey;" toolbarname="&addonBarCmd.label;" accesskey="&addonBarCmd.accesskey;"
collapsed="true" collapsed="true"

View File

@ -45,13 +45,7 @@ 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"];
@ -66,20 +60,6 @@ function DebuggerUI(aWindow) {
} }
DebuggerUI.prototype = { DebuggerUI.prototype = {
/**
* Called by the DebuggerPane to update the Debugger toggle switches with the
* debugger state.
*/
refreshCommand: function DUI_refreshCommand() {
let selectedTab = this.chromeWindow.getBrowser().selectedTab;
let command = this.chromeWindow.document.getElementById("Tools:Debugger");
if (this.getDebugger(selectedTab) != null) {
command.setAttribute("checked", "true");
} else {
command.removeAttribute("checked");
}
},
/** /**
* Starts a debugger for the current tab, or stops it if already started. * Starts a debugger for the current tab, or stops it if already started.
@ -92,22 +72,7 @@ DebuggerUI.prototype = {
tab._scriptDebugger.close(); tab._scriptDebugger.close();
return null; return null;
} }
return new DebuggerPane(this, tab); return new DebuggerPane(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);
}, },
/** /**
@ -115,7 +80,7 @@ DebuggerUI.prototype = {
* @return DebuggerPane if a debugger exists for the tab, null otherwise * @return DebuggerPane if a debugger exists for the tab, null otherwise
*/ */
getDebugger: function DUI_getDebugger(aTab) { getDebugger: function DUI_getDebugger(aTab) {
return '_scriptDebugger' in aTab ? aTab._scriptDebugger : null; return aTab._scriptDebugger;
}, },
/** /**
@ -123,7 +88,7 @@ DebuggerUI.prototype = {
* @return object * @return object
*/ */
get preferences() { get preferences() {
return DebuggerPreferences; return DebuggerUIPreferences;
} }
}; };
@ -133,25 +98,13 @@ DebuggerUI.prototype = {
* @param XULElement aTab * @param XULElement aTab
* The tab in which to create the debugger. * The tab in which to create the debugger.
*/ */
function DebuggerPane(aDebuggerUI, aTab) { function DebuggerPane(aTab) {
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.
*/ */
@ -165,7 +118,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 = DebuggerPreferences.height; this._frame.height = DebuggerUIPreferences.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);
@ -186,9 +139,7 @@ DebuggerPane.prototype = {
self.getBreakpoint = bkp.getBreakpoint; self.getBreakpoint = bkp.getBreakpoint;
}, true); }, true);
this._frame.setAttribute("src", DBG_XUL); this._frame.setAttribute("src", "chrome://browser/content/debugger.xul");
this._globalUI.refreshCommand();
}, },
/** /**
@ -198,10 +149,10 @@ DebuggerPane.prototype = {
if (!this._tab) { if (!this._tab) {
return; return;
} }
delete this._tab._scriptDebugger; this._tab._scriptDebugger = null;
this._tab = null; this._tab = null;
DebuggerPreferences.height = this._frame.height; DebuggerUIPreferences.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);
@ -211,8 +162,6 @@ DebuggerPane.prototype = {
this._splitter = null; this._splitter = null;
this._frame = null; this._frame = null;
this._nbox = null; this._nbox = null;
this._globalUI.refreshCommand();
}, },
/** /**
@ -237,112 +186,9 @@ DebuggerPane.prototype = {
}; };
/** /**
* Creates a process that will hold the remote debugger. * Various debugger UI preferences (currently just the pane height).
*
* @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.
*/ */
function DebuggerProcess(aWindow, aOnClose, aOnRun) { let DebuggerUIPreferences = {
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.
@ -364,35 +210,3 @@ let DebuggerPreferences = {
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");
});

View File

@ -114,7 +114,6 @@ let DebuggerController = {
this.dispatchEvent("Debugger:Unloaded"); this.dispatchEvent("Debugger:Unloaded");
this._disconnect(); this._disconnect();
this._isRemote && this._quitApp();
}, },
/** /**
@ -122,10 +121,12 @@ let DebuggerController = {
* wiring event handlers as necessary. * wiring event handlers as necessary.
*/ */
_connect: function DC__connect() { _connect: function DC__connect() {
let transport = if (!DebuggerServer.initialized) {
this._isRemote ? debuggerSocketConnect(Prefs.remoteHost, Prefs.remotePort) DebuggerServer.init();
: DebuggerServer.connectPipe(); DebuggerServer.addBrowserActors();
}
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);
@ -219,31 +220,6 @@ 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.
* *
@ -494,38 +470,6 @@ StackFrames.prototype = {
this._addExpander(thisVar, frame.this); this._addExpander(thisVar, frame.this);
} }
if (frame.environment) {
// Add nodes for every argument.
let variables = frame.environment.bindings.arguments;
for each (let variable in variables) {
let name = Object.getOwnPropertyNames(variable)[0];
let paramVar = localScope.addVar(name);
let paramVal = variable[name].value;
paramVar.setGrip(paramVal);
this._addExpander(paramVar, paramVal);
}
// Add nodes for every other variable in scope.
variables = frame.environment.bindings.variables;
for (let variable in variables) {
let paramVar = localScope.addVar(variable);
let paramVal = variables[variable].value;
paramVar.setGrip(paramVal);
this._addExpander(paramVar, paramVal);
}
// If we already found 'arguments', we are done here.
if ("arguments" in frame.environment.bindings.variables) {
// Signal that variables have been fetched.
DebuggerController.dispatchEvent("Debugger:FetchedVariables");
return;
}
}
// Sometimes in call frames with arguments we don't get 'arguments' in the
// environment (bug 746601) and we have to construct it manually. Note, that
// in this case arguments.callee will be absent, even in the cases where it
// shouldn't be.
if (frame.arguments && frame.arguments.length > 0) { if (frame.arguments && frame.arguments.length > 0) {
// Add "arguments". // Add "arguments".
let argsVar = localScope.addVar("arguments"); let argsVar = localScope.addVar("arguments");
@ -535,20 +479,33 @@ StackFrames.prototype = {
}); });
this._addExpander(argsVar, frame.arguments); this._addExpander(argsVar, frame.arguments);
// Signal that variables have been fetched. // Add variables for every argument.
DebuggerController.dispatchEvent("Debugger:FetchedVariables"); let objClient = this.activeThread.pauseGrip(frame.callee);
} objClient.getSignature(function SF_getSignature(aResponse) {
for (let i = 0, l = aResponse.parameters.length; i < l; i++) {
let param = aResponse.parameters[i];
let paramVar = localScope.addVar(param);
let paramVal = frame.arguments[i];
paramVar.setGrip(paramVal);
this._addExpander(paramVar, paramVal);
}
// Signal that call parameters have been fetched.
DebuggerController.dispatchEvent("Debugger:FetchedParameters");
}.bind(this));
}
}, },
/** /**
* Adds an 'onexpand' callback for a variable, lazily handling the addition of * Adds a onexpand callback for a variable, lazily handling the addition of
* new properties. * new properties.
*/ */
_addExpander: function SF__addExpander(aVar, aObject) { _addExpander: function SF__addExpander(aVar, aObject) {
// No need for expansion for null and undefined values, but we do need them // No need for expansion for null and undefined values, but we do need them
// for frame.arguments which is a regular array. // for frame.arguments which is a regular array.
if (!aVar || !aObject || typeof aObject !== "object" || if (!aObject || typeof aObject !== "object" ||
(aObject.type !== "object" && !Array.isArray(aObject))) { (aObject.type !== "object" && !Array.isArray(aObject))) {
return; return;
} }
@ -729,7 +686,7 @@ SourceScripts.prototype = {
* Handler for the debugger client's unsolicited newScript notification. * Handler for the debugger client's unsolicited newScript notification.
*/ */
_onNewScript: function SS__onNewScript(aNotification, aPacket) { _onNewScript: function SS__onNewScript(aNotification, aPacket) {
this._addScript({ url: aPacket.url, startLine: aPacket.startLine }, true); this._addScript({ url: aPacket.url, startLine: aPacket.startLine });
}, },
/** /**
@ -737,9 +694,8 @@ SourceScripts.prototype = {
*/ */
_onScriptsAdded: function SS__onScriptsAdded() { _onScriptsAdded: function SS__onScriptsAdded() {
for each (let script in this.activeThread.cachedScripts) { for each (let script in this.activeThread.cachedScripts) {
this._addScript(script, false); this._addScript(script);
} }
DebuggerView.Scripts.commitScripts();
}, },
/** /**
@ -791,22 +747,6 @@ 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/
@ -823,7 +763,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
* default to the script url prepath. * defalult to debugged panrent window location.
* @return string * @return string
* The simplified label. * The simplified label.
*/ */
@ -834,18 +774,15 @@ SourceScripts.prototype = {
return this._labelsCache[url]; return this._labelsCache[url];
} }
let content = window.parent.content; let href = aHref || window.parent.content.location.href;
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 already present in the scripts list. // if the label as a leaf name is alreay 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;
} }
@ -863,16 +800,15 @@ SourceScripts.prototype = {
}, },
/** /**
* Add the specified script to the list. * Add the specified script to the list and display it in the editor if the
* * editor is empty.
* @param object aScript
* The script object coming from the active thread.
* @param boolean aForceFlag
* True to force the script to be immediately added.
*/ */
_addScript: function SS__addScript(aScript, aForceFlag) { _addScript: function SS__addScript(aScript) {
DebuggerView.Scripts.addScript( DebuggerView.Scripts.addScript(this._getScriptLabel(aScript.url), aScript);
this._getScriptLabel(aScript.url), aScript, aForceFlag);
if (DebuggerView.editor.getCharCount() == 0) {
this.showScript(aScript);
}
}, },
/** /**
@ -940,7 +876,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: It may be better to use nsITraceableChannel to get to the sources * XXX: Tt 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/
*/ */
@ -1031,7 +967,7 @@ SourceScripts.prototype = {
* The failure status code. * The failure status code.
*/ */
_logError: function SS__logError(aUrl, aStatus) { _logError: function SS__logError(aUrl, aStatus) {
Cu.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus])); Components.utils.reportError(L10N.getFormatStr("loadingError", [aUrl, aStatus]));
}, },
}; };
@ -1322,27 +1258,6 @@ 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.
*/ */

View File

@ -90,7 +90,6 @@ let DebuggerView = {
*/ */
function ScriptsView() { function ScriptsView() {
this._onScriptsChange = this._onScriptsChange.bind(this); this._onScriptsChange = this._onScriptsChange.bind(this);
this._onScriptsSearch = this._onScriptsSearch.bind(this);
} }
ScriptsView.prototype = { ScriptsView.prototype = {
@ -104,14 +103,6 @@ ScriptsView.prototype = {
} }
}, },
/**
* Removes the input in the searchbox and unhides all the scripts.
*/
clearSearch: function DVS_clearSearch() {
this._searchbox.value = "";
this._onScriptsSearch({});
},
/** /**
* Checks whether the script with the specified URL is among the scripts * Checks whether the script with the specified URL is among the scripts
* known to the debugger and shown in the list. * known to the debugger and shown in the list.
@ -121,11 +112,6 @@ ScriptsView.prototype = {
* @return boolean * @return boolean
*/ */
contains: function DVS_contains(aUrl) { contains: function DVS_contains(aUrl) {
if (this._tmpScripts.some(function(element) {
return element.script.url == aUrl;
})) {
return true;
}
if (this._scripts.getElementsByAttribute("value", aUrl).length > 0) { if (this._scripts.getElementsByAttribute("value", aUrl).length > 0) {
return true; return true;
} }
@ -141,11 +127,6 @@ ScriptsView.prototype = {
* @return boolean * @return boolean
*/ */
containsLabel: function DVS_containsLabel(aLabel) { containsLabel: function DVS_containsLabel(aLabel) {
if (this._tmpScripts.some(function(element) {
return element.label == aLabel;
})) {
return true;
}
if (this._scripts.getElementsByAttribute("label", aLabel).length > 0) { if (this._scripts.getElementsByAttribute("label", aLabel).length > 0) {
return true; return true;
} }
@ -190,18 +171,6 @@ ScriptsView.prototype = {
this._scripts.selectedItem.value : null; this._scripts.selectedItem.value : null;
}, },
/**
* Returns the list of labels in the scripts container.
* @return array
*/
get scriptLabels() {
let labels = [];
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
labels.push(this._scripts.getItemAtIndex(i).label);
}
return labels;
},
/** /**
* Returns the list of URIs for scripts in the page. * Returns the list of URIs for scripts in the page.
* @return array * @return array
@ -215,212 +184,50 @@ ScriptsView.prototype = {
}, },
/** /**
* Gets the number of visible (hidden=false) scripts in the container. * Adds a script to the scripts container.
* @return number * If the script already exists (was previously added), null is returned.
*/ * Otherwise, the newly created element is returned.
get visibleItemsCount() {
let count = 0;
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
count += this._scripts.getItemAtIndex(i).hidden ? 0 : 1;
}
return count;
},
/**
* Prepares a script to be added to the scripts container. This allows
* for a large number of scripts to be batched up before being
* alphabetically sorted and added in the container.
* @see ScriptsView.commitScripts
*
* If aForceFlag is true, the script will be immediately inserted at the
* necessary position in the container so that all the scripts remain sorted.
* This can be much slower than batching up multiple scripts.
* *
* @param string aLabel * @param string aLabel
* The simplified script location to be shown. * The simplified script location to be shown.
* @param string aScript * @param string aScript
* The source script. * The source script.
* @param boolean aForceFlag * @return object
* True to force the script to be immediately added. * The newly created html node representing the added script.
*/ */
addScript: function DVS_addScript(aLabel, aScript, aForceFlag) { addScript: function DVS_addScript(aLabel, aScript) {
// Batch the script to be added later.
if (!aForceFlag) {
this._tmpScripts.push({ label: aLabel, script: aScript });
return;
}
// Find the target position in the menulist and insert the script there.
for (let i = 0, l = this._scripts.itemCount; i < l; i++) {
if (this._scripts.getItemAtIndex(i).label > aLabel) {
this._createScriptElement(aLabel, aScript, i);
return;
}
}
// The script is alphabetically the last one.
this._createScriptElement(aLabel, aScript, -1, true);
},
/**
* Adds all the prepared scripts to the scripts container.
* If a script already exists (was previously added), nothing happens.
*/
commitScripts: function DVS_commitScripts() {
let newScripts = this._tmpScripts;
this._tmpScripts = [];
if (!newScripts || !newScripts.length) {
return;
}
newScripts.sort(function(a, b) {
return a.label.toLowerCase() > b.label.toLowerCase();
});
for (let i = 0, l = newScripts.length; i < l; i++) {
let item = newScripts[i];
this._createScriptElement(item.label, item.script, -1, true);
}
},
/**
* Creates a custom script element and adds it to the scripts container.
* If the script with the specified label already exists, nothing happens.
*
* @param string aLabel
* The simplified script location to be shown.
* @param string aScript
* The source script.
* @param number aIndex
* The index where to insert to new script in the container.
* Pass -1 to append the script at the end.
* @param boolean aSelectIfEmptyFlag
* True to set the newly created script as the currently selected item
* if there are no other existing scripts in the container.
*/
_createScriptElement: function DVS__createScriptElement(
aLabel, aScript, aIndex, aSelectIfEmptyFlag)
{
// Make sure we don't duplicate anything. // Make sure we don't duplicate anything.
if (aLabel == "null" || this.containsLabel(aLabel)) { if (this.containsLabel(aLabel)) {
return; return null;
} }
let scriptItem = let script = this._scripts.appendItem(aLabel, aScript.url);
aIndex == -1 ? this._scripts.appendItem(aLabel, aScript.url) script.setAttribute("tooltiptext", aScript.url);
: this._scripts.insertItemAt(aIndex, aLabel, aScript.url); script.setUserData("sourceScript", aScript, null);
scriptItem.setAttribute("tooltiptext", aScript.url); this._scripts.selectedItem = script;
scriptItem.setUserData("sourceScript", aScript, null); return script;
if (this._scripts.itemCount == 1 && aSelectIfEmptyFlag) {
this._scripts.selectedItem = scriptItem;
}
}, },
/** /**
* The click listener for the scripts container. * The cached click listener for the scripts container.
*/ */
_onScriptsChange: function DVS__onScriptsChange() { _onScriptsChange: function DVS__onScriptsChange() {
let script = this._scripts.selectedItem.getUserData("sourceScript"); let script = this._scripts.selectedItem.getUserData("sourceScript");
this._preferredScript = script;
DebuggerController.SourceScripts.showScript(script); DebuggerController.SourceScripts.showScript(script);
}, },
/** /**
* The search listener for the scripts search box. * The cached scripts container.
*/
_onScriptsSearch: function DVS__onScriptsSearch(e) {
let editor = DebuggerView.editor;
let scripts = this._scripts;
let rawValue = this._searchbox.value.toLowerCase();
let rawLength = rawValue.length;
let lastColon = rawValue.lastIndexOf(":");
let lastAt = rawValue.lastIndexOf("@");
let fileEnd = lastColon != -1 ? lastColon : lastAt != -1 ? lastAt : rawLength;
let lineEnd = lastAt != -1 ? lastAt : rawLength;
let file = rawValue.slice(0, fileEnd);
let line = window.parseInt(rawValue.slice(fileEnd + 1, lineEnd)) || -1;
let token = rawValue.slice(lineEnd + 1);
// Presume we won't find anything.
scripts.selectedItem = this._preferredScript;
// If we're not searching for a file anymore, unhide all the scripts.
if (!file) {
for (let i = 0, l = scripts.itemCount; i < l; i++) {
scripts.getItemAtIndex(i).hidden = false;
}
} else {
for (let i = 0, l = scripts.itemCount, found = false; i < l; i++) {
let item = scripts.getItemAtIndex(i);
let target = item.value.toLowerCase();
// Search is not case sensitive, and is tied to the url not the label.
if (target.match(file)) {
item.hidden = false;
if (!found) {
found = true;
scripts.selectedItem = item;
}
}
// Hide what doesn't match our search.
else {
item.hidden = true;
}
}
}
if (line > -1) {
editor.setCaretPosition(line - 1);
}
if (token) {
let offset = editor.find(token, { ignoreCase: true });
if (offset > -1) {
editor.setCaretPosition(0);
editor.setCaretOffset(offset);
}
}
},
/**
* The keyup listener for the scripts search box.
*/
_onScriptsKeyUp: function DVS__onScriptsKeyUp(e) {
if (e.keyCode === e.DOM_VK_ESCAPE) {
DebuggerView.editor.focus();
return;
}
if (e.keyCode === e.DOM_VK_RETURN || e.keyCode === e.DOM_VK_ENTER) {
let editor = DebuggerView.editor;
let offset = editor.findNext(true);
if (offset > -1) {
editor.setCaretPosition(0);
editor.setCaretOffset(offset);
}
}
},
/**
* The cached scripts container and search box.
*/ */
_scripts: null, _scripts: null,
_searchbox: null,
/** /**
* Initialization function, called when the debugger is initialized. * Initialization function, called when the debugger is initialized.
*/ */
initialize: function DVS_initialize() { initialize: function DVS_initialize() {
this._scripts = document.getElementById("scripts"); this._scripts = document.getElementById("scripts");
this._searchbox = document.getElementById("scripts-search");
this._scripts.addEventListener("select", this._onScriptsChange, false); this._scripts.addEventListener("select", this._onScriptsChange, false);
this._searchbox.addEventListener("select", this._onScriptsSearch, false);
this._searchbox.addEventListener("input", this._onScriptsSearch, false);
this._searchbox.addEventListener("keyup", this._onScriptsKeyUp, false);
this.commitScripts();
}, },
/** /**
@ -428,11 +235,7 @@ ScriptsView.prototype = {
*/ */
destroy: function DVS_destroy() { destroy: function DVS_destroy() {
this._scripts.removeEventListener("select", this._onScriptsChange, false); this._scripts.removeEventListener("select", this._onScriptsChange, false);
this._searchbox.removeEventListener("select", this._onScriptsSearch, false);
this._searchbox.removeEventListener("input", this._onScriptsSearch, false);
this._searchbox.removeEventListener("keyup", this._onScriptsKeyUp, false);
this._scripts = null; this._scripts = null;
this._searchbox = null;
} }
}; };
@ -474,8 +277,6 @@ StackFramesView.prototype = {
else { else {
status.textContent = ""; status.textContent = "";
} }
DebuggerView.Scripts.clearSearch();
}, },
/** /**
@ -499,7 +300,7 @@ StackFramesView.prototype = {
// The empty node should look grayed out to avoid confusion. // The empty node should look grayed out to avoid confusion.
item.className = "empty list-item"; item.className = "empty list-item";
item.appendChild(document.createTextNode(L10N.getStr("emptyStackText"))); item.appendChild(document.createTextNode(L10N.getStr("emptyText")));
this._frames.appendChild(item); this._frames.appendChild(item);
}, },
@ -580,7 +381,7 @@ StackFramesView.prototype = {
* The frame depth specified by the debugger. * The frame depth specified by the debugger.
*/ */
unhighlightFrame: function DVF_unhighlightFrame(aDepth) { unhighlightFrame: function DVF_unhighlightFrame(aDepth) {
this.highlightFrame(aDepth, true); this.highlightFrame(aDepth, true)
}, },
/** /**

View File

@ -81,8 +81,6 @@
<xul:button id="step-in">&debuggerUI.stepInButton;</xul:button> <xul:button id="step-in">&debuggerUI.stepInButton;</xul:button>
<xul:button id="step-out">&debuggerUI.stepOutButton;</xul:button> <xul:button id="step-out">&debuggerUI.stepOutButton;</xul:button>
<xul:menulist id="scripts"/> <xul:menulist id="scripts"/>
<xul:textbox id="scripts-search" type="search"
emptytext="&debuggerUI.emptyFilterText;"/>
</xul:toolbar> </xul:toolbar>
<div id="dbg-content" class="hbox flex"> <div id="dbg-content" class="hbox flex">
<div id="stack" class="vbox"> <div id="stack" class="vbox">

View File

@ -46,7 +46,6 @@ 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 \
@ -71,9 +70,6 @@ _BROWSER_TEST_FILES = \
browser_dbg_stack-05.js \ browser_dbg_stack-05.js \
browser_dbg_location-changes.js \ browser_dbg_location-changes.js \
browser_dbg_script-switching.js \ browser_dbg_script-switching.js \
browser_dbg_scripts-sorting.js \
browser_dbg_scripts-searching-01.js \
browser_dbg_scripts-searching-02.js \
browser_dbg_pause-resume.js \ browser_dbg_pause-resume.js \
browser_dbg_update-editor-mode.js \ browser_dbg_update-editor-mode.js \
$(warning browser_dbg_select-line.js temporarily disabled due to oranges, see bug 726609) \ $(warning browser_dbg_select-line.js temporarily disabled due to oranges, see bug 726609) \

View File

@ -23,44 +23,37 @@ function test()
let SourceEditor = tempScope.SourceEditor; let SourceEditor = tempScope.SourceEditor;
let scriptShown = false; let scriptShown = false;
let framesAdded = false; let framesAdded = false;
let resumed = false;
let testStarted = false;
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) { debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab; gTab = aTab;
gDebuggee = aDebuggee; gDebuggee = aDebuggee;
gPane = aPane; gPane = aPane;
gDebugger = gPane.debuggerWindow; gDebugger = gPane.debuggerWindow;
resumed = true;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() { gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true; framesAdded = true;
executeSoon(startTest); runTest();
}); });
executeSoon(function() { gDebuggee.firstCall();
gDebuggee.firstCall();
});
}); });
function onScriptShown(aEvent) window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
{ let url = aEvent.detail.url;
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1; if (url.indexOf("-02.js") != -1) {
executeSoon(startTest); scriptShown = true;
} window.removeEventListener(aEvent.type, _onEvent);
runTest();
}
});
window.addEventListener("Debugger:ScriptShown", onScriptShown); function runTest()
function startTest()
{ {
if (scriptShown && framesAdded && resumed && !testStarted) { if (scriptShown && framesAdded) {
window.removeEventListener("Debugger:ScriptShown", onScriptShown); Services.tm.currentThread.dispatch({ run: onScriptShown }, 0);
testStarted = true;
Services.tm.currentThread.dispatch({ run: performTest }, 0);
} }
} }
function performTest() function onScriptShown()
{ {
gScripts = gDebugger.DebuggerView.Scripts; gScripts = gDebugger.DebuggerView.Scripts;

View File

@ -21,43 +21,37 @@ function test()
let contextMenu = null; let contextMenu = null;
let scriptShown = false; let scriptShown = false;
let framesAdded = false; let framesAdded = false;
let resumed = false;
let testStarted = false;
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) { debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab; gTab = aTab;
gDebuggee = aDebuggee; gDebuggee = aDebuggee;
gPane = aPane; gPane = aPane;
gDebugger = gPane.debuggerWindow; gDebugger = gPane.debuggerWindow;
resumed = true;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() { gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true; framesAdded = true;
executeSoon(startTest); runTest();
});
executeSoon(function() {
gDebuggee.firstCall();
}); });
gDebuggee.firstCall();
}); });
function onScriptShown(aEvent) { window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1; let url = aEvent.detail.url;
executeSoon(startTest); if (url.indexOf("-02.js") != -1) {
} scriptShown = true;
window.removeEventListener(aEvent.type, _onEvent);
runTest();
}
});
window.addEventListener("Debugger:ScriptShown", onScriptShown); function runTest()
function startTest()
{ {
if (scriptShown && framesAdded && resumed && !testStarted) { if (scriptShown && framesAdded) {
testStarted = true; Services.tm.currentThread.dispatch({ run: onScriptShown }, 0);
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
Services.tm.currentThread.dispatch({ run: performTest }, 0);
} }
} }
function performTest() function onScriptShown()
{ {
let scripts = gDebugger.DebuggerView.Scripts._scripts; let scripts = gDebugger.DebuggerView.Scripts._scripts;

View File

@ -1,86 +0,0 @@
/* 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;
});

View File

@ -85,8 +85,7 @@ function resumeAndFinish() {
gDebugger.DebuggerController.activeThread.resume(function() { gDebugger.DebuggerController.activeThread.resume(function() {
let vs = gDebugger.DebuggerView.Scripts; let vs = gDebugger.DebuggerView.Scripts;
let ss = gDebugger.DebuggerController.SourceScripts; let ss = gDebugger.DebuggerController.SourceScripts;
vs.empty(); ss._onScriptsCleared();
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
is(ss._trimUrlQuery("a/b/c.d?test=1&random=4"), "a/b/c.d", is(ss._trimUrlQuery("a/b/c.d?test=1&random=4"), "a/b/c.d",
"Trimming the url query isn't done properly."); "Trimming the url query isn't done properly.");
@ -102,11 +101,12 @@ function resumeAndFinish() {
{ href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" } { href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" }
]; ];
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
urls.forEach(function(url) { urls.forEach(function(url) {
executeSoon(function() { executeSoon(function() {
let loc = url.href + url.leaf; let loc = url.href + url.leaf;
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc }); vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
vs.commitScripts();
}); });
}); });

View File

@ -27,10 +27,10 @@ function testFrameParameters()
{ {
dump("Started testFrameParameters!\n"); dump("Started testFrameParameters!\n");
gDebugger.addEventListener("Debugger:FetchedVariables", function test() { gDebugger.addEventListener("Debugger:FetchedParameters", function test() {
dump("Entered Debugger:FetchedVariables!\n"); dump("Entered Debugger:FetchedParameters!\n");
gDebugger.removeEventListener("Debugger:FetchedVariables", test, false); gDebugger.removeEventListener("Debugger:FetchedParameters", test, false);
Services.tm.currentThread.dispatch({ run: function() { Services.tm.currentThread.dispatch({ run: function() {
dump("After currentThread.dispatch!\n"); dump("After currentThread.dispatch!\n");
@ -52,42 +52,33 @@ function testFrameParameters()
is(frames.querySelectorAll(".dbg-stackframe").length, 3, is(frames.querySelectorAll(".dbg-stackframe").length, 3,
"Should have three frames."); "Should have three frames.");
is(localNodes.length, 11, is(localNodes.length, 8,
"The localScope should contain all the created variable elements."); "The localScope should contain all the created variable elements.");
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]", is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
"Should have the right property value for 'this'."); "Should have the right property value for 'this'.");
is(localNodes[1].querySelector(".info").textContent, "[object Object]", is(localNodes[1].querySelector(".info").textContent, "[object Arguments]",
"Should have the right property value for 'arguments'.");
is(localNodes[2].querySelector(".info").textContent, "[object Object]",
"Should have the right property value for 'aArg'."); "Should have the right property value for 'aArg'.");
is(localNodes[2].querySelector(".info").textContent, '"beta"', is(localNodes[3].querySelector(".info").textContent, '"beta"',
"Should have the right property value for 'bArg'."); "Should have the right property value for 'bArg'.");
is(localNodes[3].querySelector(".info").textContent, "3", is(localNodes[4].querySelector(".info").textContent, "3",
"Should have the right property value for 'cArg'."); "Should have the right property value for 'cArg'.");
is(localNodes[4].querySelector(".info").textContent, "false", is(localNodes[5].querySelector(".info").textContent, "false",
"Should have the right property value for 'dArg'."); "Should have the right property value for 'dArg'.");
is(localNodes[5].querySelector(".info").textContent, "null", is(localNodes[6].querySelector(".info").textContent, "null",
"Should have the right property value for 'eArg'."); "Should have the right property value for 'eArg'.");
is(localNodes[6].querySelector(".info").textContent, "undefined", is(localNodes[7].querySelector(".info").textContent, "undefined",
"Should have the right property value for 'fArg'."); "Should have the right property value for 'fArg'.");
is(localNodes[7].querySelector(".info").textContent, "1",
"Should have the right property value for 'a'.");
is(localNodes[8].querySelector(".info").textContent, "[object Object]",
"Should have the right property value for 'b'.");
is(localNodes[9].querySelector(".info").textContent, "[object Object]",
"Should have the right property value for 'c'.");
is(localNodes[10].querySelector(".info").textContent, "[object Arguments]",
"Should have the right property value for 'arguments'.");
resumeAndFinish(); resumeAndFinish();
}}, 0); }}, 0);
}, false); }, false);

View File

@ -27,10 +27,10 @@ function testFrameParameters()
{ {
dump("Started testFrameParameters!\n"); dump("Started testFrameParameters!\n");
gDebugger.addEventListener("Debugger:FetchedVariables", function test() { gDebugger.addEventListener("Debugger:FetchedParameters", function test() {
dump("Entered Debugger:FetchedVariables!\n"); dump("Entered Debugger:FetchedParameters!\n");
gDebugger.removeEventListener("Debugger:FetchedVariables", test, false); gDebugger.removeEventListener("Debugger:FetchedParameters", test, false);
Services.tm.currentThread.dispatch({ run: function() { Services.tm.currentThread.dispatch({ run: function() {
dump("After currentThread.dispatch!\n"); dump("After currentThread.dispatch!\n");
@ -50,17 +50,16 @@ function testFrameParameters()
is(frames.querySelectorAll(".dbg-stackframe").length, 3, is(frames.querySelectorAll(".dbg-stackframe").length, 3,
"Should have three frames."); "Should have three frames.");
is(localNodes.length, 11, is(localNodes.length, 8,
"The localScope should contain all the created variable elements."); "The localScope should contain all the created variable elements.");
is(localNodes[0].querySelector(".info").textContent, "[object Proxy]", is(localNodes[0].querySelector(".info").textContent, "[object Proxy]",
"Should have the right property value for 'this'."); "Should have the right property value for 'this'.");
// Expand the '__proto__', 'arguments' and 'a' tree nodes. This causes // Expand the __proto__ and arguments tree nodes. This causes their
// their properties to be retrieved and displayed. // properties to be retrieved and displayed.
localNodes[0].expand(); localNodes[0].expand();
localNodes[9].expand(); localNodes[1].expand();
localNodes[10].expand();
// Poll every few milliseconds until the properties are retrieved. // Poll every few milliseconds until the properties are retrieved.
// It's important to set the timer in the chrome window, because the // It's important to set the timer in the chrome window, because the
@ -71,9 +70,7 @@ function testFrameParameters()
ok(false, "Timed out while polling for the properties."); ok(false, "Timed out while polling for the properties.");
resumeAndFinish(); resumeAndFinish();
} }
if (!localNodes[0].fetched || if (!localNodes[0].fetched || !localNodes[1].fetched) {
!localNodes[9].fetched ||
!localNodes[10].fetched) {
return; return;
} }
window.clearInterval(intervalID); window.clearInterval(intervalID);
@ -85,26 +82,14 @@ function testFrameParameters()
.textContent.search(/object/) != -1, .textContent.search(/object/) != -1,
"__proto__ should be an object."); "__proto__ should be an object.");
is(localNodes[9].querySelector(".info").textContent, "[object Object]", is(localNodes[1].querySelector(".info").textContent, "[object Arguments]",
"Should have the right property value for 'c'.");
is(localNodes[9].querySelectorAll(".property > .title > .key")[1]
.textContent, "a",
"Should have the right property name for 'a'.");
is(localNodes[9].querySelectorAll(".property > .title > .value")[1]
.textContent, 1,
"Should have the right value for 'c.a'.");
is(localNodes[10].querySelector(".info").textContent,
"[object Arguments]",
"Should have the right property value for 'arguments'."); "Should have the right property value for 'arguments'.");
is(localNodes[10].querySelector(".property > .title > .key") is(localNodes[1].querySelector(".property > .title > .key")
.textContent, "length", .textContent, "length",
"Should have the right property name for 'length'."); "Should have the right property name for length.");
is(localNodes[10].querySelector(".property > .title > .value") is(localNodes[1].querySelector(".property > .title > .value")
.textContent, 5, .textContent, 5,
"Should have the right argument length."); "Should have the right argument length.");
@ -119,8 +104,7 @@ function testFrameParameters()
} }
function resumeAndFinish() { function resumeAndFinish() {
let thread = gDebugger.DebuggerController.activeThread; gDebugger.DebuggerController.activeThread.addOneTimeListener("framescleared", function() {
thread.addOneTimeListener("framescleared", function() {
Services.tm.currentThread.dispatch({ run: function() { Services.tm.currentThread.dispatch({ run: function() {
var frames = gDebugger.DebuggerView.StackFrames._frames; var frames = gDebugger.DebuggerView.StackFrames._frames;
@ -131,7 +115,7 @@ function resumeAndFinish() {
}}, 0); }}, 0);
}); });
thread.resume(); gDebugger.DebuggerController.activeThread.resume();
} }
registerCleanupFunction(function() { registerCleanupFunction(function() {

View File

@ -8,6 +8,10 @@
const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html"; const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
let tempScope = {};
Cu.import("resource:///modules/source-editor.jsm", tempScope);
let SourceEditor = tempScope.SourceEditor;
var gPane = null; var gPane = null;
var gTab = null; var gTab = null;
var gDebuggee = null; var gDebuggee = null;
@ -18,39 +22,33 @@ function test()
{ {
let scriptShown = false; let scriptShown = false;
let framesAdded = false; let framesAdded = false;
let resumed = false;
let testStarted = false;
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) { debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab; gTab = aTab;
gDebuggee = aDebuggee; gDebuggee = aDebuggee;
gPane = aPane; gPane = aPane;
gDebugger = gPane.debuggerWindow; gDebugger = gPane.debuggerWindow;
resumed = true;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() { gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true; framesAdded = true;
executeSoon(startTest); runTest();
}); });
executeSoon(function() { gDebuggee.firstCall();
gDebuggee.firstCall();
});
}); });
function onScriptShown(aEvent) window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
{ let url = aEvent.detail.url;
scriptShown = aEvent.detail.url.indexOf("-02.js") != -1; if (url.indexOf("-02.js") != -1) {
executeSoon(startTest); scriptShown = true;
} window.removeEventListener(aEvent.type, _onEvent);
runTest();
}
});
window.addEventListener("Debugger:ScriptShown", onScriptShown); function runTest()
function startTest()
{ {
if (scriptShown && framesAdded && resumed && !testStarted) { if (scriptShown && framesAdded) {
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
testStarted = true;
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0); Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
} }
} }
@ -81,6 +79,8 @@ function testScriptsDisplay() {
ok(gDebugger.DebuggerView.Scripts.containsLabel( ok(gDebugger.DebuggerView.Scripts.containsLabel(
label2), "Second script label is incorrect."); label2), "Second script label is incorrect.");
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
ok(gDebugger.editor.getText().search(/debugger/) != -1, ok(gDebugger.editor.getText().search(/debugger/) != -1,
"The correct script was loaded initially."); "The correct script was loaded initially.");
@ -100,6 +100,8 @@ function testScriptsDisplay() {
function testSwitchPaused() function testSwitchPaused()
{ {
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
ok(gDebugger.editor.getText().search(/debugger/) == -1, ok(gDebugger.editor.getText().search(/debugger/) == -1,
"The second script is no longer displayed."); "The second script is no longer displayed.");
@ -125,8 +127,6 @@ function testSwitchPaused()
function testSwitchRunning() function testSwitchRunning()
{ {
dump("Debugger editor text:\n" + gDebugger.editor.getText() + "\n");
ok(gDebugger.editor.getText().search(/debugger/) != -1, ok(gDebugger.editor.getText().search(/debugger/) != -1,
"The second script is displayed again."); "The second script is displayed again.");

View File

@ -1,188 +0,0 @@
/* 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 gPane = null;
var gTab = null;
var gDebuggee = null;
var gDebugger = null;
var gEditor = null;
var gScripts = null;
var gSearchBox = null;
var gMenulist = null;
function test()
{
let scriptShown = false;
let framesAdded = false;
debug_tab_pane(STACK_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab;
gDebuggee = aDebuggee;
gPane = aPane;
gDebugger = gPane.debuggerWindow;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true;
runTest();
});
gDebuggee.simpleCall();
});
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
window.removeEventListener(aEvent.type, _onEvent);
scriptShown = true;
runTest();
});
function runTest()
{
if (scriptShown && framesAdded) {
Services.tm.currentThread.dispatch({ run: testScriptSearching }, 0);
}
}
}
function testScriptSearching() {
gDebugger.DebuggerController.activeThread.resume(function() {
gEditor = gDebugger.DebuggerView.editor;
gScripts = gDebugger.DebuggerView.Scripts;
gSearchBox = gScripts._searchbox;
gMenulist = gScripts._scripts;
write(":12");
ok(gEditor.getCaretPosition().line == 11 &&
gEditor.getCaretPosition().col == 0,
"The editor didn't jump to the correct line.");
write("@debugger");
ok(gEditor.getCaretPosition().line == 2 &&
gEditor.getCaretPosition().col == 44,
"The editor didn't jump to the correct token. (1)");
EventUtils.sendKey("RETURN");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (2)");
EventUtils.sendKey("ENTER");
ok(gEditor.getCaretPosition().line == 12 &&
gEditor.getCaretPosition().col == 8,
"The editor didn't jump to the correct token. (3)");
EventUtils.sendKey("ENTER");
ok(gEditor.getCaretPosition().line == 19 &&
gEditor.getCaretPosition().col == 4,
"The editor didn't jump to the correct token. (4)");
EventUtils.sendKey("RETURN");
ok(gEditor.getCaretPosition().line == 2 &&
gEditor.getCaretPosition().col == 44,
"The editor didn't jump to the correct token. (5)");
write(":bogus@debugger;");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (7)");
write(":13@debugger;");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (7)");
write(":@debugger;");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (8)");
write("::@debugger;");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (9)");
write(":::@debugger;");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (10)");
write(":i am not a number");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't remain at the correct token. (11)");
write("@__i do not exist__");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't remain at the correct token. (12)");
write(":1:2:3:a:b:c:::12");
ok(gEditor.getCaretPosition().line == 11 &&
gEditor.getCaretPosition().col == 0,
"The editor didn't jump to the correct line. (13)");
write("@don't@find@me@instead@find@debugger");
ok(gEditor.getCaretPosition().line == 2 &&
gEditor.getCaretPosition().col == 44,
"The editor didn't jump to the correct token. (14)");
EventUtils.sendKey("RETURN");
ok(gEditor.getCaretPosition().line == 8 &&
gEditor.getCaretPosition().col == 2,
"The editor didn't jump to the correct token. (15)");
EventUtils.sendKey("ENTER");
ok(gEditor.getCaretPosition().line == 12 &&
gEditor.getCaretPosition().col == 8,
"The editor didn't jump to the correct token. (16)");
EventUtils.sendKey("RETURN");
ok(gEditor.getCaretPosition().line == 19 &&
gEditor.getCaretPosition().col == 4,
"The editor didn't jump to the correct token. (17)");
EventUtils.sendKey("ENTER");
ok(gEditor.getCaretPosition().line == 2 &&
gEditor.getCaretPosition().col == 44,
"The editor didn't jump to the correct token. (18)");
clear();
ok(gEditor.getCaretPosition().line == 2 &&
gEditor.getCaretPosition().col == 44,
"The editor didn't remain at the correct token. (19)");
is(gScripts.visibleItemsCount, 1,
"Not all the scripts are shown after the search. (20)");
closeDebuggerAndFinish(gTab);
});
}
function clear() {
gSearchBox.focus();
gSearchBox.value = "";
}
function write(text) {
clear();
for (let i = 0; i < text.length; i++) {
EventUtils.sendChar(text[i]);
}
dump("editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
}
registerCleanupFunction(function() {
removeTab(gTab);
gPane = null;
gTab = null;
gDebuggee = null;
gDebugger = null;
gEditor = null;
gScripts = null;
gSearchBox = null;
gMenulist = null;
});

View File

@ -1,146 +0,0 @@
/* vim:set ts=2 sw=2 sts=2 et: */
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
const TAB_URL = EXAMPLE_URL + "browser_dbg_script-switching.html";
var gPane = null;
var gTab = null;
var gDebuggee = null;
var gDebugger = null;
var gEditor = null;
var gScripts = null;
var gSearchBox = null;
var gMenulist = null;
function test()
{
let scriptShown = false;
let framesAdded = false;
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab;
gDebuggee = aDebuggee;
gPane = aPane;
gDebugger = gPane.debuggerWindow;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true;
runTest();
});
gDebuggee.firstCall();
});
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
let url = aEvent.detail.url;
if (url.indexOf("-02.js") != -1) {
scriptShown = true;
window.removeEventListener(aEvent.type, _onEvent);
runTest();
}
});
function runTest()
{
if (scriptShown && framesAdded) {
Services.tm.currentThread.dispatch({ run: testScriptSearching }, 0);
}
}
}
function testScriptSearching() {
gDebugger.DebuggerController.activeThread.resume(function() {
gEditor = gDebugger.DebuggerView.editor;
gScripts = gDebugger.DebuggerView.Scripts;
gSearchBox = gScripts._searchbox;
gMenulist = gScripts._scripts;
firstSearch();
});
}
function firstSearch() {
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
dump("Current script url:\n" + aEvent.detail.url + "\n");
dump("Debugger editor text:\n" + gEditor.getText() + "\n");
let url = aEvent.detail.url;
if (url.indexOf("-01.js") != -1) {
window.removeEventListener(aEvent.type, _onEvent);
executeSoon(function() {
dump("Editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
ok(gEditor.getCaretPosition().line == 4 &&
gEditor.getCaretPosition().col == 0,
"The editor didn't jump to the correct line. (1)");
is(gScripts.visibleItemsCount, 1,
"Not all the correct scripts are shown after the search. (1)");
secondSearch();
});
}
});
write(".*-01\.js:5");
}
function secondSearch() {
window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
dump("Current script url:\n" + aEvent.detail.url + "\n");
dump("Debugger editor text:\n" + gEditor.getText() + "\n");
let url = aEvent.detail.url;
if (url.indexOf("-02.js") != -1) {
window.removeEventListener(aEvent.type, _onEvent);
executeSoon(function() {
dump("Editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
ok(gEditor.getCaretPosition().line == 5 &&
gEditor.getCaretPosition().col == 8,
"The editor didn't jump to the correct line. (2)");
is(gScripts.visibleItemsCount, 1,
"Not all the correct scripts are shown after the search. (2)");
finalCheck();
});
}
});
write(".*-02\.js@debugger;");
}
function finalCheck() {
clear();
ok(gEditor.getCaretPosition().line == 5 &&
gEditor.getCaretPosition().col == 8,
"The editor didn't remain at the correct token. (3)");
is(gScripts.visibleItemsCount, 2,
"Not all the scripts are shown after the search. (3)");
closeDebuggerAndFinish(gTab);
}
function clear() {
gSearchBox.focus();
gSearchBox.value = "";
}
function write(text) {
clear();
for (let i = 0; i < text.length; i++) {
EventUtils.sendChar(text[i]);
}
dump("editor caret position: " + gEditor.getCaretPosition().toSource() + "\n");
}
registerCleanupFunction(function() {
removeTab(gTab);
gPane = null;
gTab = null;
gDebuggee = null;
gDebugger = null;
gEditor = null;
gScripts = null;
gSearchBox = null;
gMenulist = null;
});

View File

@ -1,124 +0,0 @@
/* 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 gPane = null;
var gTab = null;
var gDebuggee = null;
var gDebugger = null;
function test() {
debug_tab_pane(STACK_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab;
gDebuggee = aDebuggee;
gPane = aPane;
gDebugger = gPane.debuggerWindow;
testSimpleCall();
});
}
function testSimpleCall() {
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
Services.tm.currentThread.dispatch({ run: function() {
resumeAndFinish();
}}, 0);
});
gDebuggee.simpleCall();
}
function resumeAndFinish() {
gDebugger.DebuggerController.activeThread.resume(function() {
checkScriptsOrder();
addScriptsAndCheckOrder(1, function() {
addScriptsAndCheckOrder(2, function() {
addScriptsAndCheckOrder(3, function() {
closeDebuggerAndFinish(gTab);
});
});
});
});
}
function addScriptsAndCheckOrder(method, callback) {
let vs = gDebugger.DebuggerView.Scripts;
let ss = gDebugger.DebuggerController.SourceScripts;
vs.empty();
vs._scripts.removeEventListener("select", vs._onScriptsChange, false);
let urls = [
{ href: "ici://some.address.com/random/", leaf: "subrandom/" },
{ href: "ni://another.address.org/random/subrandom/", leaf: "page.html" },
{ href: "san://interesting.address.gro/random/", leaf: "script.js" },
{ href: "si://interesting.address.moc/random/", leaf: "script.js" },
{ href: "si://interesting.address.moc/random/", leaf: "x/script.js" },
{ href: "si://interesting.address.moc/random/", leaf: "x/y/script.js?a=1" },
{ href: "si://interesting.address.moc/random/x/", leaf: "y/script.js?a=1&b=2" },
{ href: "si://interesting.address.moc/random/x/y/", leaf: "script.js?a=1&b=2&c=3" }
];
urls.sort(function(a, b) {
return Math.random() - 0.5;
});
switch (method) {
case 1:
urls.forEach(function(url) {
let loc = url.href + url.leaf;
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
});
vs.commitScripts();
break;
case 2:
urls.forEach(function(url) {
let loc = url.href + url.leaf;
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc }, true);
});
break;
case 3:
let i = 0
for (; i < urls.length / 2; i++) {
let url = urls[i];
let loc = url.href + url.leaf;
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc });
}
vs.commitScripts();
for (; i < urls.length; i++) {
let url = urls[i];
let loc = url.href + url.leaf;
vs.addScript(ss._getScriptLabel(loc, url.href), { url: loc }, true);
}
break;
}
executeSoon(function() {
checkScriptsOrder(method);
callback();
});
}
function checkScriptsOrder(method) {
let labels = gDebugger.DebuggerView.Scripts.scriptLabels;
let sorted = labels.reduce(function(prev, curr, index, array) {
return array[index - 1] < array[index];
});
ok(sorted,
"Using method " + method + ", " +
"the scripts weren't in the correct order: " + labels.toSource());
return sorted;
}
registerCleanupFunction(function() {
removeTab(gTab);
gPane = null;
gTab = null;
gDebuggee = null;
gDebugger = null;
});

View File

@ -22,38 +22,32 @@ function test()
{ {
let scriptShown = false; let scriptShown = false;
let framesAdded = false; let framesAdded = false;
let testStarted = false;
let resumed = false;
debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) { debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) {
gTab = aTab; gTab = aTab;
gDebuggee = aDebuggee; gDebuggee = aDebuggee;
gPane = aPane; gPane = aPane;
gDebugger = gPane.debuggerWindow; gDebugger = gPane.debuggerWindow;
resumed = true;
gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() { gDebugger.DebuggerController.activeThread.addOneTimeListener("framesadded", function() {
framesAdded = true; framesAdded = true;
executeSoon(startTest); runTest();
});
executeSoon(function() {
gDebuggee.firstCall();
}); });
gDebuggee.firstCall();
}); });
function onScriptShown(aEvent) { window.addEventListener("Debugger:ScriptShown", function _onEvent(aEvent) {
scriptShown = aEvent.detail.url.indexOf("test-editor-mode") != -1; let url = aEvent.detail.url;
executeSoon(startTest); if (url.indexOf("editor-mode") != -1) {
} scriptShown = true;
window.removeEventListener(aEvent.type, _onEvent);
runTest();
}
});
window.addEventListener("Debugger:ScriptShown", onScriptShown); function runTest()
function startTest()
{ {
if (scriptShown && framesAdded && resumed && !testStarted) { if (scriptShown && framesAdded) {
window.removeEventListener("Debugger:ScriptShown", onScriptShown);
testStarted = true;
Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0); Services.tm.currentThread.dispatch({ run: testScriptsDisplay }, 0);
} }
} }

View File

@ -92,6 +92,7 @@ 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();
@ -105,17 +106,3 @@ 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);
});
});
}

View File

@ -398,7 +398,7 @@ InspectorUI.prototype = {
*/ */
get isInspectorOpen() get isInspectorOpen()
{ {
return !!(this.toolbar && !this.toolbar.hidden && this.highlighter); return this.toolbar && !this.toolbar.hidden && this.highlighter;
}, },
/** /**
@ -647,7 +647,7 @@ InspectorUI.prototype = {
if (!aKeepInspector) if (!aKeepInspector)
this.store.deleteInspector(this.winID); this.store.deleteInspector(this.winID);
this.inspectMenuitem.removeAttribute("checked"); this.inspectMenuitem.setAttribute("checked", false);
this.browser = this.win = null; // null out references to browser and window this.browser = this.win = null; // null out references to browser and window
this.winID = null; this.winID = null;
this.selection = null; this.selection = null;

View File

@ -17,5 +17,3 @@ browser.jar:
content/browser/debugger.css (debugger/debugger.css) content/browser/debugger.css (debugger/debugger.css)
content/browser/debugger-controller.js (debugger/debugger-controller.js) content/browser/debugger-controller.js (debugger/debugger-controller.js)
content/browser/debugger-view.js (debugger/debugger-view.js) content/browser/debugger-view.js (debugger/debugger-view.js)
content/browser/devtools/gcli.css (webconsole/gcli.css)
content/browser/devtools/gcliblank.xhtml (webconsole/gcliblank.xhtml)

View File

@ -1,476 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the Firefox Developer Toolbar.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2012
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Dave Camp <dcamp@mozilla.com> (Original Author)
* Joe Walker <jwalker@mozilla.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
"use strict";
Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
Components.utils.import("resource://gre/modules/Services.jsm");
let EXPORTED_SYMBOLS = [ "DeveloperToolbar", "loadCommands" ];
XPCOMUtils.defineLazyGetter(this, "gcli", function () {
let obj = {};
Components.utils.import("resource:///modules/gcli.jsm", obj);
return obj.gcli;
});
let console = gcli._internal.console;
/**
* Load the various Command JSMs.
* Should be called when the developer toolbar first opens.
*/
function loadCommands()
{
Components.utils.import("resource:///modules/GcliCommands.jsm", {});
Components.utils.import("resource:///modules/GcliTiltCommands.jsm", {});
}
let commandsLoaded = false;
/**
* A component to manage the global developer toolbar, which contains a GCLI
* and buttons for various developer tools.
* @param aChromeWindow The browser window to which this toolbar is attached
* @param aToolbarElement See browser.xul:<toolbar id="developer-toolbar">
*/
function DeveloperToolbar(aChromeWindow, aToolbarElement)
{
if (!commandsLoaded) {
loadCommands();
commandsLoaded = true;
}
this._chromeWindow = aChromeWindow;
this._element = aToolbarElement;
this._element.hidden = true;
this._doc = this._element.ownerDocument;
this._command = this._doc.getElementById("Tools:DevToolbar");
aChromeWindow.getBrowser().tabContainer.addEventListener("TabSelect", this, false);
}
/**
* Inspector notifications dispatched through the nsIObserverService
*/
const NOTIFICATIONS = {
/** DeveloperToolbar.show() has been called */
SHOW: "developer-toolbar-show",
/** DeveloperToolbar.hide() has been called */
HIDE: "developer-toolbar-hide"
};
/**
* Attach notification constants to the object prototype so tests etc can
* use them without needing to import anything
*/
DeveloperToolbar.prototype.NOTIFICATIONS = NOTIFICATIONS;
/**
* Is the toolbar open?
*/
Object.defineProperty(DeveloperToolbar.prototype, 'visible', {
get: function DT_visible() {
return !this._element.hidden;
},
enumerable: true
});
/**
* Called from browser.xul in response to menu-click or keyboard shortcut to
* toggle the toolbar
*/
DeveloperToolbar.prototype.toggle = function DT_toggle()
{
if (this.visible) {
this.hide();
} else {
this.show();
this._input.focus();
}
};
/**
* Even if the user has not clicked on 'Got it' in the intro, we only show it
* once per session.
* Warning this is slightly messed up because this.DeveloperToolbar is not the
* same as this.DeveloperToolbar when in browser.js context.
*/
DeveloperToolbar.introShownThisSession = false;
/**
* Show the developer toolbar
*/
DeveloperToolbar.prototype.show = function DT_show()
{
this._command.setAttribute("checked", "true");
this._input = this._doc.querySelector(".gclitoolbar-input-node");
this.tooltipPanel = new TooltipPanel(this._doc, this._input);
this.outputPanel = new OutputPanel(this._doc, this._input);
let contentDocument = this._chromeWindow.getBrowser().contentDocument;
this.display = gcli._internal.createDisplay({
contentDocument: contentDocument,
chromeDocument: this._doc,
chromeWindow: this._chromeWindow,
hintElement: this.tooltipPanel.hintElement,
inputElement: this._input,
completeElement: this._doc.querySelector(".gclitoolbar-complete-node"),
backgroundElement: this._doc.querySelector(".gclitoolbar-stack-node"),
outputDocument: this.outputPanel.document,
environment: {
chromeDocument: this._doc,
contentDocument: contentDocument
},
tooltipClass: 'gcliterm-tooltip',
eval: null,
scratchpad: null
});
this.display.onVisibilityChange.add(this.outputPanel._visibilityChanged, this.outputPanel);
this.display.onVisibilityChange.add(this.tooltipPanel._visibilityChanged, this.tooltipPanel);
this.display.onOutput.add(this.outputPanel._outputChanged, this.outputPanel);
this._element.hidden = false;
this._notify(NOTIFICATIONS.SHOW);
if (!DeveloperToolbar.introShownThisSession) {
this.display.maybeShowIntro();
DeveloperToolbar.introShownThisSession = true;
}
};
/**
* Hide the developer toolbar
*/
DeveloperToolbar.prototype.hide = function DT_hide()
{
this._command.setAttribute("checked", "false");
this.display.onVisibilityChange.remove(this.outputPanel._visibilityChanged, this.outputPanel);
this.display.onVisibilityChange.remove(this.tooltipPanel._visibilityChanged, this.tooltipPanel);
this.display.onOutput.remove(this.outputPanel._outputChanged, this.outputPanel);
this.display.destroy();
// We could "delete this.display" etc if we have hard-to-track-down memory
// leaks as a belt-and-braces approach, however this prevents our DOM node
// hunter from looking in all the nooks and crannies, so it's better if we
// can be leak-free without
this.outputPanel.remove();
delete this.outputPanel;
this.tooltipPanel.remove();
delete this.tooltipPanel;
this._element.hidden = true;
this._notify(NOTIFICATIONS.HIDE);
};
/**
* Utility for sending notifications
* @param aTopic a NOTIFICATION constant
*/
DeveloperToolbar.prototype._notify = function DT_notify(aTopic)
{
let data = { toolbar: this };
data.wrappedJSObject = data;
Services.obs.notifyObservers(data, aTopic, null);
};
/**
* Update various parts of the UI when the current tab changes
* @param aEvent
*/
DeveloperToolbar.prototype.handleEvent = function DT_handleEvent(aEvent)
{
if (aEvent.type == "TabSelect") {
this._chromeWindow.HUDConsoleUI.refreshCommand();
this._chromeWindow.DebuggerUI.refreshCommand();
if (this.visible) {
let contentDocument = this._chromeWindow.getBrowser().contentDocument;
this.display.reattach({
contentDocument: contentDocument,
chromeWindow: this._chromeWindow,
environment: {
chromeDocument: this._doc,
contentDocument: contentDocument
},
});
}
}
};
/**
* Add class="gcli-panel-inner-arrowcontent" to a panel's
* |<xul:box class="panel-inner-arrowcontent">| so we can alter the styling
* without complex CSS expressions.
* @param aPanel The panel to affect
*/
function getContentBox(aPanel)
{
let container = aPanel.ownerDocument.getAnonymousElementByAttribute(
aPanel, "anonid", "container");
return container.querySelector(".panel-inner-arrowcontent");
}
/**
* Helper function to calculate the sum of the vertical padding and margins
* between a nested node |aNode| and an ancestor |aRoot|. Iff all of the
* children of aRoot are 'only-childs' until you get to aNode then to avoid
* scroll-bars, the 'correct' height of aRoot is verticalSpacing + aNode.height.
* @param aNode The child node whose height is known.
* @param aRoot The parent height whose height we can affect.
* @return The sum of the vertical padding/margins in between aNode and aRoot.
*/
function getVerticalSpacing(aNode, aRoot)
{
let win = aNode.ownerDocument.defaultView;
function pxToNum(styles, property) {
return parseInt(styles.getPropertyValue(property).replace(/px$/, ''), 10);
}
let vertSpacing = 0;
do {
let styles = win.getComputedStyle(aNode);
vertSpacing += pxToNum(styles, "padding-top");
vertSpacing += pxToNum(styles, "padding-bottom");
vertSpacing += pxToNum(styles, "margin-top");
vertSpacing += pxToNum(styles, "margin-bottom");
vertSpacing += pxToNum(styles, "border-top-width");
vertSpacing += pxToNum(styles, "border-bottom-width");
let prev = aNode.previousSibling;
while (prev != null) {
vertSpacing += prev.clientHeight;
prev = prev.previousSibling;
}
let next = aNode.nextSibling;
while (next != null) {
vertSpacing += next.clientHeight;
next = next.nextSibling;
}
aNode = aNode.parentNode;
} while (aNode !== aRoot);
return vertSpacing + 9;
}
/**
* Panel to handle command line output.
* @param aChromeDoc document from which we can pull the parts we need.
* @param aInput the input element that should get focus.
*/
function OutputPanel(aChromeDoc, aInput)
{
this._input = aInput;
this._panel = aChromeDoc.getElementById("gcli-output");
this._frame = aChromeDoc.getElementById("gcli-output-frame");
this._anchor = aChromeDoc.getElementById("developer-toolbar");
this._content = getContentBox(this._panel);
this._content.classList.add("gcli-panel-inner-arrowcontent");
this.document = this._frame.contentDocument;
this.document.body.classList.add("gclichrome-output");
this._div = this.document.querySelector("div");
this._div.classList.add('gcli-row-out');
this._div.setAttribute('aria-live', 'assertive');
this.displayedOutput = undefined;
}
/**
* Display the OutputPanel.
*/
OutputPanel.prototype.show = function OP_show()
{
this._panel.ownerDocument.defaultView.setTimeout(function() {
this._resize();
}.bind(this), 0);
this._resize();
this._panel.openPopup(this._anchor, "before_end", -300, 0, false, false, null);
this._input.focus();
};
/**
* Internal helper to set the height of the output panel to fit the available
* content;
*/
OutputPanel.prototype._resize = function CLP_resize()
{
let vertSpacing = getVerticalSpacing(this._content, this._panel);
let idealHeight = this.document.body.scrollHeight + vertSpacing;
this._panel.sizeTo(400, Math.min(idealHeight, 500));
};
/**
* Called by GCLI when a command is executed.
*/
OutputPanel.prototype._outputChanged = function OP_outputChanged(aEvent)
{
if (aEvent.output.hidden) {
return;
}
this.remove();
this.displayedOutput = aEvent.output;
this.update();
this.displayedOutput.onChange.add(this.update, this);
this.displayedOutput.onClose.add(this.remove, this);
};
/**
* Called when displayed Output says it's changed or from outputChanged, which
* happens when there is a new displayed Output.
*/
OutputPanel.prototype.update = function OP_update()
{
if (this.displayedOutput.data == null) {
while (this._div.hasChildNodes()) {
this._div.removeChild(this._div.firstChild);
}
} else {
this.displayedOutput.toDom(this._div);
this.show();
}
};
/**
* Detach listeners from the currently displayed Output.
*/
OutputPanel.prototype.remove = function OP_remove()
{
this._panel.hidePopup();
if (this.displayedOutput) {
this.displayedOutput.onChange.remove(this.update, this);
this.displayedOutput.onClose.remove(this.remove, this);
delete this.displayedOutput;
}
};
/**
* Called by GCLI to indicate that we should show or hide one either the
* tooltip panel or the output panel.
*/
OutputPanel.prototype._visibilityChanged = function OP_visibilityChanged(aEvent)
{
if (aEvent.outputVisible === true) {
// this.show is called by _outputChanged
} else {
this._panel.hidePopup();
}
};
/**
* Panel to handle tooltips.
* @param aChromeDoc document from which we can pull the parts we need.
* @param aInput the input element that should get focus.
*/
function TooltipPanel(aChromeDoc, aInput)
{
this._input = aInput;
this._panel = aChromeDoc.getElementById("gcli-tooltip");
this._frame = aChromeDoc.getElementById("gcli-tooltip-frame");
this._anchor = aChromeDoc.getElementById("developer-toolbar");
this._content = getContentBox(this._panel);
this._content.classList.add("gcli-panel-inner-arrowcontent");
this.document = this._frame.contentDocument;
this.document.body.classList.add("gclichrome-tooltip");
this.hintElement = this.document.querySelector("div");
}
/**
* Display the TooltipPanel.
*/
TooltipPanel.prototype.show = function TP_show()
{
let vertSpacing = getVerticalSpacing(this._content, this._panel);
let idealHeight = this.document.body.scrollHeight + vertSpacing;
this._panel.sizeTo(350, Math.min(idealHeight, 500));
this._panel.openPopup(this._anchor, "before_start", 0, 0, false, false, null);
this._input.focus();
};
/**
* Hide the TooltipPanel.
*/
TooltipPanel.prototype.remove = function TP_remove()
{
this._panel.hidePopup();
};
/**
* Called by GCLI to indicate that we should show or hide one either the
* tooltip panel or the output panel.
*/
TooltipPanel.prototype._visibilityChanged = function TP_visibilityChanged(aEvent)
{
if (aEvent.tooltipVisible === true) {
this.show();
} else {
this._panel.hidePopup();
}
};

View File

@ -42,11 +42,6 @@ var EXPORTED_SYMBOLS = [ "Templater", "template" ];
Components.utils.import("resource://gre/modules/Services.jsm"); Components.utils.import("resource://gre/modules/Services.jsm");
const Node = Components.interfaces.nsIDOMNode; const Node = Components.interfaces.nsIDOMNode;
/**
* For full documentation, see:
* https://github.com/mozilla/domtemplate/blob/master/README.md
*/
// WARNING: do not 'use_strict' without reading the notes in _envEval(); // WARNING: do not 'use_strict' without reading the notes in _envEval();
/** /**
@ -55,16 +50,8 @@ const Node = Components.interfaces.nsIDOMNode;
* @param data Data to use in filling out the template * @param data Data to use in filling out the template
* @param options Options to customize the template processing. One of: * @param options Options to customize the template processing. One of:
* - allowEval: boolean (default false) Basic template interpolations are * - allowEval: boolean (default false) Basic template interpolations are
* either property paths (e.g. ${a.b.c.d}), or if allowEval=true then we * either property paths (e.g. ${a.b.c.d}), however if allowEval=true then we
* allow arbitrary JavaScript * allow arbitrary JavaScript
* - stack: string or array of strings (default empty array) The template
* engine maintains a stack of tasks to help debug where it is. This allows
* this stack to be prefixed with a template name
* - blankNullUndefined: By default DOMTemplate exports null and undefined
* values using the strings 'null' and 'undefined', which can be helpful for
* debugging, but can introduce unnecessary extra logic in a template to
* convert null/undefined to ''. By setting blankNullUndefined:true, this
* conversion is handled by DOMTemplate
*/ */
function template(node, data, options) { function template(node, data, options) {
var template = new Templater(options || {}); var template = new Templater(options || {});
@ -81,15 +68,7 @@ function Templater(options) {
options = { allowEval: true }; options = { allowEval: true };
} }
this.options = options; this.options = options;
if (options.stack && Array.isArray(options.stack)) { this.stack = [];
this.stack = options.stack;
}
else if (typeof options.stack === 'string') {
this.stack = [ options.stack ];
}
else {
this.stack = [];
}
} }
/** /**
@ -111,7 +90,7 @@ Templater.prototype._splitSpecial = /\uF001|\uF002/;
* Cached regex used to detect if a script is capable of being interpreted * Cached regex used to detect if a script is capable of being interpreted
* using Template._property() or if we need to use Template._envEval() * using Template._property() or if we need to use Template._envEval()
*/ */
Templater.prototype._isPropertyScript = /^[_a-zA-Z0-9.]*$/; Templater.prototype._isPropertyScript = /^[a-zA-Z0-9.]*$/;
/** /**
* Recursive function to walk the tree processing the attributes as it goes. * Recursive function to walk the tree processing the attributes as it goes.
@ -174,11 +153,7 @@ Templater.prototype.processNode = function(node, data) {
} else { } else {
// Replace references in all other attributes // Replace references in all other attributes
var newValue = value.replace(this._templateRegion, function(path) { var newValue = value.replace(this._templateRegion, function(path) {
var insert = this._envEval(path.slice(2, -1), data, value); return this._envEval(path.slice(2, -1), data, value);
if (this.options.blankNullUndefined && insert == null) {
insert = '';
}
return insert;
}.bind(this)); }.bind(this));
// Remove '_' prefix of attribute names so the DOM won't try // Remove '_' prefix of attribute names so the DOM won't try
// to use them before we've processed the template // to use them before we've processed the template
@ -202,7 +177,7 @@ Templater.prototype.processNode = function(node, data) {
this.processNode(childNodes[j], data); this.processNode(childNodes[j], data);
} }
if (node.nodeType === 3 /*Node.TEXT_NODE*/) { if (node.nodeType === Node.TEXT_NODE) {
this._processTextNode(node, data); this._processTextNode(node, data);
} }
} finally { } finally {
@ -372,27 +347,8 @@ Templater.prototype._processTextNode = function(node, data) {
part = this._envEval(part.slice(1), data, node.data); part = this._envEval(part.slice(1), data, node.data);
} }
this._handleAsync(part, node, function(reply, siblingNode) { this._handleAsync(part, node, function(reply, siblingNode) {
var doc = siblingNode.ownerDocument; reply = this._toNode(reply, siblingNode.ownerDocument);
if (reply == null) { siblingNode.parentNode.insertBefore(reply, siblingNode);
reply = this.options.blankNullUndefined ? '' : '' + reply;
}
if (typeof reply.cloneNode === 'function') {
// i.e. if (reply instanceof Element) { ...
reply = this._maybeImportNode(reply, doc);
siblingNode.parentNode.insertBefore(reply, siblingNode);
} else if (typeof reply.item === 'function' && reply.length) {
// if thing is a NodeList, then import the children
for (var i = 0; i < reply.length; i++) {
var child = this._maybeImportNode(reply.item(i), doc);
siblingNode.parentNode.insertBefore(child, siblingNode);
}
}
else {
// if thing isn't a DOM element then wrap its string value in one
reply = doc.createTextNode(reply.toString());
siblingNode.parentNode.insertBefore(reply, siblingNode);
}
}.bind(this)); }.bind(this));
}, this); }, this);
node.parentNode.removeChild(node); node.parentNode.removeChild(node);
@ -400,13 +356,21 @@ Templater.prototype._processTextNode = function(node, data) {
}; };
/** /**
* Return node or a import of node, if it's not in the given document * Helper to convert a 'thing' to a DOM Node.
* @param node The node that we want to be properly owned * This is (obviously) a no-op for DOM Elements (which are detected using
* @param doc The document that the given node should belong to * 'typeof thing.cloneNode !== "function"' (is there a better way that will
* @return A node that belongs to the given document * work in all environments, including a .jsm?)
* Non DOM elements are converted to a string and wrapped in a TextNode.
*/ */
Templater.prototype._maybeImportNode = function(node, doc) { Templater.prototype._toNode = function(thing, document) {
return node.ownerDocument === doc ? node : doc.importNode(node, true); if (thing == null) {
thing = '' + thing;
}
// if thing isn't a DOM element then wrap its string value in one
if (typeof thing.cloneNode !== 'function') {
thing = document.createTextNode(thing.toString());
}
return thing;
}; };
/** /**
@ -465,6 +429,7 @@ Templater.prototype._stripBraces = function(str) {
* <tt>newValue</tt> is applied. * <tt>newValue</tt> is applied.
*/ */
Templater.prototype._property = function(path, data, newValue) { Templater.prototype._property = function(path, data, newValue) {
this.stack.push(path);
try { try {
if (typeof path === 'string') { if (typeof path === 'string') {
path = path.split('.'); path = path.split('.');
@ -480,13 +445,12 @@ Templater.prototype._property = function(path, data, newValue) {
return value; return value;
} }
if (!value) { if (!value) {
this._handleError('"' + path[0] + '" is undefined'); this._handleError('Can\'t find path=' + path);
return null; return null;
} }
return this._property(path.slice(1), value, newValue); return this._property(path.slice(1), value, newValue);
} catch (ex) { } finally {
this._handleError('Path error with \'' + path + '\'', ex); this.stack.pop();
return '${' + path + '}';
} }
}; };
@ -505,7 +469,7 @@ Templater.prototype._property = function(path, data, newValue) {
*/ */
Templater.prototype._envEval = function(script, data, frame) { Templater.prototype._envEval = function(script, data, frame) {
try { try {
this.stack.push(frame.replace(/\s+/g, ' ')); this.stack.push(frame);
if (this._isPropertyScript.test(script)) { if (this._isPropertyScript.test(script)) {
return this._property(script, data); return this._property(script, data);
} else { } else {
@ -519,7 +483,8 @@ Templater.prototype._envEval = function(script, data, frame) {
} }
} }
} catch (ex) { } catch (ex) {
this._handleError('Template error evaluating \'' + script + '\'', ex); this._handleError('Template error evaluating \'' + script + '\'' +
' environment=' + Object.keys(data).join(', '), ex);
return '${' + script + '}'; return '${' + script + '}';
} finally { } finally {
this.stack.pop(); this.stack.pop();
@ -533,7 +498,8 @@ Templater.prototype._envEval = function(script, data, frame) {
* @param ex optional associated exception. * @param ex optional associated exception.
*/ */
Templater.prototype._handleError = function(message, ex) { Templater.prototype._handleError = function(message, ex) {
this._logError(message + ' (In: ' + this.stack.join(' > ') + ')'); this._logError(message);
this._logError('In: ' + this.stack.join(' > '));
if (ex) { if (ex) {
this._logError(ex); this._logError(ex);
} }

View File

@ -49,21 +49,11 @@ include $(topsrcdir)/config/rules.mk
_BROWSER_TEST_FILES = \ _BROWSER_TEST_FILES = \
browser_promise_basic.js \ browser_promise_basic.js \
browser_templater_basic.js \ browser_templater_basic.js \
browser_toolbar_basic.js \
browser_gcli_commands.js \
browser_gcli_inspect.js \
browser_gcli_integrate.js \
browser_gcli_require.js \
browser_gcli_web.js \
browser_gcli_break.js \
head.js \ head.js \
$(NULL) $(NULL)
_BROWSER_TEST_PAGES = \ _BROWSER_TEST_PAGES = \
browser_templater_basic.html \ browser_templater_basic.html \
browser_toolbar_basic.html \
browser_gcli_inspect.html \
browser_gcli_break.html \
$(NULL) $(NULL)
libs:: $(_BROWSER_TEST_FILES) libs:: $(_BROWSER_TEST_FILES)

View File

@ -1,82 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the break command works as it should
const TEST_URI = "http://example.com/browser/browser/devtools/shared/test/browser_gcli_break.html";
function test() {
DeveloperToolbarTest.test(TEST_URI, function(browser, tab) {
testBreakCommands();
});
}
function testBreakCommands() {
DeveloperToolbarTest.checkInputStatus({
typed: "brea",
directTabText: "k",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "break",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "break add",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "break add line",
emptyParameters: [ " <file>", " <line>" ],
status: "ERROR"
});
let pane = DebuggerUI.toggleDebugger();
pane._frame.addEventListener("Debugger:Connecting", function dbgConnected() {
pane._frame.removeEventListener("Debugger:Connecting", dbgConnected, true);
// Wait for the initial resume.
let client = pane.debuggerWindow.gClient;
client.addOneTimeListener("resumed", function() {
client.activeThread.addOneTimeListener("framesadded", function() {
DeveloperToolbarTest.checkInputStatus({
typed: "break add line " + TEST_URI + " " + content.wrappedJSObject.line0,
status: "VALID"
});
DeveloperToolbarTest.exec({
args: {
type: 'line',
file: TEST_URI,
line: content.wrappedJSObject.line0
},
completed: false
});
DeveloperToolbarTest.checkInputStatus({
typed: "break list",
status: "VALID"
});
DeveloperToolbarTest.exec();
client.activeThread.resume(function() {
DeveloperToolbarTest.checkInputStatus({
typed: "break del 0",
status: "VALID"
});
DeveloperToolbarTest.exec({
args: { breakid: 0 },
completed: false
});
finish();
});
});
// Trigger newScript notifications using eval.
content.wrappedJSObject.firstCall();
});
}, true);
}

View File

@ -1,55 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Test various GCLI commands
let imported = {};
Components.utils.import("resource:///modules/HUDService.jsm", imported);
const TEST_URI = "data:text/html;charset=utf-8,gcli-commands";
function test() {
DeveloperToolbarTest.test(TEST_URI, function(browser, tab) {
testEcho();
testConsoleClear();
testConsoleOpenClose(tab);
imported = undefined;
finish();
});
}
function testEcho() {
DeveloperToolbarTest.exec({
typed: "echo message",
args: { message: "message" },
outputMatch: /^message$/,
});
}
function testConsoleClear() {
DeveloperToolbarTest.exec({
typed: "console clear",
args: {},
blankOutput: true,
});
}
function testConsoleOpenClose(tab) {
DeveloperToolbarTest.exec({
typed: "console open",
args: {},
blankOutput: true,
});
let hud = imported.HUDService.getHudByWindow(content);
ok(hud.hudId in imported.HUDService.hudReferences, "console open");
DeveloperToolbarTest.exec({
typed: "console close",
args: {},
blankOutput: true,
});
ok(!(hud.hudId in imported.HUDService.hudReferences), "console closed");
}

View File

@ -1,68 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the inspect command works as it should
const TEST_URI = "http://example.com/browser/browser/devtools/shared/test/browser_gcli_inspect.html";
function test() {
DeveloperToolbarTest.test(TEST_URI, function(browser, tab) {
testInspect();
finish();
});
}
function testInspect() {
DeveloperToolbarTest.checkInputStatus({
typed: "inspec",
directTabText: "t",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect",
emptyParameters: [ " <node>" ],
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect h1",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect span",
status: "ERROR"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect div",
status: "VALID"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect .someclass",
status: "VALID"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect #someid",
status: "VALID"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect button[disabled]",
status: "VALID"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect p>strong",
status: "VALID"
});
DeveloperToolbarTest.checkInputStatus({
typed: "inspect :root",
status: "VALID"
});
}

View File

@ -1,40 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that source URLs in the Web Console can be clicked to display the
// standard View Source window.
function test() {
testCreateCommands();
testRemoveCommands();
}
let tselarr = {
name: 'tselarr',
params: [
{ name: 'num', type: { name: 'selection', data: [ '1', '2', '3' ] } },
{ name: 'arr', type: { name: 'array', subtype: 'string' } },
],
exec: function(args, env) {
return "flu " + args.num + "-" + args.arr.join("_");
}
};
function testCreateCommands() {
let gcliIndex = require("gcli/index");
gcliIndex.addCommand(tselarr);
let canon = require("gcli/canon");
let tselcmd = canon.getCommand("tselarr");
ok(tselcmd != null, "tselarr exists in the canon");
ok(tselcmd instanceof canon.Command, "canon storing commands");
}
function testRemoveCommands() {
let gcliIndex = require("gcli/index");
gcliIndex.removeCommand(tselarr);
let canon = require("gcli/canon");
let tselcmd = canon.getCommand("tselarr");
ok(tselcmd == null, "tselcmd removed from the canon");
}

View File

@ -3,15 +3,11 @@
// Tests that the DOM Template engine works properly // Tests that the DOM Template engine works properly
/* let tempScope = {};
* These tests run both in Mozilla/Mochitest and plain browsers (as does Cu.import("resource:///modules/devtools/Templater.jsm", tempScope);
* domtemplate) Cu.import("resource:///modules/devtools/Promise.jsm", tempScope);
* We should endevour to keep the source in sync. let template = tempScope.template;
*/ let Promise = tempScope.Promise;
var imports = {};
Cu.import("resource:///modules/devtools/Templater.jsm", imports);
Cu.import("resource:///modules/devtools/Promise.jsm", imports);
function test() { function test() {
addTab("http://example.com/browser/browser/devtools/shared/test/browser_templater_basic.html", function() { addTab("http://example.com/browser/browser/devtools/shared/test/browser_templater_basic.html", function() {
@ -29,7 +25,7 @@ function runTest(index) {
holder.innerHTML = options.template; holder.innerHTML = options.template;
info('Running ' + options.name); info('Running ' + options.name);
imports.template(holder, options.data, options.options); template(holder, options.data, options.options);
if (typeof options.result == 'string') { if (typeof options.result == 'string') {
is(holder.innerHTML, options.result, options.name); is(holder.innerHTML, options.result, options.name);
@ -242,43 +238,11 @@ var tests = [
name: 'propertyFail', name: 'propertyFail',
template: '<p>${Math.max(1, 2)}</p>', template: '<p>${Math.max(1, 2)}</p>',
result: '<p>${Math.max(1, 2)}</p>' result: '<p>${Math.max(1, 2)}</p>'
};},
// Bug 723431: DOMTemplate should allow customisation of display of
// null/undefined values
function() { return {
name: 'propertyUndefAttrFull',
template: '<p>${nullvar}|${undefinedvar1}|${undefinedvar2}</p>',
data: { nullvar: null, undefinedvar1: undefined },
result: '<p>null|undefined|undefined</p>'
};},
function() { return {
name: 'propertyUndefAttrBlank',
template: '<p>${nullvar}|${undefinedvar1}|${undefinedvar2}</p>',
data: { nullvar: null, undefinedvar1: undefined },
options: { blankNullUndefined: true },
result: '<p>||</p>'
};},
function() { return {
name: 'propertyUndefAttrFull',
template: '<div><p value="${nullvar}"></p><p value="${undefinedvar1}"></p><p value="${undefinedvar2}"></p></div>',
data: { nullvar: null, undefinedvar1: undefined },
result: '<div><p value="null"></p><p value="undefined"></p><p value="undefined"></p></div>'
};},
function() { return {
name: 'propertyUndefAttrBlank',
template: '<div><p value="${nullvar}"></p><p value="${undefinedvar1}"></p><p value="${undefinedvar2}"></p></div>',
data: { nullvar: null, undefinedvar1: undefined },
options: { blankNullUndefined: true },
result: '<div><p value=""></p><p value=""></p><p value=""></p></div>'
};} };}
]; ];
function delayReply(data) { function delayReply(data) {
var p = new imports.Promise(); var p = new Promise();
executeSoon(function() { executeSoon(function() {
p.resolve(data); p.resolve(data);
}); });

View File

@ -1,35 +0,0 @@
<!doctype html>
<!-- Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ -->
<html>
<head>
<meta charset="UTF-8">
<title>Developer Toolbar Tests</title>
<style type="text/css">
#single { color: red; }
</style>
<script type="text/javascript">var a=1;</script>
</head>
<body>
<p id=single>
1
</p>
<p class=twin>
2a
</p>
<p class=twin>
2b
</p>
<style>
.twin { color: blue; }
</style>
<script>var b=2;</script>
</body>
</html>

View File

@ -1,36 +0,0 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
// Tests that the developer toolbar works properly
const URL = "http://example.com/browser/browser/devtools/shared/test/browser_toolbar_basic.html";
function test() {
addTab(URL, function(browser, tab) {
info("Starting browser_toolbar_basic.js");
runTest();
});
}
function runTest() {
Services.obs.addObserver(checkOpen, DeveloperToolbar.NOTIFICATIONS.SHOW, false);
// TODO: reopen the window so the pref has a chance to take effect
// EventUtils.synthesizeKey("v", { ctrlKey: true, shiftKey: true });
DeveloperToolbarTest.show();
}
function checkOpen() {
Services.obs.removeObserver(checkOpen, DeveloperToolbar.NOTIFICATIONS.SHOW, false);
ok(DeveloperToolbar.visible, "DeveloperToolbar is visible");
Services.obs.addObserver(checkClosed, DeveloperToolbar.NOTIFICATIONS.HIDE, false);
// EventUtils.synthesizeKey("v", { ctrlKey: true, shiftKey: true });
DeveloperToolbarTest.hide();
}
function checkClosed() {
Services.obs.removeObserver(checkClosed, DeveloperToolbar.NOTIFICATIONS.HIDE, false);
ok(!DeveloperToolbar.visible, "DeveloperToolbar is not visible");
finish();
}

View File

@ -36,38 +36,23 @@
* *
* ***** END LICENSE BLOCK ***** */ * ***** END LICENSE BLOCK ***** */
let gcli; let tab;
let console; let browser;
let require;
let define;
(function() {
let tempScope = {};
Components.utils.import("resource:///modules/gcli.jsm", tempScope);
gcli = tempScope.gcli;
console = gcli._internal.console;
define = gcli._internal.define;
require = gcli._internal.require;
})();
/**
* Open a new tab at a URL and call a callback on load
*/
function addTab(aURL, aCallback) function addTab(aURL, aCallback)
{ {
waitForExplicitFinish(); waitForExplicitFinish();
function onTabLoad() {
browser.removeEventListener("load", onTabLoad, true);
aCallback();
}
gBrowser.selectedTab = gBrowser.addTab(); gBrowser.selectedTab = gBrowser.addTab();
content.location = aURL; content.location = aURL;
let tab = gBrowser.selectedTab; tab = gBrowser.selectedTab;
let browser = gBrowser.getBrowserForTab(tab); browser = gBrowser.getBrowserForTab(tab);
function onTabLoad() {
browser.removeEventListener("load", onTabLoad, true);
aCallback(browser, tab);
}
browser.addEventListener("load", onTabLoad, true); browser.addEventListener("load", onTabLoad, true);
} }
@ -77,236 +62,6 @@ registerCleanupFunction(function tearDown() {
gBrowser.removeCurrentTab(); gBrowser.removeCurrentTab();
} }
console = undefined; tab = undefined;
define = undefined; browser = undefined;
require = undefined;
gcli = undefined;
}); });
/**
* Various functions for testing DeveloperToolbar
*/
let DeveloperToolbarTest = {
/**
* Paranoid DeveloperToolbar.show();
*/
show: function DTT_show() {
if (DeveloperToolbar.visible) {
ok(false, "DeveloperToolbar.visible at start of openDeveloperToolbar");
}
else {
DeveloperToolbar.show();
}
},
/**
* Paranoid DeveloperToolbar.hide();
*/
hide: function DTT_hide() {
if (!DeveloperToolbar.visible) {
ok(false, "!DeveloperToolbar.visible at start of closeDeveloperToolbar");
}
else {
DeveloperToolbar.display.inputter.setInput("");
DeveloperToolbar.hide();
}
},
/**
* Check that we can parse command input.
* Doesn't execute the command, just checks that we grok the input properly:
*
* DeveloperToolbarTest.checkInputStatus({
* // Test inputs
* typed: "ech", // Required
* cursor: 3, // Optional cursor position
*
* // Thing to check
* status: "INCOMPLETE", // One of "VALID", "ERROR", "INCOMPLETE"
* emptyParameters: [ "<message>" ], // Still to type
* directTabText: "o", // Simple completion text
* arrowTabText: "", // When the completion is not an extension
* });
*/
checkInputStatus: function DTT_checkInputStatus(test) {
if (test.typed) {
DeveloperToolbar.display.inputter.setInput(test.typed);
}
else {
ok(false, "Missing typed for " + JSON.stringify(test));
return;
}
if (test.cursor) {
DeveloperToolbar.display.inputter.setCursor(test.cursor)
}
if (test.status) {
is(DeveloperToolbar.display.requisition.getStatus().toString(),
test.status,
"status for " + test.typed);
}
if (test.emptyParameters == null) {
test.emptyParameters = [];
}
let completer = DeveloperToolbar.display.completer;
let realParams = completer.emptyParameters;
is(realParams.length, test.emptyParameters.length,
'emptyParameters.length for \'' + test.typed + '\'');
if (realParams.length === test.emptyParameters.length) {
for (let i = 0; i < realParams.length; i++) {
is(realParams[i].replace(/\u00a0/g, ' '), test.emptyParameters[i],
'emptyParameters[' + i + '] for \'' + test.typed + '\'');
}
}
if (test.directTabText) {
is(completer.directTabText, test.directTabText,
'directTabText for \'' + test.typed + '\'');
}
else {
is(completer.directTabText, '', 'directTabText for \'' + test.typed + '\'');
}
if (test.arrowTabText) {
is(completer.arrowTabText, ' \u00a0\u21E5 ' + test.arrowTabText,
'arrowTabText for \'' + test.typed + '\'');
}
else {
is(completer.arrowTabText, '', 'arrowTabText for \'' + test.typed + '\'');
}
},
/**
* Execute a command:
*
* DeveloperToolbarTest.exec({
* // Test inputs
* typed: "echo hi", // Optional, uses existing if undefined
*
* // Thing to check
* args: { message: "hi" }, // Check that the args were understood properly
* outputMatch: /^hi$/, // Regex to test against textContent of output
* blankOutput: true, // Special checks when there is no output
* });
*/
exec: function DTT_exec(test) {
test = test || {};
if (test.typed) {
DeveloperToolbar.display.inputter.setInput(test.typed);
}
let typed = DeveloperToolbar.display.inputter.getInputState().typed;
let output = DeveloperToolbar.display.requisition.exec();
is(typed, output.typed, 'output.command for: ' + typed);
if (test.completed !== false) {
ok(output.completed, 'output.completed false for: ' + typed);
}
else {
// It is actually an error if we say something is async and it turns
// out not to be? For now we're saying 'no'
// ok(!output.completed, 'output.completed true for: ' + typed);
}
if (test.args != null) {
is(Object.keys(test.args).length, Object.keys(output.args).length,
'arg count for ' + typed);
Object.keys(output.args).forEach(function(arg) {
let expectedArg = test.args[arg];
let actualArg = output.args[arg];
if (Array.isArray(expectedArg)) {
if (!Array.isArray(actualArg)) {
ok(false, 'actual is not an array. ' + typed + '/' + arg);
return;
}
is(expectedArg.length, actualArg.length,
'array length: ' + typed + '/' + arg);
for (let i = 0; i < expectedArg.length; i++) {
is(expectedArg[i], actualArg[i],
'member: "' + typed + '/' + arg + '/' + i);
}
}
else {
is(expectedArg, actualArg, 'typed: "' + typed + '" arg: ' + arg);
}
});
}
let displayed = DeveloperToolbar.outputPanel._div.textContent;
if (test.outputMatch) {
if (!test.outputMatch.test(displayed)) {
ok(false, "html output for " + typed + " (textContent sent to info)");
info("Actual textContent");
info(displayed);
}
}
if (test.blankOutput != null) {
if (!/^$/.test(displayed)) {
ok(false, "html output for " + typed + " (textContent sent to info)");
info("Actual textContent");
info(displayed);
}
}
},
/**
* Quick wrapper around the things you need to do to run DeveloperToolbar
* command tests:
* - Set the pref 'devtools.toolbar.enabled' to true
* - Add a tab pointing at |uri|
* - Open the DeveloperToolbar
* - Register a cleanup function to undo the above
* - Run the tests
*
* @param uri The uri of a page to load. Can be 'about:blank' or 'data:...'
* @param testFunc A function containing the tests to run. This should
* arrange for 'finish()' to be called on completion.
*/
test: function DTT_test(uri, testFunc) {
let menuItem = document.getElementById("menu_devToolbar");
let command = document.getElementById("Tools:DevToolbar");
let appMenuItem = document.getElementById("appmenu_devToolbar");
registerCleanupFunction(function() {
DeveloperToolbarTest.hide();
// a.k.a Services.prefs.clearUserPref("devtools.toolbar.enabled");
if (menuItem) {
menuItem.hidden = true;
}
if (command) {
command.setAttribute("disabled", "true");
}
if (appMenuItem) {
appMenuItem.hidden = true;
}
});
// a.k.a: Services.prefs.setBoolPref("devtools.toolbar.enabled", true);
if (menuItem) {
menuItem.hidden = false;
}
if (command) {
command.removeAttribute("disabled");
}
if (appMenuItem) {
appMenuItem.hidden = false;
}
addTab(uri, function(browser, tab) {
DeveloperToolbarTest.show();
testFunc(browser, tab);
});
},
};

View File

@ -101,23 +101,11 @@ gcli.addCommand({
name: "console close", name: "console close",
description: gcli.lookup("consolecloseDesc"), description: gcli.lookup("consolecloseDesc"),
exec: function Command_consoleClose(args, context) { exec: function Command_consoleClose(args, context) {
let tab = context.environment.chromeDocument.defaultView.gBrowser.selectedTab let tab = HUDService.getHudReferenceById(context.environment.hudId).tab;
HUDService.deactivateHUDForContext(tab); HUDService.deactivateHUDForContext(tab);
} }
}); });
/**
* 'console open' command
*/
gcli.addCommand({
name: "console open",
description: gcli.lookup("consoleopenDesc"),
exec: function Command_consoleOpen(args, context) {
let tab = context.environment.chromeDocument.defaultView.gBrowser.selectedTab
HUDService.activateHUDForContext(tab);
}
});
/** /**
* 'inspect' command * 'inspect' command
*/ */

View File

@ -151,6 +151,24 @@ function LogFactory(aMessagePrefix)
return log; return log;
} }
/**
* Load the various Command JSMs.
* Should be called when the console first opens.
*
* @return an object containing the EXPORTED_SYMBOLS from all the command
* modules. In general there is no reason when JSMs need to export symbols
* except when they need the host environment to inform them of things like the
* current window/document/etc.
*/
function loadCommands() {
let commandExports = {};
Cu.import("resource:///modules/GcliCommands.jsm", commandExports);
Cu.import("resource:///modules/GcliTiltCommands.jsm", commandExports);
return commandExports;
}
let log = LogFactory("*** HUDService:"); let log = LogFactory("*** HUDService:");
const HUD_STRINGS_URI = "chrome://browser/locale/devtools/webconsole.properties"; const HUD_STRINGS_URI = "chrome://browser/locale/devtools/webconsole.properties";
@ -1552,7 +1570,6 @@ HUD_SERVICE.prototype =
if (procInstr.contexts.indexOf(hudId) == -1) { if (procInstr.contexts.indexOf(hudId) == -1) {
procInstr.contexts.push(hudId); procInstr.contexts.push(hudId);
} }
HeadsUpDisplayUICommands.refreshCommand();
}, },
/** /**
@ -1583,7 +1600,6 @@ HUD_SERVICE.prototype =
this.unregisterDisplay(hudId); this.unregisterDisplay(hudId);
window.focus(); window.focus();
HeadsUpDisplayUICommands.refreshCommand();
} }
// Remove this context from the list of contexts that need the GCLI CSS // Remove this context from the list of contexts that need the GCLI CSS
@ -3598,7 +3614,7 @@ HeadsUpDisplay.prototype = {
{ {
let usegcli = false; let usegcli = false;
try { try {
// usegcli = Services.prefs.getBoolPref("devtools.gcli.enable"); usegcli = Services.prefs.getBoolPref("devtools.gcli.enable");
} }
catch (ex) {} catch (ex) {}
@ -6319,16 +6335,6 @@ ConsoleUtils = {
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
HeadsUpDisplayUICommands = { HeadsUpDisplayUICommands = {
refreshCommand: function UIC_refreshCommand() {
var window = HUDService.currentContext();
let command = window.document.getElementById("Tools:WebConsole");
if (this.getOpenHUD() != null) {
command.setAttribute("checked", true);
} else {
command.removeAttribute("checked");
}
},
toggleHUD: function UIC_toggleHUD() { toggleHUD: function UIC_toggleHUD() {
var window = HUDService.currentContext(); var window = HUDService.currentContext();
var gBrowser = window.gBrowser; var gBrowser = window.gBrowser;
@ -6829,76 +6835,93 @@ function GcliTerm(aContentWindow, aHudId, aDocument, aConsole, aHintNode, aConso
this.createUI(); this.createUI();
this.createSandbox(); this.createSandbox();
this.gcliConsole = gcli._internal.createDisplay({ this.show = this.show.bind(this);
contentDocument: aContentWindow.document, this.hide = this.hide.bind(this);
chromeDocument: this.document,
outputDocument: this.document,
chromeWindow: this.document.defaultView,
hintElement: this.hintNode, // Allow GCLI:Inputter to decide how and when to open a scratchpad window
inputElement: this.inputNode, let scratchpad = {
completeElement: this.completeNode, shouldActivate: function Scratchpad_shouldActivate(aEvent) {
backgroundElement: this.inputStack, return aEvent.shiftKey &&
consoleWrap: aConsoleWrap, aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_RETURN;
},
eval: this.evalInSandbox.bind(this), activate: function Scratchpad_activate(aValue) {
aValue = aValue.replace(/^\s*{\s*/, '');
ScratchpadManager.openScratchpad({ text: aValue });
return true;
},
linkText: stringBundle.GetStringFromName('scratchpad.linkText')
};
this.opts = {
environment: { environment: {
hudId: this.hudId,
chromeDocument: this.document, chromeDocument: this.document,
contentDocument: aContentWindow.document contentDocument: aContentWindow.document
}, },
chromeDocument: this.document,
tooltipClass: 'gcliterm-tooltip', contentDocument: aContentWindow.document,
jsEnvironment: {
// Allow GCLI:Inputter to decide how and when to open a scratchpad window globalObject: unwrap(aContentWindow),
scratchpad: { evalFunction: this.evalInSandbox.bind(this)
shouldActivate: function Scratchpad_shouldActivate(aEvent) {
return aEvent.shiftKey &&
aEvent.keyCode === Ci.nsIDOMKeyEvent.DOM_VK_RETURN;
},
activate: function Scratchpad_activate(aValue) {
aValue = aValue.replace(/^\s*{\s*/, '');
ScratchpadManager.openScratchpad({ text: aValue });
return true;
},
linkText: stringBundle.GetStringFromName('scratchpad.linkText')
}, },
}); inputElement: this.inputNode,
completeElement: this.completeNode,
inputBackgroundElement: this.inputStack,
hintElement: this.hintNode,
consoleWrap: aConsoleWrap,
scratchpad: scratchpad,
gcliTerm: this
};
this.gcliConsole.onVisibilityChange.add(this.onVisibilityChange, this); gcli._internal.commandOutputManager.addListener(this.onCommandOutput, this);
this.gcliConsole.onOutput.add(this.onOutput, this); gcli._internal.createView(this.opts);
if (!commandExports) {
commandExports = loadCommands();
}
} }
GcliTerm.prototype = { GcliTerm.prototype = {
/** /**
* Show or remove the hint column from the display. * Remove the hint column from the display.
*/ */
onVisibilityChange: function GcliTerm_onVisibilityChange(ev) hide: function GcliTerm_hide()
{ {
if (ev.visible) { let permaHint = false;
this.hintNode.parentNode.hidden = false; try {
permaHint = Services.prefs.getBoolPref("devtools.gcli.permaHint");
} }
else { catch (ex) {}
let permaHint = false;
try {
permaHint = Services.prefs.getBoolPref("devtools.gcli.permaHint");
}
catch (ex) {}
if (!permaHint) { if (!permaHint) {
this.hintNode.parentNode.hidden = true; this.hintNode.parentNode.hidden = true;
}
} }
}, },
/**
* Undo the effects of calling hide().
*/
show: function GcliTerm_show()
{
this.hintNode.parentNode.hidden = false;
},
/** /**
* Destroy the GcliTerm object. Call this method to avoid memory leaks. * Destroy the GcliTerm object. Call this method to avoid memory leaks.
*/ */
destroy: function Gcli_destroy() destroy: function Gcli_destroy()
{ {
this.gcliConsole.onVisibilityChange.remove(this.onVisibilityChange, this); gcli._internal.removeView(this.opts);
this.gcliConsole.onOutput.remove(this.onOutput, this); gcli._internal.commandOutputManager.removeListener(this.onCommandOutput, this);
this.gcliConsole.destroy();
delete this.opts.chromeDocument;
delete this.opts.inputElement;
delete this.opts.completeElement;
delete this.opts.inputBackgroundElement;
delete this.opts.hintElement;
delete this.opts.contentDocument;
delete this.opts.jsEnvironment;
delete this.opts.gcliTerm;
delete this.context; delete this.context;
delete this.document; delete this.document;
@ -6907,10 +6930,10 @@ GcliTerm.prototype = {
delete this._window; delete this._window;
delete this.sandbox; delete this.sandbox;
delete this.element; delete this.element
delete this.inputStack; delete this.inputStack
delete this.completeNode; delete this.completeNode
delete this.inputNode; delete this.inputNode
}, },
/** /**
@ -6927,13 +6950,11 @@ GcliTerm.prototype = {
this.console = aConsole; this.console = aConsole;
this.createSandbox(); this.createSandbox();
this.gcliConsole.reattach({ this.opts.environment.contentDocument = aContentWindow.document;
contentDocument: aContentWindow.document, this.opts.contentDocument = aContentWindow.document;
environment: { this.opts.jsEnvironment.globalObject = unwrap(aContentWindow);
chromeDocument: this.document,
contentDocument: aContentWindow.document gcli._internal.reattachConsole(this.opts);
},
});
}, },
/** /**
@ -6964,7 +6985,7 @@ GcliTerm.prototype = {
/** /**
* Called by GCLI/canon when command line output changes. * Called by GCLI/canon when command line output changes.
*/ */
onOutput: function Gcli_onOutput(aEvent) onCommandOutput: function Gcli_onCommandOutput(aEvent)
{ {
// When we can update the history of the console, then we should stop // When we can update the history of the console, then we should stop
// filtering incomplete reports. // filtering incomplete reports.

View File

@ -1,74 +0,0 @@
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 1.1 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is the GCLI.
*
* The Initial Developer of the Original Code is
* The Mozilla Foundation.
* Portions created by the Initial Developer are Copyright (C) 2011
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Joe Walker <jwalker@mozilla.com> (original author)
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** */
.gclichrome-output {
max-width: 350px;
}
.gclichrome-tooltip {
max-width: 350px;
}
.gcli-help-name {
text-align: end;
}
.gcli-help-synopsis {
cursor: pointer;
display: inline-block;
}
.gcli-help-synopsis:before {
content: '\bb';
}
.gcli-menu-option {
overflow: hidden;
white-space: nowrap;
cursor: pointer;
}
.gcli-menu-template {
border-collapse: collapse;
width: 100%;
}
.gcli-menu-error {
overflow: hidden;
white-space: nowrap;
}

File diff suppressed because it is too large Load Diff

View File

@ -1,59 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"
[
<!ENTITY % webConsoleDTD SYSTEM "chrome://browser/locale/devtools/webConsole.dtd">
%webConsoleDTD;
]
>
<!-- ***** BEGIN LICENSE BLOCK *****
- Version: MPL 1.1/GPL 2.0/LGPL 2.1
-
- The contents of this file are subject to the Mozilla Public License Version
- 1.1 (the "License"); you may not use this file except in compliance with
- the License. You may obtain a copy of the License at
- http://www.mozilla.org/MPL/
-
- Software distributed under the License is distributed on an "AS IS" basis,
- WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- for the specific language governing rights and limitations under the
- License.
-
- The Original Code is GCLI.
-
- The Initial Developer of the Original Code is
- Mozilla Foundation.
- Portions created by the Initial Developer are Copyright (C) 2010
- the Initial Developer. All Rights Reserved.
-
- Contributor(s):
- Joe Walker <jwalker@mozilla.com>
-
- Alternatively, the contents of this file may be used under the terms of
- either the GNU General Public License Version 2 or later (the "GPL"), or
- the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- in which case the provisions of the GPL or the LGPL are applicable instead
- of those above. If you wish to allow use of your version of this file only
- under the terms of either the GPL or the LGPL, and not to allow others to
- use your version of this file under the terms of the MPL, indicate your
- decision by deleting the provisions above and replace them with the notice
- and other provisions required by the LGPL or the GPL. If you do not delete
- the provisions above, a recipient may use your version of this file under
- the terms of any one of the MPL, the GPL or the LGPL.
-
- ***** END LICENSE BLOCK ***** -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<link rel="stylesheet" href="chrome://global/skin/global.css" type="text/css"/>
<link rel="stylesheet" href="chrome://browser/content/devtools/gcli.css" type="text/css"/>
<link rel="stylesheet" href="chrome://browser/skin/devtools/gcli.css" type="text/css"/>
</head>
<body id="gclichrome-body">
<div>
</div>
</body>
</html>

View File

@ -144,10 +144,17 @@ _BROWSER_TEST_FILES = \
browser_webconsole_bug_678816.js \ browser_webconsole_bug_678816.js \
browser_webconsole_bug_664131_console_group.js \ browser_webconsole_bug_664131_console_group.js \
browser_webconsole_bug_704295.js \ browser_webconsole_bug_704295.js \
browser_gcli_commands.js \
browser_gcli_helpers.js \
browser_gcli_inspect.js \
browser_gcli_integrate.js \
browser_gcli_require.js \
browser_gcli_web.js \
browser_webconsole_bug_658368_time_methods.js \ browser_webconsole_bug_658368_time_methods.js \
browser_webconsole_bug_622303_persistent_filters.js \ browser_webconsole_bug_622303_persistent_filters.js \
browser_webconsole_window_zombie.js \ browser_webconsole_window_zombie.js \
browser_cached_messages.js \ browser_cached_messages.js \
browser_gcli_break.js \
head.js \ head.js \
$(NULL) $(NULL)
@ -218,9 +225,11 @@ _BROWSER_TEST_PAGES = \
test-bug-646025-console-file-location.html \ test-bug-646025-console-file-location.html \
test-bug-678816-content.js \ test-bug-678816-content.js \
test-file-location.js \ test-file-location.js \
browser_gcli_inspect.html \
test-bug-658368-time-methods.html \ test-bug-658368-time-methods.html \
test-webconsole-error-observer.html \ test-webconsole-error-observer.html \
test-for-of.html \ test-for-of.html \
browser_gcli_break.html \
$(NULL) $(NULL)
libs:: $(_BROWSER_TEST_FILES) libs:: $(_BROWSER_TEST_FILES)

View File

@ -1,8 +1,8 @@
<!DOCTYPE HTML> <!DOCTYPE HTML>
<html> <html>
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<title>Browser GCLI break command test</title> <title>Browser GCLI break command test</title>
<!-- Any copyright is dedicated to the Public Domain. <!-- Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ --> http://creativecommons.org/publicdomain/zero/1.0/ -->
<script type="text/javascript"> <script type="text/javascript">
@ -13,7 +13,7 @@
eval("debugger;"); eval("debugger;");
} }
</script> </script>
</head> </head>
<body> <body>
</body> </body>
</html> </html>

View File

@ -0,0 +1,105 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
// Tests that the break command works as it should
let tempScope = {};
Components.utils.import("resource:///modules/gcli.jsm", tempScope);
let gcli = tempScope.gcli;
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/browser_gcli_break.html";
registerCleanupFunction(function() {
gcliterm = undefined;
requisition = undefined;
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", true);
addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", onLoad, false);
}
let gcliterm;
let requisition;
function onLoad() {
browser.removeEventListener("DOMContentLoaded", onLoad, false);
try {
openConsole();
let hud = HUDService.getHudByWindow(content);
gcliterm = hud.gcliterm;
requisition = gcliterm.opts.requisition;
testSetup();
testCreateCommands();
}
catch (ex) {
ok(false, "Caught exception: " + ex)
gcli._internal.console.error("Test Failure", ex);
closeConsole();
finishTest();
}
}
function testSetup() {
ok(gcliterm, "We have a GCLI term");
ok(requisition, "We have a Requisition");
}
function testCreateCommands() {
type("brea");
is(gcliterm.completeNode.textContent, " break", "Completion for 'brea'");
is(requisition.getStatus().toString(), "ERROR", "brea is ERROR");
type("break");
is(requisition.getStatus().toString(), "ERROR", "break is ERROR");
type("break add");
is(requisition.getStatus().toString(), "ERROR", "break add is ERROR");
type("break add line");
is(requisition.getStatus().toString(), "ERROR", "break add line is ERROR");
let pane = DebuggerUI.toggleDebugger();
pane._frame.addEventListener("Debugger:Connecting", function dbgConnected() {
pane._frame.removeEventListener("Debugger:Connecting", dbgConnected, true);
// Wait for the initial resume.
pane.debuggerWindow.gClient.addOneTimeListener("resumed", function() {
pane.debuggerWindow.gClient.activeThread.addOneTimeListener("framesadded", function() {
type("break add line " + TEST_URI + " " + content.wrappedJSObject.line0);
is(requisition.getStatus().toString(), "VALID", "break add line is VALID");
requisition.exec();
type("break list");
is(requisition.getStatus().toString(), "VALID", "break list is VALID");
requisition.exec();
pane.debuggerWindow.gClient.activeThread.resume(function() {
type("break del 0");
is(requisition.getStatus().toString(), "VALID", "break del 0 is VALID");
requisition.exec();
closeConsole();
finishTest();
});
});
// Trigger newScript notifications using eval.
content.wrappedJSObject.firstCall();
});
}, true);
}
function type(command) {
gcliterm.inputNode.value = command.slice(0, -1);
gcliterm.inputNode.focus();
EventUtils.synthesizeKey(command.slice(-1), {});
}

View File

@ -0,0 +1,80 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
let tmp = {};
Components.utils.import("resource:///modules/gcli.jsm", tmp);
let gcli = tmp.gcli;
let hud;
let gcliterm;
registerCleanupFunction(function() {
gcliterm = undefined;
hud = undefined;
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", true);
addTab("http://example.com/browser/browser/devtools/webconsole/test/browser_gcli_inspect.html");
browser.addEventListener("DOMContentLoaded", onLoad, false);
}
function onLoad() {
browser.removeEventListener("DOMContentLoaded", onLoad, false);
openConsole();
hud = HUDService.getHudByWindow(content);
gcliterm = hud.gcliterm;
testEcho();
// gcli._internal.console.error("Command Tests Completed");
}
function testEcho() {
let nodes = exec("echo message");
is(nodes.length, 2, "after echo");
is(nodes[0].textContent, "echo message", "output 0");
is(nodes[1].textContent.trim(), "message", "output 1");
testConsoleClear();
}
function testConsoleClear() {
let nodes = exec("console clear");
is(nodes.length, 1, "after console clear 1");
executeSoon(function() {
let nodes = hud.outputNode.querySelectorAll("richlistitem");
is(nodes.length, 0, "after console clear 2");
testConsoleClose();
});
}
function testConsoleClose() {
ok(hud.hudId in HUDService.hudReferences, "console open");
exec("console close");
ok(!(hud.hudId in HUDService.hudReferences), "console closed");
finishTest();
}
function exec(command) {
gcliterm.clearOutput();
let nodes = hud.outputNode.querySelectorAll("richlistitem");
is(nodes.length, 0, "setup - " + command);
gcliterm.opts.console.inputter.setInput(command);
gcliterm.opts.requisition.exec();
return hud.outputNode.querySelectorAll("richlistitem");
}

View File

@ -0,0 +1,124 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
let tmp = {};
Components.utils.import("resource:///modules/gcli.jsm", tmp);
let gcli = tmp.gcli;
let hud;
let gcliterm;
registerCleanupFunction(function() {
gcliterm = undefined;
hud = undefined;
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", true);
addTab("http://example.com/browser/browser/devtools/webconsole/test/test-console.html");
browser.addEventListener("DOMContentLoaded", onLoad, false);
}
function onLoad() {
browser.removeEventListener("DOMContentLoaded", onLoad, false);
openConsole();
hud = HUDService.getHudByWindow(content);
gcliterm = hud.gcliterm;
testHelpers();
testScripts();
closeConsole();
finishTest();
// gcli._internal.console.error("Command Tests Completed");
}
function testScripts() {
check("{ 'id=' + $('header').getAttribute('id')", '"id=header"');
check("{ headerQuery = $$('h1')", "Instance of NodeList");
check("{ 'length=' + headerQuery.length", '"length=1"');
check("{ xpathQuery = $x('.//*', document.body);", 'Instance of Array');
check("{ 'headerFound=' + (xpathQuery[0] == headerQuery[0])", '"headerFound=true"');
check("{ 'keysResult=' + (keys({b:1})[0] == 'b')", '"keysResult=true"');
check("{ 'valuesResult=' + (values({b:1})[0] == 1)", '"valuesResult=true"');
check("{ [] instanceof Array", "true");
check("{ ({}) instanceof Object", "true");
check("{ document", "Instance of HTMLDocument");
check("{ null", "null");
check("{ undefined", undefined);
check("{ for (var x=0; x<9; x++) x;", "8");
}
function check(command, reply) {
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput(command);
gcliterm.opts.requisition.exec();
let labels = hud.outputNode.querySelectorAll(".webconsole-msg-output");
if (reply === undefined) {
is(labels.length, 0, "results count for: " + command);
}
else {
is(labels.length, 1, "results count for: " + command);
is(labels[0].textContent.trim(), reply, "message for: " + command);
}
gcliterm.opts.console.inputter.setInput("");
}
function testHelpers() {
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput("{ pprint({b:2, a:1})");
gcliterm.opts.requisition.exec();
// Doesn't conform to check() format
let label = hud.outputNode.querySelector(".webconsole-msg-output");
is(label.textContent.trim(), "a: 1\n b: 2", "pprint() worked");
// no gcliterm.clearOutput() here as we clear the output using the clear() fn.
gcliterm.opts.console.inputter.setInput("{ clear()");
gcliterm.opts.requisition.exec();
ok(!hud.outputNode.querySelector(".hud-group"), "clear() worked");
// check that pprint(window) and keys(window) don't throw, bug 608358
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput("{ pprint(window)");
gcliterm.opts.requisition.exec();
let labels = hud.outputNode.querySelectorAll(".webconsole-msg-output");
is(labels.length, 1, "one line of output for pprint(window)");
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput("{ keys(window)");
gcliterm.opts.requisition.exec();
labels = hud.outputNode.querySelectorAll(".webconsole-msg-output");
is(labels.length, 1, "one line of output for keys(window)");
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput("{ pprint('hi')");
gcliterm.opts.requisition.exec();
// Doesn't conform to check() format, bug 614561
label = hud.outputNode.querySelector(".webconsole-msg-output");
is(label.textContent.trim(), '0: "h"\n 1: "i"', 'pprint("hi") worked');
// Causes a memory leak. FIXME Bug 717892
/*
// check that pprint(function) shows function source, bug 618344
gcliterm.clearOutput();
gcliterm.opts.console.inputter.setInput("{ pprint(print)");
gcliterm.opts.requisition.exec();
label = hud.outputNode.querySelector(".webconsole-msg-output");
isnot(label.textContent.indexOf("SEVERITY_LOG"), -1, "pprint(function) shows function source");
*/
gcliterm.clearOutput();
}

View File

@ -0,0 +1,95 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
// Tests that the inspect command works as it should
let tempScope = {};
Components.utils.import("resource:///modules/gcli.jsm", tempScope);
let gcli = tempScope.gcli;
registerCleanupFunction(function() {
gcliterm = undefined;
requisition = undefined;
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", true);
addTab("http://example.com/browser/browser/devtools/webconsole/test/browser_gcli_inspect.html");
browser.addEventListener("DOMContentLoaded", onLoad, false);
}
let gcliterm;
let requisition;
function onLoad() {
browser.removeEventListener("DOMContentLoaded", onLoad, false);
try {
openConsole();
let hud = HUDService.getHudByWindow(content);
gcliterm = hud.gcliterm;
requisition = gcliterm.opts.requisition;
testSetup();
testCreateCommands();
}
catch (ex) {
ok(false, "Caught exception: " + ex)
gcli._internal.console.error("Test Failure", ex);
}
finally {
closeConsole();
finishTest();
}
}
function testSetup() {
ok(gcliterm, "We have a GCLI term");
ok(requisition, "We have a Requisition");
}
function testCreateCommands() {
type("inspec");
is(gcliterm.completeNode.textContent, " inspect", "Completion for \"inspec\"");
is(requisition.getStatus().toString(), "ERROR", "inspec is ERROR");
type("inspect");
is(requisition.getStatus().toString(), "ERROR", "inspect is ERROR");
type("inspect h1");
is(requisition.getStatus().toString(), "ERROR", "inspect h1 is ERROR");
type("inspect span");
is(requisition.getStatus().toString(), "ERROR", "inspect span is ERROR");
type("inspect div");
is(requisition.getStatus().toString(), "VALID", "inspect div is VALID");
type("inspect .someclass");
is(requisition.getStatus().toString(), "VALID", "inspect .someclass is VALID");
type("inspect #someid");
is(requisition.getStatus().toString(), "VALID", "inspect #someid is VALID");
type("inspect button[disabled]");
is(requisition.getStatus().toString(), "VALID", "inspect button[disabled] is VALID");
type("inspect p>strong");
is(requisition.getStatus().toString(), "VALID", "inspect p>strong is VALID");
type("inspect :root");
is(requisition.getStatus().toString(), "VALID", "inspect :root is VALID");
}
function type(command) {
gcliterm.inputNode.value = command.slice(0, -1);
gcliterm.inputNode.focus();
EventUtils.synthesizeKey(command.slice(-1), {});
}

View File

@ -0,0 +1,106 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
// Tests that source URLs in the Web Console can be clicked to display the
// standard View Source window.
let tempScope = {};
Components.utils.import("resource:///modules/gcli.jsm", tempScope);
let gcli = tempScope.gcli;
let require = gcli._internal.require;
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
require = undefined;
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", true);
addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", onLoad, false);
}
function onLoad() {
browser.removeEventListener("DOMContentLoaded", onLoad, false);
try {
openConsole();
testCreateCommands();
testCallCommands();
testRemoveCommands();
}
catch (ex) {
gcli._internal.console.error('Test Failure', ex);
ok(false, '' + ex);
}
finally {
closeConsole();
finishTest();
}
}
let tselarr = {
name: 'tselarr',
params: [
{ name: 'num', type: { name: 'selection', data: [ '1', '2', '3' ] } },
{ name: 'arr', type: { name: 'array', subtype: 'string' } },
],
exec: function(args, env) {
return "flu " + args.num + "-" + args.arr.join("_");
}
};
function testCreateCommands() {
let gcli = require("gcli/index");
gcli.addCommand(tselarr);
let canon = require("gcli/canon");
let tselcmd = canon.getCommand("tselarr");
ok(tselcmd != null, "tselarr exists in the canon");
ok(tselcmd instanceof canon.Command, "canon storing commands");
}
function testCallCommands() {
let hud = HUDService.getHudByWindow(content);
let gcliterm = hud.gcliterm;
ok(gcliterm, "We have a GCLI term");
// Test successful auto-completion
gcliterm.inputNode.value = "h";
gcliterm.inputNode.focus();
EventUtils.synthesizeKey("e", {});
is(gcliterm.completeNode.textContent, " help", "Completion for \"he\"");
// Test unsuccessful auto-completion
gcliterm.inputNode.value = "ec";
gcliterm.inputNode.focus();
EventUtils.synthesizeKey("d", {});
is(gcliterm.completeNode.textContent, " ecd", "Completion for \"ecd\"");
// Test a normal command's life cycle
gcliterm.opts.console.inputter.setInput("echo hello world");
gcliterm.opts.requisition.exec();
let nodes = hud.outputNode.querySelectorAll(".gcliterm-msg-body");
is(nodes.length, 1, "Right number of output nodes");
ok(/hello world/.test(nodes[0].textContent), "the command's output is correct.");
gcliterm.clearOutput();
}
function testRemoveCommands() {
let gcli = require("gcli/index");
gcli.removeCommand(tselarr);
let canon = require("gcli/canon");
let tselcmd = canon.getCommand("tselarr");
ok(tselcmd == null, "tselcmd removed from the canon");
}

View File

@ -1,10 +1,25 @@
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
// For more information on GCLI see:
// - https://github.com/mozilla/gcli/blob/master/docs/index.md
// - https://wiki.mozilla.org/DevTools/Features/GCLI
// Tests that source URLs in the Web Console can be clicked to display the // Tests that source URLs in the Web Console can be clicked to display the
// standard View Source window. // standard View Source window.
var modules = { gcli: null };
Components.utils.import("resource:///modules/gcli.jsm", modules);
var define, require, console;
function test() { function test() {
define = modules.gcli._internal.define;
require = modules.gcli._internal.require;
console = modules.gcli._internal.console;
define('gclitest/requirable', [], function(require, exports, module) { define('gclitest/requirable', [], function(require, exports, module) {
exports.thing1 = 'thing1'; exports.thing1 = 'thing1';
exports.thing2 = 2; exports.thing2 = 2;
@ -28,6 +43,8 @@ function test() {
testRecursive(); testRecursive();
testUncompilable(); testUncompilable();
finishTest();
delete define.modules['gclitest/requirable']; delete define.modules['gclitest/requirable'];
delete define.globalDomain.modules['gclitest/requirable']; delete define.globalDomain.modules['gclitest/requirable'];
delete define.modules['gclitest/unrequirable']; delete define.modules['gclitest/unrequirable'];
@ -35,7 +52,11 @@ function test() {
delete define.modules['gclitest/recurse']; delete define.modules['gclitest/recurse'];
delete define.globalDomain.modules['gclitest/recurse']; delete define.globalDomain.modules['gclitest/recurse'];
finish(); define = null;
require = null;
console = null;
modules = null;
} }
function testWorking() { function testWorking() {

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testInputFocus, false); browser.addEventListener("DOMContentLoaded", testInputFocus, false);
} }

View File

@ -43,7 +43,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testClosingAfterCompletion, browser.addEventListener("DOMContentLoaded", testClosingAfterCompletion,
false); false);

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testGroups, false); browser.addEventListener("DOMContentLoaded", testGroups, false);
} }

View File

@ -43,7 +43,12 @@
const TEST_DUPLICATE_ERROR_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-duplicate-error.html"; const TEST_DUPLICATE_ERROR_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-duplicate-error.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
expectUncaughtException(); expectUncaughtException();
addTab(TEST_DUPLICATE_ERROR_URI); addTab(TEST_DUPLICATE_ERROR_URI);
browser.addEventListener("DOMContentLoaded", testDuplicateErrors, false); browser.addEventListener("DOMContentLoaded", testDuplicateErrors, false);

View File

@ -39,7 +39,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/browser/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/browser/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testCompletion, false); browser.addEventListener("DOMContentLoaded", testCompletion, false);
} }

View File

@ -39,7 +39,12 @@
const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete popup keyboard usage test"; const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete popup keyboard usage test";
let HUD; let HUD;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -38,7 +38,12 @@
const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete popup test"; const TEST_URI = "data:text/html;charset=utf-8,<p>bug 585991 - autocomplete popup test";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -10,7 +10,12 @@
const TEST_URI = "http://example.com/"; const TEST_URI = "http://example.com/";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", browser.addEventListener("DOMContentLoaded",
testSelectionWhenMovingBetweenBoxes, false); testSelectionWhenMovingBetweenBoxes, false);

View File

@ -10,7 +10,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -11,7 +11,12 @@
const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 588342"; const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 588342";
let fm, notificationBox, input; let fm, notificationBox, input;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager); fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);

View File

@ -38,7 +38,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testInputExpansion, false); browser.addEventListener("DOMContentLoaded", testInputExpansion, false);
} }

View File

@ -13,7 +13,12 @@
// Tests that, when the user types an extraneous closing bracket, no error // Tests that, when the user types an extraneous closing bracket, no error
// appears. // appears.
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,test for bug 592442"); addTab("data:text/html;charset=utf-8,test for bug 592442");
browser.addEventListener("load", testExtraneousClosingBrackets, true); browser.addEventListener("load", testExtraneousClosingBrackets, true);
} }

View File

@ -154,7 +154,12 @@ function propertyPanelHidden(aEvent) {
}); });
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoad1, true); browser.addEventListener("load", tabLoad1, true);
} }

View File

@ -155,7 +155,12 @@ function performTests() {
executeSoon(finishTest); executeSoon(finishTest);
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 594497 and bug 619598"); addTab("data:text/html;charset=utf-8,Web Console test for bug 594497 and bug 619598");
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -172,6 +172,7 @@ function testNext() {
} }
function testEnd() { function testEnd() {
Services.prefs.clearUserPref("devtools.gcli.enable");
Services.console.unregisterListener(TestObserver); Services.console.unregisterListener(TestObserver);
output.removeEventListener("DOMNodeInserted", onDOMNodeInserted, false); output.removeEventListener("DOMNodeInserted", onDOMNodeInserted, false);
output = jsterm = null; output = jsterm = null;
@ -191,6 +192,7 @@ function onDOMNodeInserted(aEvent) {
} }
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
registerCleanupFunction(testEnd); registerCleanupFunction(testEnd);
addTab("data:text/html;charset=utf-8,Web Console test for bug 595934 - message categories coverage."); addTab("data:text/html;charset=utf-8,Web Console test for bug 595934 - message categories coverage.");

View File

@ -225,7 +225,12 @@ function testEnd() {
executeSoon(finishTest); executeSoon(finishTest);
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -57,7 +57,12 @@ function tabLoad(aEvent) {
}); });
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 601352"); addTab("data:text/html;charset=utf-8,Web Console test for bug 601352");
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -32,12 +32,17 @@ function onContentLoaded()
finishTest(); finishTest();
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
/** /**
* Unit test for bug 611795: * Unit test for bug 611795:
* Repeated CSS messages get collapsed into one. * Repeated CSS messages get collapsed into one.
*/ */
function test() function test()
{ {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", function() { browser.addEventListener("load", function() {
browser.removeEventListener("load", arguments.callee, true); browser.removeEventListener("load", arguments.callee, true);

View File

@ -8,7 +8,12 @@
const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 613280"; const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 613280";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -36,7 +36,12 @@ function tabLoad(aEvent) {
finishTest(); finishTest();
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 614793: jsterm result scroll"); addTab("data:text/html;charset=utf-8,Web Console test for bug 614793: jsterm result scroll");
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -38,7 +38,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", function() { browser.addEventListener("load", function() {
browser.removeEventListener("load", arguments.callee, true); browser.removeEventListener("load", arguments.callee, true);

View File

@ -41,7 +41,12 @@ const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/te
let pb = Cc["@mozilla.org/privatebrowsing;1"]. let pb = Cc["@mozilla.org/privatebrowsing;1"].
getService(Ci.nsIPrivateBrowsingService); getService(Ci.nsIPrivateBrowsingService);
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 618311 (private browsing)"); addTab("data:text/html;charset=utf-8,Web Console test for bug 618311 (private browsing)");
browser.addEventListener("load", function() { browser.addEventListener("load", function() {

View File

@ -42,7 +42,12 @@ function tabLoad(aEvent) {
}, content); }, content);
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -2,7 +2,12 @@
http://creativecommons.org/publicdomain/zero/1.0/ */ http://creativecommons.org/publicdomain/zero/1.0/ */
let itemsSet, HUD; let itemsSet, HUD;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 626484"); addTab("data:text/html;charset=utf-8,Web Console test for bug 626484");
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -3,7 +3,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-bug-632275-getters.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-bug-632275-getters.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -38,7 +38,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-bug-632347-iterators-generators.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-bug-632347-iterators-generators.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -76,7 +76,12 @@ function tabLoad(aEvent) {
EventUtils.synthesizeKey("u", {}); EventUtils.synthesizeKey("u", {});
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoad, true); browser.addEventListener("load", tabLoad, true);
} }

View File

@ -12,7 +12,12 @@ const TEST_URI = "http://example.com/browser/browser/devtools/" +
var gOldPref, gHudId; var gOldPref, gHudId;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 644419: Console should " + addTab("data:text/html;charset=utf-8,Web Console test for bug 644419: Console should " +
"have user-settable log limits for each message category"); "have user-settable log limits for each message category");
browser.addEventListener("load", onLoad, true); browser.addEventListener("load", onLoad, true);

View File

@ -13,7 +13,12 @@ let PropertyTreeView = tempScope.PropertyTreeView;
let namesAndValuesOf = tempScope.namesAndValuesOf; let namesAndValuesOf = tempScope.namesAndValuesOf;
let isNonNativeGetter = tempScope.isNonNativeGetter; let isNonNativeGetter = tempScope.isNonNativeGetter;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console autocompletion bug in document.body"); addTab("data:text/html;charset=utf-8,Web Console autocompletion bug in document.body");
browser.addEventListener("load", onLoad, true); browser.addEventListener("load", onLoad, true);
} }

View File

@ -131,8 +131,13 @@ function finishUp() {
finish(); finish();
} }
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() function test()
{ {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
waitForExplicitFinish(); waitForExplicitFinish();
gBrowser.selectedTab = gBrowser.addTab(); gBrowser.selectedTab = gBrowser.addTab();
gBrowser.selectedBrowser.addEventListener("load", function() { gBrowser.selectedBrowser.addEventListener("load", function() {

View File

@ -6,7 +6,12 @@
// Tests that the Console API implements the time() and timeEnd() methods. // Tests that the Console API implements the time() and timeEnd() methods.
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("http://example.com/browser/browser/devtools/webconsole/" + addTab("http://example.com/browser/browser/devtools/webconsole/" +
"test/test-bug-658368-time-methods.html"); "test/test-bug-658368-time-methods.html");
openConsole(); openConsole();

View File

@ -4,7 +4,12 @@
const TEST_URI = "data:text/html;charset=utf-8,<p>bug 660806 - history navigation must not show the autocomplete popup"; const TEST_URI = "data:text/html;charset=utf-8,<p>bug 660806 - history navigation must not show the autocomplete popup";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", tabLoaded, true); browser.addEventListener("load", tabLoaded, true);
} }

View File

@ -7,7 +7,12 @@
// Tests that console.group/groupEnd works as intended. // Tests that console.group/groupEnd works as intended.
const GROUP_INDENT = 12; const GROUP_INDENT = 12;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab("data:text/html;charset=utf-8,Web Console test for bug 664131: Expand console " + addTab("data:text/html;charset=utf-8,Web Console test for bug 664131: Expand console " +
"object with group methods"); "object with group methods");
browser.addEventListener("load", onLoad, true); browser.addEventListener("load", onLoad, true);

View File

@ -40,7 +40,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testCompletion, false); browser.addEventListener("DOMContentLoaded", testCompletion, false);
} }

View File

@ -42,7 +42,12 @@
const TEST_URI = "chrome://browser/content/browser.xul"; const TEST_URI = "chrome://browser/content/browser.xul";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testChrome, false); browser.addEventListener("DOMContentLoaded", testChrome, false);
} }

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testCompletion, false); browser.addEventListener("DOMContentLoaded", testCompletion, false);
} }

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", onLoad, false); browser.addEventListener("DOMContentLoaded", onLoad, false);
} }

View File

@ -11,8 +11,13 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-own-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-own-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() function test()
{ {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("load", function() { browser.addEventListener("load", function() {
browser.removeEventListener("load", arguments.callee, true); browser.removeEventListener("load", arguments.callee, true);

View File

@ -12,8 +12,13 @@
const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 586142"; const TEST_URI = "data:text/html;charset=utf-8,Web Console test for bug 586142";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() function test()
{ {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", onLoad, false); browser.addEventListener("DOMContentLoaded", onLoad, false);
} }

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testExecutionScope, false); browser.addEventListener("DOMContentLoaded", testExecutionScope, false);
} }

View File

@ -5,7 +5,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-for-of.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-for-of.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testForOf, false); browser.addEventListener("DOMContentLoaded", testForOf, false);
} }

View File

@ -46,7 +46,12 @@ const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/te
const HISTORY_BACK = -1; const HISTORY_BACK = -1;
const HISTORY_FORWARD = 1; const HISTORY_FORWARD = 1;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testHistory, false); browser.addEventListener("DOMContentLoaded", testHistory, false);
} }

View File

@ -43,7 +43,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testHUDGetters, false); browser.addEventListener("DOMContentLoaded", testHUDGetters, false);
} }

View File

@ -43,7 +43,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testJSInputAndOutputStyling, browser.addEventListener("DOMContentLoaded", testJSInputAndOutputStyling,
false); false);

View File

@ -42,7 +42,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testJSInputExpansion, false); browser.addEventListener("DOMContentLoaded", testJSInputExpansion, false);
} }

View File

@ -43,7 +43,12 @@ const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/te
let jsterm; let jsterm;
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testJSTerm, false); browser.addEventListener("DOMContentLoaded", testJSTerm, false);
} }

View File

@ -43,7 +43,12 @@
const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html"; const TEST_URI = "http://example.com/browser/browser/devtools/webconsole/test/test-console.html";
registerCleanupFunction(function() {
Services.prefs.clearUserPref("devtools.gcli.enable");
});
function test() { function test() {
Services.prefs.setBoolPref("devtools.gcli.enable", false);
addTab(TEST_URI); addTab(TEST_URI);
browser.addEventListener("DOMContentLoaded", testNullAndUndefinedOutput, browser.addEventListener("DOMContentLoaded", testNullAndUndefinedOutput,
false); false);

Some files were not shown because too many files have changed in this diff Show More