Source code
Revision control
Copy as Markdown
Other Tools
// Bug: toggling collectCoverageInfo via eval-in-frame after setting a breakpoint
// causes scripts to end up with mismatched observing state, triggering an assertion.
var g1 = newGlobal({ newCompartment: true });
var g2 = newGlobal({ newCompartment: true });
g1.g2 = g2;
g2.g1 = g1;
g1.evaluate(`
function outer() {
return g2.middle();
}
function inner() {
debugger;
}
`);
g2.evaluate(`
function middle() {
return g1.inner();
}
`);
var dbg1 = new Debugger(g1);
dbg1.collectCoverageInfo = true;
var dbg2 = new Debugger(g2);
// Warmup to baseline.
for (var i = 0; i < 30; i++) {
g1.outer();
}
dbg1.onDebuggerStatement = function() {
// Set a breakpoint
var script = dbg1.findScripts({global: g1, displayName: "outer"})[0];
var offsets = script.getAllOffsets();
for (var line in offsets) {
if (offsets[line] && offsets[line].length > 0) {
script.setBreakpoint(offsets[line][0], {});
break;
}
}
// Toggle coverage via eval in g2's frame
var g2Frame = dbg2.getNewestFrame();
g2.toggle = function() {
dbg1.collectCoverageInfo = false;
};
g2Frame.eval("toggle()");
};
g1.outer();
// Turning the coverage off shouldn't trigger any assertion failures around the observing flag.
dbg1.collectCoverageInfo = false;