Source code

Revision control

Copy as Markdown

Other Tools

// reparsing a source should produce equivalent scripts and avoid invoking the
// onNewScript hook.
const g = newGlobal({newCompartment: true});
const dbg = new Debugger;
dbg.addDebuggee(g);
let globalScript;
dbg.onNewScript = script => { globalScript = script };
// Leave `g()` on the first line so we can check that `columnNumber` is passed to the
// reparsed script (`columnNumber` is only used to offset breakpoint column on the first
// line of the script).
g.evaluate(`g();
function f() {
for (var i = 0; i < 10; i++) {
g();
}
}
function g() {
return 3;
}
f();
`, {
fileName: "foobar.js",
lineNumber: 3,
columnNumber: 42,
});
let onNewScriptCalls = 0;
dbg.onNewScript = script => { onNewScriptCalls++; };
const reparsedScript = globalScript.source.reparse();
assertEq(onNewScriptCalls, 0);
assertEq(reparsedScript.url, "foobar.js");
assertEq(reparsedScript.startLine, 3);
assertEq(reparsedScript.startColumn, 42);
// Test for the same breakpoint positions in the original and reparsed script.
function getBreakpointPositions(script) {
const offsets = script.getPossibleBreakpoints();
const str = offsets.map(({ lineNumber, columnNumber }) => `${lineNumber}:${columnNumber}`).toString();
const childPositions = script.getChildScripts().map(getBreakpointPositions);
return str + childPositions.toString();
}
assertEq(getBreakpointPositions(globalScript), getBreakpointPositions(reparsedScript));