function debuggerScriptConstructor() {
var DebuggerScript = {};
DebuggerScript._breakpoints = {};
DebuggerScript.PauseOnExceptionsState = {
DontPauseOnExceptions : 0,
PauseOnAllExceptions : 1,
PauseOnUncaughtExceptions: 2
};
DebuggerScript._pauseOnExceptionsState = DebuggerScript.PauseOnExceptionsState.DontPauseOnExceptions;
Debug.clearBreakOnException();
Debug.clearBreakOnUncaughtException();
DebuggerScript.getAfterCompileScript = function(execState, args)
{
return DebuggerScript._formatScript(args.eventData.script_.script_);
}
DebuggerScript.getScripts = function(contextData)
{
var scripts = Debug.scripts();
var result = [];
for (var i = 0; i < scripts.length; ++i) {
var script = scripts[i];
if (contextData === script.context_data)
result.push(DebuggerScript._formatScript(script));
}
return result;
}
DebuggerScript._formatScript = function(script)
{
return {
id: script.id,
name: script.name,
source: script.source,
lineOffset: script.line_offset,
lineCount: script.lineCount(),
contextData: script.context_data
};
}
DebuggerScript.setBreakpoint = function(execState, args)
{
args.lineNumber = DebuggerScript._webkitToV8LineNumber(args.lineNumber);
var key = args.scriptId + ":" + args.lineNumber;
var breakId = DebuggerScript._breakpoints[key];
if (breakId) {
if (args.enabled)
Debug.enableScriptBreakPoint(breakId);
else
Debug.disableScriptBreakPoint(breakId);
Debug.changeScriptBreakPointCondition(breakId, args.condition);
return breakId;
}
breakId = Debug.setScriptBreakPointById(args.scriptId, args.lineNumber, 0 , args.condition);
DebuggerScript._breakpoints[key] = breakId;
if (!args.enabled)
Debug.disableScriptBreakPoint(breakId);
return breakId;
}
DebuggerScript.removeBreakpoint = function(execState, args)
{
args.lineNumber = DebuggerScript._webkitToV8LineNumber(args.lineNumber);
var key = args.scriptId + ":" + args.lineNumber;
var breakId = DebuggerScript._breakpoints[key];
if (breakId)
Debug.findBreakPoint(breakId, true);
delete DebuggerScript._breakpoints[key];
}
DebuggerScript.pauseOnExceptionsState = function()
{
return DebuggerScript._pauseOnExceptionsState;
}
DebuggerScript.setPauseOnExceptionsState = function(newState)
{
DebuggerScript._pauseOnExceptionsState = newState;
if (DebuggerScript.PauseOnExceptionsState.PauseOnAllExceptions === newState)
Debug.setBreakOnException();
else
Debug.clearBreakOnException();
if (DebuggerScript.PauseOnExceptionsState.PauseOnUncaughtExceptions === newState)
Debug.setBreakOnUncaughtException();
else
Debug.clearBreakOnUncaughtException();
}
DebuggerScript.currentCallFrame = function(execState, args)
{
var frameCount = execState.frameCount();
if (frameCount === 0)
return undefined;
var topFrame;
for (var i = frameCount - 1; i >= 0; i--) {
var frameMirror = execState.frame(i);
topFrame = DebuggerScript._frameMirrorToJSCallFrame(frameMirror, topFrame);
}
return topFrame;
}
DebuggerScript.stepIntoStatement = function(execState, args)
{
execState.prepareStep(Debug.StepAction.StepIn, 1);
}
DebuggerScript.stepOverStatement = function(execState, args)
{
execState.prepareStep(Debug.StepAction.StepNext, 1);
}
DebuggerScript.stepOutOfFunction = function(execState, args)
{
execState.prepareStep(Debug.StepAction.StepOut, 1);
}
DebuggerScript.clearBreakpoints = function(execState, args)
{
for (var key in DebuggerScript._breakpoints) {
var breakId = DebuggerScript._breakpoints[key];
Debug.findBreakPoint(breakId, true);
}
DebuggerScript._breakpoints = {};
}
DebuggerScript.setBreakpointsActivated = function(execState, args)
{
for (var key in DebuggerScript._breakpoints) {
var breakId = DebuggerScript._breakpoints[key];
if (args.enabled)
Debug.enableScriptBreakPoint(breakId);
else
Debug.disableScriptBreakPoint(breakId);
}
}
DebuggerScript._frameMirrorToJSCallFrame = function(frameMirror, callerFrame)
{
var func;
try {
func = frameMirror.func();
} catch(e) {
}
var functionName;
if (func)
functionName = func.name() || func.inferredName();
if (!functionName)
functionName = "[anonymous]";
var script = func.script();
var sourceID = script && script.id();
var line = DebuggerScript._v8ToWebkitLineNumber(frameMirror.sourceLine());
var thisObject = frameMirror.details_.receiver();
var scopeChain = [];
var scopeType = [];
for (var i = 0; i < frameMirror.scopeCount(); i++) {
var scopeMirror = frameMirror.scope(i);
var scopeObjectMirror = scopeMirror.scopeObject();
var properties = scopeObjectMirror.properties();
var scopeObject = {};
for (var j = 0; j < properties.length; j++)
scopeObject[properties[j].name()] = properties[j].value_;
scopeType.push(scopeMirror.scopeType());
scopeChain.push(scopeObject);
}
function evaluate(expression) {
return frameMirror.evaluate(expression, false).value();
}
return {
"sourceID": sourceID,
"line": line,
"functionName": functionName,
"type": "function",
"thisObject": thisObject,
"scopeChain": scopeChain,
"scopeType": scopeType,
"evaluate": evaluate,
"caller": callerFrame
};
}
DebuggerScript._webkitToV8LineNumber = function(line)
{
return line - 1;
};
DebuggerScript._v8ToWebkitLineNumber = function(line)
{
return line + 1;
};
return DebuggerScript;
}