blob: 67c326824fa451c10411d3cb219991d540617612 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
var args = arguments;
var debugAction = arguments[0];
var filesMap = {};
const magicId = 42;
function receive(message) {
const parsedMessage = JSON.parse(message);
const method = parsedMessage.method;
if (method === "Debugger.paused") {
if (isStoppedInNonUserScript(parsedMessage.params.callFrames)) {
send(JSON.stringify({id: 2, method: "Debugger.stepOut" }))
} else {
writeStackTrace(parsedMessage.params.callFrames);
send(JSON.stringify({id: 2, method: debugAction }))
}
} else if (method === "Debugger.scriptParsed") {
filesMap[parsedMessage.params.scriptId] = parsedMessage.params.url;
if (parsedMessage.params.url.endsWith("js.js")) {
setBreakpoints(parsedMessage.params.scriptId);
}
} else if (parsedMessage.id === magicId) {
var locations = parsedMessage.result.locations;
if (locations.length > 0) {
setBreakpoint(locations[0].scriptId, locations[0].lineNumber,
locations[0].columnNumber);
}
}
}
send(JSON.stringify({id: 0, method: "Debugger.enable" }));
function setBreakpoints(script) {
for(var i = 1; i < args.length; ++i) {
var data = args[i];
data = data.split(":");
if (data.length === 4) {
send(JSON.stringify({
id: magicId,
method: "Debugger.getPossibleBreakpoints",
params: {
start: {
scriptId: script,
lineNumber: parseInt(data[0]),
columnNumber: parseInt(data[1])
},
end: {
scriptId: script,
lineNumber: parseInt(data[2]),
columnNumber: parseInt(data[3])
}
}
}));
} else if (data.length === 2) {
setBreakpoint(script, parseInt(data[0]), parseInt(data[1]));
} else {
throw "Unexpected arguments: " + arguments[i];
}
}
}
function setBreakpoint(script, line, column) {
send(JSON.stringify({
id: 2,
method: "Debugger.setBreakpoint",
params: {
location: {
scriptId: script,
lineNumber: line,
columnNumber: column
}
}
}));
}
function isStoppedInNonUserScript(callFrames) {
if (callFrames.length === 0) return true;
var frame = callFrames[0];
var location = frame.location;
var url = filesMap[location.scriptId];
if (url.endsWith("js.js")) return false;
if (url.endsWith("wrapper.js")) return false;
return true;
}
function writeStackTrace(callFrames) {
print("");
print("--- Debugger stacktrace start ---");
for(var i = 0; i < callFrames.length; ++i) {
writeStackTraceLocation(callFrames[i]);
}
print("--- Debugger stacktrace end ---");
print("");
}
function writeStackTraceLocation(frame) {
var location = frame.location;
var url = filesMap[location.scriptId];
var functionName = frame.functionName;
if (functionName === null || functionName === "") functionName = "(unknown)";
print(" at " + functionName + " ("
+ url + ":" + location.lineNumber + ":" + location.columnNumber
+ ")");
}