RetroZilla/extensions/venkman/resources/content/venkman-commands.js
2015-10-20 23:03:22 -04:00

2093 lines
60 KiB
JavaScript

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* ***** 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 JavaScript Debugger.
*
* The Initial Developer of the Original Code is
* Netscape Communications Corporation.
* Portions created by the Initial Developer are Copyright (C) 1998
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Robert Ginda, <rginda@netscape.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 ***** */
const CMD_CONSOLE = 0x01; // command is available via the console
const CMD_NEED_STACK = 0x02; // command only works if we're stopped
const CMD_NO_STACK = 0x04; // command only works if we're *not* stopped
const CMD_NO_HELP = 0x08; // don't whine if there is no help for this command
function initCommands()
{
console.commandManager = new CommandManager(console.defaultBundle);
var cmdary =
[/* "real" commands */
["about-mozilla", cmdAboutMozilla, 0],
["break", cmdBreak, CMD_CONSOLE],
["break-props", cmdBreakProps, CMD_CONSOLE],
["change-container", cmdChangeContainer, CMD_CONSOLE],
["change-value", cmdChangeValue, 0],
["chrome-filter", cmdChromeFilter, CMD_CONSOLE],
["clear", cmdClear, CMD_CONSOLE],
["clear-all", cmdClearAll, CMD_CONSOLE],
["clear-break", cmdClearBreak, 0],
["clear-fbreak", cmdClearFBreak, 0],
["clear-profile", cmdClearProfile, CMD_CONSOLE],
["clear-session", cmdHook, CMD_CONSOLE],
["clear-script", cmdClearScript, 0],
["clear-instance", cmdClearInstance, 0],
["close", cmdClose, CMD_CONSOLE],
["commands", cmdCommands, CMD_CONSOLE],
["cont", cmdCont, CMD_CONSOLE | CMD_NEED_STACK],
["debug-script", cmdSetScriptFlag, 0],
["debug-instance-on", cmdToggleSomething, 0],
["debug-instance-off", cmdToggleSomething, 0],
["debug-instance", cmdSetScriptFlag, 0],
["debug-transient", cmdSetTransientFlag, 0],
["emode", cmdEMode, CMD_CONSOLE],
["eval", cmdEval, CMD_CONSOLE],
["evald", cmdEvald, CMD_CONSOLE],
["fbreak", cmdFBreak, CMD_CONSOLE],
["set-eval-obj", cmdSetEvalObj, 0],
["set-break", cmdBreak, 0],
["set-fbreak", cmdFBreak, 0],
["fclear", cmdFClear, CMD_CONSOLE],
["fclear-all", cmdFClearAll, CMD_CONSOLE],
["find-bp", cmdFindBp, 0],
["find-creator", cmdFindCreatorOrCtor, 0],
["find-ctor", cmdFindCreatorOrCtor, 0],
["find-file", cmdFindFile, CMD_CONSOLE],
["find-frame", cmdFindFrame, CMD_NEED_STACK],
["find-sourcetext", cmdFindSourceText, 0],
["find-sourcetext-soft", cmdFindSourceText, 0],
["find-script", cmdFindScript, 0],
["find-scriptinstance", cmdFindScriptInstance, 0],
["find-url", cmdFindURL, CMD_CONSOLE],
["find-url-soft", cmdFindURL, 0],
["finish", cmdFinish, CMD_CONSOLE | CMD_NEED_STACK],
["focus-input", cmdHook, 0],
["frame", cmdFrame, CMD_CONSOLE | CMD_NEED_STACK],
["gc", cmdGC, CMD_CONSOLE],
["help", cmdHelp, CMD_CONSOLE],
["loadd", cmdLoadd, CMD_CONSOLE],
["move-view", cmdMoveView, CMD_CONSOLE],
["mozilla-help", cmdMozillaHelp, 0],
["next", cmdNext, CMD_CONSOLE | CMD_NEED_STACK],
["open-dialog", cmdOpenDialog, CMD_CONSOLE],
["open-url", cmdOpenURL, 0],
["pprint", cmdPPrint, CMD_CONSOLE],
["pref", cmdPref, CMD_CONSOLE],
["profile", cmdProfile, CMD_CONSOLE],
["profile-script", cmdSetScriptFlag, 0],
["profile-instance", cmdSetScriptFlag, 0],
["profile-instance-on", cmdSetScriptFlag, 0],
["profile-instance-off", cmdSetScriptFlag, 0],
["props", cmdProps, CMD_CONSOLE],
["propsd", cmdProps, CMD_CONSOLE],
["quit", cmdQuit, CMD_CONSOLE],
["restore-layout", cmdRestoreLayout, CMD_CONSOLE],
["restore-settings", cmdRestoreSettings, CMD_CONSOLE],
["release-notes", cmdReleaseNotes, 0],
["run-to", cmdRunTo, CMD_NEED_STACK],
["save-breakpoints", cmdSaveBreakpoints, CMD_CONSOLE],
["save-layout", cmdSaveLayout, CMD_CONSOLE],
["save-profile", cmdSaveProfile, CMD_CONSOLE],
["save-settings", cmdSaveSettings, CMD_CONSOLE],
["scan-source", cmdScanSource, 0],
["scope", cmdScope, CMD_CONSOLE | CMD_NEED_STACK],
["this-expr", cmdThisExpr, CMD_CONSOLE],
["toggle-float", cmdToggleFloat, CMD_CONSOLE],
["toggle-view", cmdToggleView, CMD_CONSOLE],
["toggle-pref", cmdTogglePref, CMD_CONSOLE],
["startup-init", cmdStartupInit, CMD_CONSOLE],
["step", cmdStep, CMD_CONSOLE | CMD_NEED_STACK],
["stop", cmdStop, CMD_CONSOLE | CMD_NO_STACK],
["tmode", cmdTMode, CMD_CONSOLE],
["version", cmdVersion, CMD_CONSOLE],
["where", cmdWhere, CMD_CONSOLE | CMD_NEED_STACK],
/* aliases */
["exit", "quit", 0],
["save-default-layout", "save-layout default", 0],
["profile-tb", "profile toggle", 0],
["this", "props this", CMD_CONSOLE],
["toggle-chrome", "chrome-filter toggle", 0],
["toggle-ias", "startup-init toggle", 0],
["toggle-pprint", "pprint toggle", 0],
["toggle-profile", "profile toggle", 0],
["toggle-save-layout", "toggle-pref saveLayoutOnExit", 0],
["toggle-save-settings", "toggle-pref saveSettingsOnExit", 0],
["em-cycle", "emode cycle", 0],
["em-ignore", "emode ignore", 0],
["em-trace", "emode trace", 0],
["em-break", "emode break", 0],
["tm-cycle", "tmode cycle", 0],
["tm-ignore", "tmode ignore", 0],
["tm-trace", "tmode trace", 0],
["tm-break", "tmode break", 0],
/* hooks */
["hook-break-set", cmdHook, 0],
["hook-break-clear", cmdHook, 0],
["hook-debug-stop", cmdHook, 0],
["hook-debug-continue", cmdHook, 0],
["hook-display-sourcetext", cmdHook, 0],
["hook-display-sourcetext-soft", cmdHook, 0],
["hook-eval-done", cmdHook, 0],
["hook-fbreak-clear", cmdHook, 0],
["hook-fbreak-set", cmdHook, 0],
["hook-guess-complete", cmdHook, 0],
["hook-transient-script", cmdHook, 0],
["hook-script-manager-created", cmdHook, 0],
["hook-script-manager-destroyed", cmdHook, 0],
["hook-script-instance-created", cmdHook, 0],
["hook-script-instance-sealed", cmdHook, 0],
["hook-script-instance-destroyed", cmdHook, 0],
["hook-session-display", cmdHook, 0],
["hook-source-load-complete", cmdHook, 0],
["hook-window-closed", cmdHook, 0],
["hook-window-loaded", cmdHook, 0],
["hook-window-opened", cmdHook, 0],
["hook-window-resized", cmdHook, 0],
["hook-window-unloaded", cmdHook, 0],
["hook-venkman-exit", cmdHook, 0],
["hook-venkman-query-exit", cmdHook, 0],
["hook-venkman-started", cmdHook, 0]
];
cmdary.stringBundle = console.defaultBundle;
console.commandManager.defineCommands (cmdary);
console.commandManager.argTypes.__aliasTypes__ (["index", "breakpointIndex",
"lineNumber"], "int");
console.commandManager.argTypes.__aliasTypes__ (["windowFlags",
"expression",
"prefValue"],
"rest");
console.commandManager.argTypes.__aliasTypes__ (["deletePref"],
"state");
console.commandManager.installKeys(console.mainWindow.document,
console.commandManager.commands);
}
/**
* Used as a callback for CommandRecord.getDocumentation() to format the command
* flags for the "Notes:" field.
*/
function formatCommandFlags (f)
{
var ary = new Array();
if (f & CMD_CONSOLE)
ary.push(MSG_NOTE_CONSOLE);
if (f & CMD_NEED_STACK)
ary.push(MSG_NOTE_NEEDSTACK);
if (f & CMD_NO_STACK)
ary.push(MSG_NOTE_NOSTACK);
return ary.length ? ary.join ("\n") : MSG_VAL_NA;
}
function getToggle (toggle, currentState)
{
if (toggle == "toggle")
toggle = !currentState;
return toggle;
}
/*******************************************************************************
* Command implementations from here on down...
******************************************************************************/
function cmdAboutMozilla ()
{
openTopWin ("about:mozilla");
}
function cmdBreak (e)
{
if (!("isInteractive" in e))
e.isInteractive = false;
if (!e.urlPattern)
{
/* if no input data, just list the breakpoints */
var i = 0;
for (var b in console.breaks)
{
var brk = console.breaks[b];
display (getMsg(MSN_BP_LINE, [++i, brk.url, brk.lineNumber]));
}
if (i == 0)
display (MSG_NO_BREAKS_SET);
return;
}
var found;
for (var url in console.scriptManagers)
{
var manager = console.scriptManagers[url];
if (url.search(e.urlPattern) != -1 &&
manager.isLineExecutable(e.lineNumber))
{
found = true;
if (manager.hasBreakpoint (e.lineNumber))
{
feedback (e, getMsg(MSN_BP_EXISTS, [url, e.lineNumber]));
}
else
{
var props = e.properties;
var fbreak;
if (e.parent)
fbreak = e.parent;
else
fbreak = getFutureBreakpoint(url, e.lineNumber);
if (!fbreak)
{
dispatch ("fbreak", { isInteractive: e.isInteractive,
urlPattern: url,
lineNumber: e.lineNumber,
props: props});
fbreak = getFutureBreakpoint(url, e.lineNumber);
// hard breakpoint properties will be inherited
props = null;
}
console.scriptManagers[url].setBreakpoint (e.lineNumber, fbreak,
props);
feedback (e, getMsg(MSN_BP_CREATED, [url, e.lineNumber]));
}
}
}
if (!found)
{
feedback (e, getMsg(MSN_ERR_BP_NOLINE, [e.urlPattern, e.lineNumber]),
MT_ERROR);
}
}
function cmdBreakProps (e)
{
if ("propsWindow" in e.breakWrapper)
{
e.breakWrapper.propsWindow.focus();
return;
}
e.breakWrapper.propsWindow =
openDialog ("chrome://venkman/content/venkman-bpprops.xul", "",
"chrome,extrachrome,menubar,resizable", e.breakWrapper);
}
function cmdChangeContainer(e)
{
if (!(e.viewId in console.views))
{
display(getMsg(MSN_ERR_NO_SUCH_VIEW, e.viewId), MT_ERROR);
return;
}
var view = console.views[e.viewId];
if (!view.currentContent)
{
display(getMsg(MSN_ERR_INVALID_PARAM, ["<view-id>", e.viewId]),
MT_ERROR);
return;
}
e.newType = e.newType.toLowerCase();
if (e.newType.search(/^(horizontal|vertical|tab)$/) != 0)
{
display(getMsg(MSN_ERR_INVALID_PARAM, ["<new-type>", e.newType]),
MT_ERROR);
return;
}
console.viewManager.changeContainer(view.currentContent.parentNode,
e.newType);
}
function cmdChangeValue(e)
{
var obj = e.parentValue.getWrappedValue();
if (!e.newValue)
{
var ok;
var current = obj[e.propertyName];
if (typeof current == "string")
current = current.quote();
else if (typeof current == "object")
current = "";
else
current = String(current);
while (!ok)
{
var expr = prompt(getMsg(MSN_ENTER_EXPRESSION, e.propertyName),
current);
if (expr == null || expr == "")
return;
try
{
if ("frames" in console)
{
e.newValue = evalInTargetScope(expr, true);
e.newValue = e.newValue.getWrappedValue();
}
else
{
var parent = e.parentValue.jsParent.getWrappedValue();
e.newValue = eval(expr, parent);
}
ok = true;
}
catch(ex)
{
if (ex instanceof jsdIValue)
alert (String(ex.getWrappedValue));
else
alert (String(ex));
current = expr;
}
}
}
obj[e.propertyName] = e.newValue;
dispatch ("hook-eval-done");
}
function cmdChromeFilter(e)
{
const FLAGS = SCRIPT_NODEBUG | SCRIPT_NOPROFILE;
function setFlag (scriptWrapper)
{
if (!scriptWrapper.jsdScript.isValid)
return;
if (e.toggle)
{
scriptWrapper.lastFlags = scriptWrapper.jsdScript.flags;
scriptWrapper.jsdScript.flags |= FLAGS;
}
else
{
if ("lastFlags" in scriptWrapper)
{
scriptWrapper.jsdScript.flags = scriptWrapper.lastFlags;
delete scriptWrapper.lastFlags;
}
else if (isURLVenkman(scriptWrapper.jsdScript.fileName))
{
scriptWrapper.jsdScript.flags |= FLAGS;
}
else
{
scriptWrapper.jsdScript.flags &= ~(FLAGS);
}
}
if (scriptWrapper.jsdScript.flags & SCRIPT_NODEBUG)
++scriptWrapper.scriptInstance.disabledScripts;
};
var currentState = console.prefs["enableChromeFilter"];
if (e.toggle != null)
{
currentState = console.prefs["enableChromeFilter"];
e.toggle = getToggle (e.toggle, currentState);
console.prefs["enableChromeFilter"] = e.toggle;
if (e.toggle != currentState)
{
for (var url in console.scriptManagers)
{
if (url.search (/^chrome:/) == -1 &&
(!("componentPath" in console) ||
url.indexOf(console.componentPath) == -1))
{
continue;
}
//dd ("setting chrome filter " + e.toggle + " for " + url);
var mgr = console.scriptManagers[url];
if (e.toggle)
{
mgr.lastDisableTransients = mgr.disableTransients;
mgr.disableTransients = true;
}
else
{
if ("lastDisableTransients" in mgr)
{
mgr.disableTransients = mgr.lastDisableTransients;
delete mgr.lastDisableTransients;
}
else
{
mgr.disableTransients = false;
}
}
for (var i in mgr.instances)
{
var instance = mgr.instances[i];
instance.disabledScripts = 0;
if (instance.topLevel)
setFlag (instance.topLevel);
for (var f in instance.functions)
setFlag(instance.functions[f]);
}
}
}
}
feedback (e, getMsg(MSN_CHROME_FILTER,
currentState ? MSG_VAL_ON : MSG_VAL_OFF));
}
function cmdClear (e)
{
var found = false;
for (var b in console.breaks)
{
var brk = console.breaks[b];
if ((!e.lineNumber ||
"lineNumber" in brk && e.lineNumber == brk.lineNumber) &&
brk.scriptWrapper.jsdScript.fileName.search(e.urlPattern) != -1)
{
found = true;
brk.scriptWrapper.clearBreakpoint(brk.pc);
feedback (e, getMsg(MSN_BP_CLEARED,
[brk.scriptWrapper.jsdScript.fileName,
e.lineNumber]));
}
}
if (!found)
{
feedback (e, getMsg(MSN_ERR_BP_NODICE, [e.urlPattern, e.lineNumber]),
MT_ERROR);
}
}
function cmdClearAll (e)
{
if (!("isInteractive" in e))
e.isInteractive = false;
var breakWrapperList = new Array()
for (var i in console.breaks)
breakWrapperList.push (console.breaks[i]);
if (breakWrapperList.length)
{
dispatch ("clear-break", { isInteractive: e.isInteractive,
breakWrapper: breakWrapperList[0],
breakWrapperList: breakWrapperList });
}
}
function cmdClearBreak (e)
{
if (!("isInteractive" in e))
e.isInteractive = false;
function clear (wrapper)
{
if (wrapper instanceof BreakInstance)
{
wrapper.scriptWrapper.clearBreakpoint(wrapper.pc);
}
else if (wrapper instanceof FutureBreakpoint)
{
for (var b in wrapper.childrenBP)
clear (wrapper.childrenBP[b]);
}
};
if ("breakWrapperList" in e)
{
for (var i = 0; i < e.breakWrapperList.length; ++i)
clear(e.breakWrapperList[i]);
}
else
{
clear (e.breakWrapper);
}
}
function cmdClearFBreak (e)
{
if (!("isInteractive" in e))
e.isInteractive = false;
function clear (wrapper)
{
if (wrapper instanceof FutureBreakpoint)
{
var params = {
isInteractive: e.isInteractive,
urlPattern: wrapper.url,
lineNumber: wrapper.lineNumber
};
dispatch ("fclear", params);
}
else if (wrapper instanceof BreakInstance && wrapper.parentBP)
{
clear (wrapper.parentBP);
}
};
if ("breakWrapperList" in e)
{
for (var i = 0; i < e.breakWrapperList.length; ++i)
clear(e.breakWrapperList[i]);
}
else
{
clear (e.breakWrapper);
}
}
function cmdClearProfile (e)
{
if ("scriptRecList" in e)
{
for (var i = 0; i < e.scriptRecList.length; ++i)
e.scriptRecList[i].script.clearProfileData();
}
else if ("scriptRec" in e)
{
e.scriptRec.script.clearProfileData();
}
else
{
console.jsds.clearProfileData();
}
feedback (e, MSG_PROFILE_CLEARED);
}
function cmdClearInstance (e)
{
if ("scriptInstanceList" in e)
{
for (var i = 0; i < e.scriptInstanceList.length; ++i)
cmdClearInstance ({ scriptInstance: e.scriptInstanceList[i] });
return true;
}
if (e.scriptInstance.topLevel)
e.scriptInstance.topLevel.clearBreakpoints();
for (var w in e.scriptInstance.functions)
e.scriptInstance.functions[w].clearBreakpoints();
return true;
}
function cmdClearScript (e)
{
var i;
if ("scriptWrapperList" in e)
{
for (i = 0; i < e.scriptWrapperList.length; ++i)
cmdClearScript ({scriptWrapper: e.scriptWrapperList[i]});
return true;
}
e.scriptWrapper.clearBreakpoints();
return true;
}
function cmdClose(e)
{
if ("sourceWindow" in e)
e.sourceWindow.close();
else
window.close();
}
function cmdCommands (e)
{
display (getMsg(MSN_TIP1_HELP,
console.prefs["sessionView.requireSlash"] ? "/" : ""));
display (MSG_TIP2_HELP);
var names = console.commandManager.listNames(e.pattern, CMD_CONSOLE);
if (!names.length)
{
display (getMsg(MSN_NO_CMDMATCH, e.pattern), MT_ERROR);
return true;
}
names = names.join(MSG_COMMASP);
if (e.pattern)
display (getMsg(MSN_CMDMATCH, [e.pattern, "[" + names + "]"]));
else
display (getMsg(MSN_CMDMATCH_ALL, "[" + names + "]"));
return true;
}
function cmdCont (e)
{
disableDebugCommands();
console.jsds.exitNestedEventLoop();
}
function cmdEMode (e)
{
if (e.mode != null)
{
e.mode = e.mode.toLowerCase();
if (e.mode == "cycle")
{
switch (console.errorMode)
{
case EMODE_IGNORE:
e.mode = "trace";
break;
case EMODE_TRACE:
e.mode = "break";
break;
case EMODE_BREAK:
e.mode = "ignore";
break;
}
}
switch (e.mode)
{
case "ignore":
console.errorMode = EMODE_IGNORE;
break;
case "trace":
console.errorMode = EMODE_TRACE;
break;
case "break":
console.errorMode = EMODE_BREAK;
break;
default:
display (getMsg(MSN_ERR_INVALID_PARAM, ["mode", e.mode]),
MT_ERROR);
return false;
}
console.prefs["lastErrorMode"] = e.mode;
}
switch (console.errorMode)
{
case EMODE_IGNORE:
feedback (e, MSG_EMODE_IGNORE);
break;
case EMODE_TRACE:
feedback (e, MSG_EMODE_TRACE);
break;
case EMODE_BREAK:
feedback (e, MSG_EMODE_BREAK);
break;
}
return true;
}
function cmdEval (e)
{
var urlFile;
var functionName;
var rv;
if (!("currentEvalObject" in console))
{
display (MSG_ERR_NO_EVAL_OBJECT, MT_ERROR);
return false;
}
display(getMsg(MSN_EVAL_IN, [leftPadString(console.evalCount, 3, "0"),
e.expression]),
MT_FEVAL_IN);
if (console.currentEvalObject instanceof jsdIStackFrame)
{
rv = evalInTargetScope (e.expression);
if (typeof rv != "undefined")
{
if (rv != null)
{
var l = $.length;
$[l] = rv;
display (getMsg(MSN_FMT_TMP_ASSIGN, [l, formatValue (rv)]),
MT_FEVAL_OUT);
}
else
dd ("evalInTargetScope returned null");
}
}
else
{
var parent;
var jsdValue = console.jsds.wrapValue (console.currentEvalObject);
if (jsdValue.jsParent)
parent = jsdValue.jsParent.getWrappedValue();
if (!parent)
parent = console.currentEvalObject;
if ("location" in parent)
urlFile = getFileFromPath(parent.location.href);
else
urlFile = MSG_VAL_UNKNOWN;
try
{
rv = console.doEval.apply(console.currentEvalObject,
[e.expression, parent]);
display (String(rv), MT_FEVAL_OUT);
}
catch (ex)
{
display (formatException(ex), MT_ERROR);
}
}
dispatch ("hook-eval-done");
return true;
}
function cmdEvald (e)
{
display (e.expression, MT_EVAL_IN);
var rv = evalInDebuggerScope (e.expression);
if (typeof rv != "undefined")
display (String(rv), MT_EVAL_OUT);
dispatch ("hook-eval-done");
return true;
}
function cmdFBreak(e)
{
if (!e.urlPattern)
{
/* if no input data, just list the breakpoints */
var i = 0;
for (var f in console.fbreaks)
{
var brk = console.fbreaks[f];
display (getMsg(MSN_FBP_LINE, [++i, brk.url, brk.lineNumber]));
}
if (i == 0)
display (MSG_NO_FBREAKS_SET);
return null;
}
else
{
var fbreak = setFutureBreakpoint (e.urlPattern, e.lineNumber,
e.properties);
if (fbreak)
{
feedback (e, getMsg(MSN_FBP_CREATED, [e.urlPattern, e.lineNumber]));
}
else
{
feedback (e, getMsg(MSN_FBP_EXISTS, [e.urlPattern, e.lineNumber]),
MT_ERROR);
}
return fbreak;
}
}
function cmdFinish (e)
{
if (console.frames.length == 1)
return cmdCont();
console._stepOverDepth = console.frames.length - 1;
setStopState(false);
console.jsds.functionHook = console.callHook;
disableDebugCommands()
console.jsds.exitNestedEventLoop();
return true;
}
function cmdFindBp (e)
{
if ("scriptWrapper" in e.breakpoint)
{
dispatch ("find-script",
{ scriptWrapper: e.breakpoint.scriptWrapper,
targetPc: e.breakpoint.pc });
}
else
{
dispatch ("find-url", {url: e.breakpoint.url,
rangeStart: e.breakpoint.lineNumber,
rangeEnd: e.breakpoint.lineNumber});
}
}
function cmdFindCreatorOrCtor (e)
{
var objVal = e.jsdValue.objectValue;
if (!objVal)
{
display (MSG_NOT_AN_OBJECT, MT_ERROR);
return false;
}
var name = e.command.name;
var url;
var line;
if (name == "find-creator")
{
url = objVal.creatorURL;
line = objVal.creatorLine;
}
else
{
url = objVal.constructorURL;
line = objVal.constructorLine;
}
return dispatch ("find-url",
{url: url, rangeStart: line, rangeEnd: line});
}
function cmdFindFile (e)
{
if (!e.fileName || e.fileName == "?")
{
var rv = pickOpen(MSG_OPEN_FILE, "$all");
if (rv.reason == PICK_CANCEL)
return null;
e.fileName = rv.file;
}
return dispatch ("find-url", {url: getURLSpecFromFile (e.fileName)});
}
function cmdFindFrame (e)
{
var jsdFrame = console.frames[e.frameIndex];
if ("isInteractive" in e && e.isInteractive)
displayFrame (jsdFrame, e.frameIndex, true);
if (jsdFrame.isNative)
return true;
var scriptWrapper = console.scriptWrappers[jsdFrame.script.tag]
return dispatch ("find-script",
{ scriptWrapper: scriptWrapper, targetPc: jsdFrame.pc });
}
function cmdFindScript (e)
{
var jsdScript = e.scriptWrapper.jsdScript;
var targetLine = 1;
var rv, params;
if (console.prefs["prettyprint"] && jsdScript.isValid)
{
if (e.targetPc != null)
targetLine = jsdScript.pcToLine(e.targetPc, PCMAP_PRETTYPRINT);
console.currentDetails = e.scriptWrapper;
params = {
sourceText: e.scriptWrapper.sourceText,
rangeStart: null,
rangeEnd: null,
targetLine: targetLine,
details: e.scriptWrapper
};
dispatch ("hook-display-sourcetext-soft", params);
rv = jsdScript.fileName;
}
else
{
if (e.targetPc != null && jsdScript.isValid)
targetLine = jsdScript.pcToLine(e.targetPc, PCMAP_SOURCETEXT);
else
targetLine = jsdScript.baseLineNumber;
params = {
sourceText: e.scriptWrapper.scriptInstance.sourceText,
rangeStart: jsdScript.baseLineNumber,
rangeEnd: jsdScript.baseLineNumber +
jsdScript.lineExtent - 1,
targetLine: targetLine,
details: e.scriptWrapper
};
rv = dispatch("find-sourcetext-soft", params);
}
return rv;
}
function cmdFindScriptInstance (e)
{
var params = Clone(e);
params.sourceText = e.scriptInstance.sourceText;
dispatch ("find-sourcetext", params);
}
function cmdFindSourceText (e)
{
function cb(status)
{
if (status != Components.results.NS_OK)
{
display (getMsg (MSN_ERR_SOURCE_LOAD_FAILED,
[e.sourceText.url, status], MT_ERROR));
return;
}
var params = {
sourceText: e.sourceText,
rangeStart: e.rangeStart,
rangeEnd: e.rangeEnd,
targetLine: (e.targetLine != null) ? e.targetLine : e.rangeStart,
details: e.details
};
if (e.command.name.indexOf("soft") != -1)
dispatch ("hook-display-sourcetext-soft", params);
else
dispatch ("hook-display-sourcetext", params);
};
console.currentSourceText = e.sourceText;
console.currentDetails = e.details;
if (!e.sourceText || e.sourceText.isLoaded)
cb(Components.results.NS_OK);
else
e.sourceText.loadSource(cb);
}
function cmdFindURL (e)
{
if (!e.url)
{
dispatch ("find-sourcetext", { sourceText: null });
return;
}
var sourceText;
if (e.url.indexOf("x-jsd:") == 0)
{
switch (e.url)
{
case "x-jsd:help":
sourceText = console.sourceText;
break;
default:
display (getMsg(MSN_ERR_INVALID_PARAM, ["url", e.url]),
MT_ERROR);
return;
}
}
else if (e.url in console.scriptManagers)
{
sourceText = console.scriptManagers[e.url].sourceText;
}
else if (e.url in console.files)
{
sourceText = console.files[e.url];
}
else
{
sourceText = console.files[e.url] = new SourceText (e.url);
}
var params = {
sourceText: sourceText,
rangeStart: e.rangeStart,
rangeEnd: e.rangeEnd,
targetLine: e.targetLine,
details: e.details
};
if (e.command.name.indexOf("soft") == -1)
dispatch ("find-sourcetext", params);
else
dispatch ("find-sourcetext-soft", params);
}
function cmdFClear (e)
{
var found = false;
for (var b in console.fbreaks)
{
var brk = console.fbreaks[b];
if (!e.lineNumber || e.lineNumber == brk.lineNumber &&
brk.url.search(e.urlPattern) != -1)
{
found = true;
clearFutureBreakpoint (brk.url, e.lineNumber);
feedback (e, getMsg(MSN_FBP_CLEARED, [brk.url, e.lineNumber]));
}
}
if (!found)
{
feedback (e, getMsg(MSN_ERR_BP_NODICE, [e.urlPattern, e.lineNumber]),
MT_ERROR);
}
}
function cmdFClearAll (e)
{
if (!("isInteractive" in e))
e.isInteractive = false;
var breakWrapperList = new Array();
for (var i in console.fbreaks)
breakWrapperList.push (console.fbreaks[i]);
if (breakWrapperList.length)
{
dispatch ("clear-fbreak", { isInteractive: e.isInteractive,
breakWrapper: breakWrapperList[0],
breakWrapperList: breakWrapperList });
}
}
function cmdFrame (e)
{
if (e.frameIndex != null)
{
if (e.frameIndex < 0 || e.frameIndex >= console.frames.length)
{
display (getMsg(MSN_ERR_INVALID_PARAM,
["frameIndex", e.frameIndex]),
MT_ERROR);
return false;
}
setCurrentFrameByIndex(e.frameIndex);
}
else
{
e.frameIndex = getCurrentFrameIndex();
}
if (!("isInteractive" in e))
e.isInteractive = false;
dispatch ("find-frame", { frameIndex: e.frameIndex,
isInteractive: e.isInteractive });
return true;
}
function cmdGC()
{
console.jsds.GC();
}
function cmdHelp (e)
{
var ary;
if (!e.pattern)
{
openTopWin ("x-jsd:help", "venkman-help");
return true;
}
else
{
ary = console.commandManager.list (e.pattern, CMD_CONSOLE);
if (ary.length == 0)
{
display (getMsg(MSN_ERR_NO_COMMAND, e.pattern), MT_ERROR);
return false;
}
for (var i in ary)
{
display (getMsg(MSN_FMT_USAGE, [ary[i].name, ary[i].usage]),
MT_USAGE);
display (ary[i].help, MT_HELP);
}
}
return true;
}
function cmdHook(e)
{
/* empty function used for "hook" commands. */
}
function cmdLoadd (e)
{
var ex;
if (!("_loader" in console))
{
const LOADER_CTRID = "@mozilla.org/moz/jssubscript-loader;1";
const mozIJSSubScriptLoader =
Components.interfaces.mozIJSSubScriptLoader;
var cls;
if ((cls = Components.classes[LOADER_CTRID]))
console._loader = cls.getService(mozIJSSubScriptLoader);
}
var obj = ("scope" in e) ? e.scope : null;
try
{
var rvStr;
var rv = rvStr = console._loader.loadSubScript(e.url, obj);
if (typeof rv == "function")
rvStr = MSG_TYPE_FUNCTION;
feedback(e, getMsg(MSN_SUBSCRIPT_LOADED, [e.url, rvStr]), MT_INFO);
return rv;
}
catch (ex)
{
display (getMsg(MSN_ERR_SCRIPTLOAD, e.url));
display (formatException(ex), MT_ERROR);
}
return null;
}
function cmdMoveView (e)
{
if (!e.viewId || !(e.viewId in console.views))
{
display (getMsg(MSN_ERR_INVALID_PARAM, ["viewId", e.viewId]), MT_ERROR);
return;
}
var parsedLocation = console.viewManager.parseLocation (e.locationUrl);
if (!parsedLocation)
{
display (getMsg(MSN_ERR_INVALID_PARAM, ["locationURL", e.locationURL]),
MT_ERROR);
return;
}
console.viewManager.moveView (parsedLocation, e.viewId);
}
function cmdMozillaHelp ()
{
if (typeof openHelp == "undefined")
toOpenWindowByType('mozilla:help', 'chrome://help/content/help.xul');
else
openHelp();
}
function cmdNext ()
{
// we don't setStopState(false) here because if the line we're at
// doesn't call out to a function, /next is the same as /step.
console._stepOverDepth = console.frames.length;
dispatch ("step");
console.jsds.functionHook = console.callHook;
return;
}
function cmdOpenDialog (e)
{
if (!e.windowFlags)
e.windowFlags = "chrome,menubar,toolbar,resizable,dialog=no";
return openDialog (e.url, e.windowName, e.windowFlags);
}
function cmdOpenURL (e)
{
var url = prompt (MSG_OPEN_URL, "http://");
if (url && url != "http://")
return dispatch ("find-url", { url: url });
return null;
}
function cmdPPrint (e)
{
var state, params;
if (e.toggle != null)
{
e.toggle = getToggle (e.toggle, console.prefs["prettyprint"]);
console.prefs["prettyprint"] = e.toggle;
var tb = document.getElementById("maintoolbar:toggle-pprint");
if (e.toggle)
{
tb.setAttribute("state", "true");
}
else
{
tb.removeAttribute("state");
}
if ("currentDetails" in console &&
console.currentDetails instanceof ScriptWrapper)
{
dispatch ("find-script", { scriptWrapper: console.currentDetails });
}
}
feedback (e, getMsg(MSN_FMT_PPRINT, console.prefs["prettyprint"] ?
MSG_VAL_ON : MSG_VAL_OFF));
return true;
}
function cmdPref (e)
{
if (e.prefName && e.prefName[0] == "-")
{
e.prefName = e.prefName.substr(1);
e.deletePref = true;
}
if (e.deletePref)
{
try
{
console.prefManager.prefBranch.clearUserPref(e.prefName);
console.prefManager.dirtyPrefs[e.prefName] = true;
console.prefManager.prefService.savePrefFile(null);
}
catch (ex)
{
// ignore exception generated by clear of nonexistant pref
if (!("result" in ex) ||
ex.result != Components.results.NS_ERROR_UNEXPECTED)
{
throw ex;
}
}
var prefValue = console.prefs[e.prefName];
feedback (e, getMsg(MSN_FMT_PREFVALUE,
[e.prefName, console.prefs[e.prefName]]));
return true;
}
if (e.prefValue)
{
var type = typeof console.prefs[e.prefName];
switch (type)
{
case "number":
e.prefValue = Number(e.prefValue);
break;
case "boolean":
e.prefValue = (e.prefValue.toLowerCase() == "true");
break;
case "string":
break;
default:
e.prefValue = String(e.prefValue);
break;
}
console.prefs[e.prefName] = e.prefValue;
feedback (e, getMsg(MSN_FMT_PREFVALUE, [e.prefName, e.prefValue]));
}
else
{
var ary = console.prefManager.listPrefs(e.prefName);
if (ary.length == 0)
{
display (getMsg(MSN_ERR_UNKNOWN_PREF, [e.prefName]),
MT_ERROR);
return false;
}
for (var i = 0; i < ary.length; ++i)
{
feedback (e, getMsg(MSN_FMT_PREFVALUE,
[ary[i], console.prefs[ary[i]]]));
}
}
return true;
}
function cmdProfile(e)
{
var currentState = console.jsds.flags & COLLECT_PROFILE_DATA;
if (e.toggle != null)
{
e.toggle = getToggle (e.toggle, currentState);
setProfileState(e.toggle);
}
else
{
e.toggle = currentState;
}
feedback (e, getMsg(MSN_PROFILE_STATE,
[e.toggle ? MSG_VAL_ON : MSG_VAL_OFF]));
}
function cmdProps (e)
{
var v;
var debuggerScope = (e.command.name == "propsd");
if (debuggerScope)
{
v = console.jsds.wrapValue(evalInDebuggerScope (e.expression));
}
else
{
if (!("currentEvalObject" in console))
{
display (MSG_ERR_NO_EVAL_OBJECT, MT_ERROR);
return false;
}
if (console.currentEvalObject instanceof jsdIStackFrame)
{
v = evalInTargetScope (e.expression);
}
else
{
v = console.doEval.apply(console.currentEvalObject,
[e.expression, parent]);
v = console.jsds.wrapValue(v);
}
}
if (!(v instanceof jsdIValue) || v.jsType != jsdIValue.TYPE_OBJECT)
{
var str = (v instanceof jsdIValue) ? formatValue(v) : String(v)
display (getMsg(MSN_ERR_INVALID_PARAM, [MSG_VAL_EXPRESSION, str]),
MT_ERROR);
return false;
}
display (getMsg(debuggerScope ? MSN_PROPSD_HEADER : MSN_PROPS_HEADER,
e.expression));
displayProperties(v);
return true;
}
function cmdQuit()
{
goQuitApplication();
}
function cmdRestoreLayout (e)
{
if (!e.name)
{
var list = console.prefManager.listPrefs("layoutState.");
for (var i = 0; i < list.length; ++i)
list[i] = list[i].substr(12);
list.push("factory");
display (getMsg(MSN_LAYOUT_LIST, list.sort().join(MSG_COMMASP)));
return;
}
var layout;
e.name = e.name.toLowerCase();
if (e.name == "factory")
{
layout = DEFAULT_VURLS;
}
else
{
var prefName = "layoutState." + e.name;
if (!(prefName in console.prefs))
{
display (getMsg(MSN_ERR_INVALID_PARAM, ["name", e.name]), MT_ERROR);
return;
}
else
{
layout = console.prefs[prefName];
}
}
console.viewManager.destroyWindows();
console.viewManager.reconstituteVURLs (layout.split (/\s*;\s*/));
}
function cmdRestoreSettings(e)
{
if (!e.settingsFile || e.settingsFile == "?")
{
var rv = pickOpen(MSG_OPEN_FILE, "*.js");
if (rv.reason == PICK_CANCEL)
return;
e.settingsFile = getURLSpecFromFile(rv.file);
}
else if (e.settingsFile.indexOf("file:") != 0)
{
e.settingsFile = getURLSpecFromFile(e.settingsFile);
}
dispatch("loadd", { url: e.settingsFile });
}
function cmdReleaseNotes (e)
{
openTopWin(MSG_RELEASE_URL);
}
function cmdRunTo (e)
{
if (!e.scriptWrapper.jsdScript.isValid)
return;
var breakpoint = e.scriptWrapper.setBreakpoint(e.pc);
if (breakpoint)
breakpoint.oneTime = true;
dispatch ("cont");
}
function cmdSaveBreakpoints(e)
{
var needClose = false;
var file = e.settingsFile;
if (!file || file == "?")
{
var rv = pickSaveAs(MSG_SAVE_FILE, "*.js");
if (rv.reason == PICK_CANCEL)
return;
e.settingsFile = file = fopen(rv.file, ">");
needClose = true;
}
else if (typeof file == "string")
{
e.settingsFile = file = fopen(file, ">");
needClose = true;
}
var fbp, bp;
var params;
file.write ("\n//Breakpoint settings start...\n");
for (i in console.fbreaks)
{
var wroteVar;
fbp = console.fbreaks[i];
params = {
urlPattern: fbp.url,
lineNumber: fbp.lineNumber,
properties: fbp.getProperties()
};
if (keys(fbp.childrenBP).length)
{
if (!wroteVar)
{
file.write ("var fbreak;\n\n");
wroteVar = true;
}
file.write("fbreak = ");
}
file.write("dispatch('fbreak', " + params.toSource() + ");\n\n");
for (i in fbp.childrenBP)
{
bp = fbp.childrenBP[i];
file.write("dispatch('break', {" +
"urlPattern:" + bp.url.quote() + ", " +
"lineNumber:" + bp.lineNumber + ", " +
"parent:fbreak, " +
"properties:" + bp.getProperties().toSource() +
"});\n");
};
file.write("\n");
}
for (i in console.breaks)
{
bp = console.breaks[i];
if (!bp.parentBP)
{
params = {
urlPattern: bp.url,
lineNumber: bp.lineNumber,
properties: bp.getProperties()
};
file.write("dispatch('break', " + params.toSource() + ");\n");
}
}
file.write (MSG_BREAKPOINTS_RESTORED.quote() + ";\n");
if (needClose)
file.close();
}
function cmdSaveLayout(e)
{
if (!e.name)
{
var list = console.prefManager.listPrefs("layoutState.");
for (var i = 0; i < list.length; ++i)
list[i] = list[i].substr(12);
list.push("factory");
display (getMsg(MSN_LAYOUT_LIST, list.sort().join(MSG_COMMASP)));
return;
}
e.name = e.name.toLowerCase();
if (e.name == "factory")
{
display (getMsg(MSN_ERR_INVALID_PARAM, ["name", e.name]), MT_ERROR);
return;
}
var ary = console.viewManager.getLayoutState ();
var prefName = "layoutState." + e.name;
console.prefManager.addPref(prefName, "");
console.prefs[prefName] = ary.join ("; ");
}
function cmdSaveProfile (e)
{
function onComplete (i)
{
var msg = getMsg(MSN_PROFILE_SAVED, getURLSpecFromFile(file.localFile));
display (msg);
console.status = msg;
file.close();
};
var templatePfx = "profile.template.";
var i;
var ext;
if (!e.targetFile || e.targetFile == "?")
{
var list = console.prefManager.listPrefs(templatePfx);
var extList = "";
for (i = 0; i < list.length; ++i)
{
ext = list[i].substr(templatePfx.length);
if (list[i].search(/html|htm|xml|txt/i) == -1)
extList += "*." + ext + " ";
}
var rv = pickSaveAs(MSG_SAVE_PROFILE, "$html $xml $text " +
extList + "$all");
if (rv.reason == PICK_CANCEL)
return null;
e.targetFile = rv.file;
}
var file = fopen (e.targetFile, ">");
var templateName;
var ary = file.localFile.path.match(/\.([^.]+)$/);
if (ary)
ext = ary[1].toLowerCase();
else
ext = "txt";
templateName = templatePfx + ext;
var templateFile;
if (templateName in console.prefs)
templateFile = console.prefs[templateName];
else
templateFile = console.prefs[templatePfx + "txt"];
var reportTemplate = console.profiler.loadTemplate(templateFile);
var scriptInstanceList = new Array();
var j;
if (!("urlList" in e) || e.urlList.length == 0)
{
if ("url" in e && e.url)
e.urlList = [e.url];
else
e.urlList = keys(console.scriptManagers);
}
e.urlList = e.urlList.sort();
for (i = 0; i < e.urlList.length; ++i)
{
var url = e.urlList[i];
if (!ASSERT (url in console.scriptManagers, "url not loaded"))
continue;
var manager = console.scriptManagers[url];
for (j in manager.instances)
scriptInstanceList.push (manager.instances[j]);
}
var rangeList;
if (("profile.ranges." + ext) in console.prefs)
rangeList = console.prefs["profile.ranges." + ext].split(",");
else
rangeList = console.prefs["profile.ranges.default"].split(",");
var profileReport = new ProfileReport (reportTemplate, file, rangeList,
scriptInstanceList);
profileReport.onComplete = onComplete;
console.profiler.generateReport (profileReport);
return file.localFile;
}
function cmdSaveSettings(e)
{
if (!e.settingsFile || e.settingsFile == "?")
{
var rv = pickSaveAs(MSG_SAVE_FILE, "*.js");
if (rv.reason == PICK_CANCEL)
return;
e.settingsFile = fopen(rv.file, ">");
}
else if (typeof e.settingsFile == "string")
{
e.settingsFile = fopen(e.settingsFile, ">");
}
dispatch ("save-breakpoints", { settingsFile: e.settingsFile });
dispatch ("save-watches", { settingsFile: e.settingsFile });
e.settingsFile.write("\n" + MSG_SETTINGS_RESTORED.quote() + ";\n");
e.settingsFile.close();
}
function cmdScanSource (e)
{
e.scriptInstance.scanForMetaComments();
}
function cmdScope ()
{
if (getCurrentFrame().scope.propertyCount == 0)
display (getMsg (MSN_NO_PROPERTIES, MSG_VAL_SCOPE));
else
displayProperties (getCurrentFrame().scope);
return true;
}
function cmdThisExpr(e)
{
if (e.expression == "debugger")
{
rv = console.jsdConsole;
}
else if (console.currentEvalObject instanceof jsdIStackFrame)
{
rv = evalInTargetScope (e.expression);
}
else
{
rv = console.doEval.apply(console.currentEvalObject,
[e.expression, parent]);
}
if (!(rv instanceof jsdIValue))
rv = console.jsds.wrapValue(rv);
if (rv.jsType != TYPE_OBJECT)
{
display (MSG_ERR_THIS_NOT_OBJECT, MT_ERROR);
return false;
}
dispatch ("set-eval-obj", { jsdValue: rv });
dispatch ("hook-eval-done");
return true;
}
function cmdToggleSomething (e)
{
var ary = e.command.name.match (/(.*)-(on|off|toggle)$/);
if (!ary)
return;
var newEvent = Clone(e);
if (ary[2] == "on")
newEvent.toggle = true;
else if (ary[2] == "off")
newEvent.toggle = false;
else
newEvent.toggle = "toggle";
dispatch (ary[1], newEvent);
}
function cmdSetEvalObj (e)
{
if (!(e.jsdValue instanceof jsdIStackFrame))
{
e.jsdValue = e.jsdValue.getWrappedValue();
}
if (e.jsdValue == console.currentEvalObject)
{
var frame = getCurrentFrame();
if (frame)
e.jsdValue = frame;
else
e.jsdValue = console;
}
console.currentEvalObject = e.jsdValue;
}
function cmdSetScriptFlag (e)
{
function setFlag (scriptWrapper)
{
var jsdScript = scriptWrapper.jsdScript;
if (!jsdScript.isValid)
return;
if (e.toggle == "toggle")
{
jsdScript.flags ^= flag;
if (flag == SCRIPT_NODEBUG)
{
if (jsdScript.flags & flag)
++scriptWrapper.scriptInstance.disabledScripts;
else
--scriptWrapper.scriptInstance.disabledScripts;
}
}
else if (e.toggle)
{
jsdScript.flags |= flag;
if (flag == SCRIPT_NODEBUG)
++scriptWrapper.scriptInstance.disabledScripts;
}
else
{
jsdScript.flags &= ~flag;
if (flag == SCRIPT_NODEBUG)
--scriptWrapper.scriptInstance.disabledScripts;
}
};
function setFlagInstance (scriptInstance)
{
if (scriptInstance.topLevel)
setFlag (scriptInstance.topLevel);
for (var f in scriptInstance.functions)
setFlag (scriptInstance.functions[f]);
};
var flag;
var i;
if (e.command.name.search(/^profile/) == 0)
flag = SCRIPT_NOPROFILE;
else
flag = SCRIPT_NODEBUG;
if (e.command.name.search (/script$/) != -1)
{
if ("scriptWrapperList" in e)
{
for (i = 0; i < e.scriptWrapperList.length; ++i)
setFlag(e.scriptWrapperList[i]);
}
else
{
setFlag(e.scriptWrapper);
}
}
else
{
if ("scriptInstanceList" in e)
{
for (i = 0; i < e.scriptInstanceList.length; ++i)
setFlagInstance(e.scriptInstanceList[i]);
}
else
{
setFlagInstance(e.scriptInstance);
}
}
}
function cmdSetTransientFlag (e)
{
function setFlag (url)
{
if (!(url in console.scriptManagers))
return;
var scriptManager = console.scriptManagers[url];
if (e.toggle == "toggle")
scriptManager.disableTransients = !scriptManager.disableTransients;
else
scriptManager.disableTransients = e.toggle;
};
if ("urlList" in e)
{
for (var i = 0; i < e.urlList.length; ++i)
setFlag (e.urlList[i]);
}
else
{
setFlag (e.url);
}
}
function cmdStartupInit (e)
{
dd ("startup-init " + e.toggle);
if (e.toggle != null)
{
e.toggle = getToggle (e.toggle, console.jsds.initAtStartup);
console.jsds.initAtStartup = e.toggle;
}
display (getMsg(MSN_IASMODE,
console.jsds.initAtStartup ? MSG_VAL_ON : MSG_VAL_OFF));
return true;
}
function cmdStep()
{
setStopState(true);
var topFrame = console.frames[0];
console._stepPast = console.frames.length + topFrame.script.fileName;
if (console.prefs["prettyprint"])
{
console._stepPast +=
topFrame.script.pcToLine(topFrame.pc, PCMAP_PRETTYPRINT);
}
else
{
console._stepPast += topFrame.line;
}
disableDebugCommands()
console.jsds.exitNestedEventLoop();
return true;
}
function cmdStop (e)
{
if (console.jsds.interruptHook)
setStopState(false);
else
setStopState(true);
}
function cmdTMode (e)
{
if (e.mode != null)
{
e.mode = e.mode.toLowerCase();
if (e.mode == "cycle")
{
switch (console.throwMode)
{
case TMODE_IGNORE:
e.mode = "trace";
break;
case TMODE_TRACE:
e.mode = "break";
break;
case TMODE_BREAK:
e.mode = "ignore";
break;
}
}
switch (e.mode.toLowerCase())
{
case "ignore":
console.jsds.throwHook = null;
console.throwMode = TMODE_IGNORE;
break;
case "trace":
console.jsds.throwHook = console.executionHook;
console.throwMode = TMODE_TRACE;
break;
case "break":
console.jsds.throwHook = console.executionHook;
console.throwMode = TMODE_BREAK;
break;
default:
display (getMsg(MSN_ERR_INVALID_PARAM, ["mode", e.mode]),
MT_ERROR);
return false;
}
console.prefs["lastThrowMode"] = e.mode;
}
switch (console.throwMode)
{
case TMODE_IGNORE:
feedback (e, MSG_TMODE_IGNORE);
break;
case TMODE_TRACE:
feedback (e, MSG_TMODE_TRACE);
break;
case TMODE_BREAK:
feedback (e, MSG_TMODE_BREAK);
break;
}
return true;
}
function cmdToggleFloat (e)
{
if (!e.viewId in console.views ||
typeof console.views[e.viewId] != "object")
{
display (getMsg(MSN_ERR_NO_SUCH_VIEW, e.viewId), MT_ERROR);
return;
}
var locationUrl;
var view = console.views[e.viewId];
var parsedLocation =
console.viewManager.computeLocation(view.currentContent);
if (parsedLocation.windowId == VMGR_MAINWINDOW)
{
/* already in the main window, float the view. */
locationUrl = VMGR_VURL_NEW
}
else
{
/* already floated, put it back. */
if ("previousLocation" in view)
locationUrl = view.previousLocation;
else
locationUrl = VMGR_VURL_GUTTER;
}
dispatch ("move-view", { viewId: e.viewId, locationUrl: locationUrl });
}
function cmdTogglePref (e)
{
var state = !console.prefs[e.prefName];
console.prefs[e.prefName] = state;
feedback (e, getMsg (MSN_FMT_PREFVALUE,
[e.prefName, state ? MSG_VAL_ON : MSG_VAL_OFF]));
}
function cmdToggleView (e)
{
if (!e.viewId in console.views || typeof console.views[e.viewId] != "object")
{
display (getMsg(MSN_ERR_NO_SUCH_VIEW, e.viewId), MT_ERROR);
return;
}
var view = console.views[e.viewId];
var url;
if ("currentContent" in view)
{
url = VMGR_VURL_HIDDEN;
}
else
{
if ("previousLocation" in view)
url = view.previousLocation;
else
url = VMGR_VURL_GUTTER;
}
console.viewManager.moveViewURL (url, e.viewId);
}
function cmdVersion ()
{
display(MSG_HELLO, MT_HELLO);
display(getMsg(MSN_VERSION, __vnk_version + __vnk_versionSuffix), MT_HELLO);
}
function cmdWhere ()
{
displayCallStack();
return true;
}