Source code

Revision control

Copy as Markdown

Other Tools

// validate the common behavior of of Debugger.adoptFrame
load(libdir + "asserts.js");
const g = newGlobal({ newCompartment: true });
const dbg1 = new Debugger();
const gDO1 = dbg1.addDebuggee(g);
let suspendedFrame;
dbg1.onDebuggerStatement = function() {
// Test working with an onStack frame.
const frame1 = dbg1.getNewestFrame();
const dbg = new Debugger();
assertErrorMessage(
() => dbg.adoptFrame(frame1),
Error,
"Debugger.Frame's global is not a debuggee"
);
dbg.addDebuggee(g);
const frame2 = dbg.adoptFrame(frame1);
assertMatchingFrame(frame1, frame2);
suspendedFrame = frame1;
};
const generator = g.eval(`
function* fn() {
debugger;
yield;
}
fn();
`);
generator.next();
(function() {
// Test working with a suspended generator frame.
const dbg = new Debugger();
assertErrorMessage(
() => dbg.adoptFrame(suspendedFrame),
Error,
"Debugger.Frame's global is not a debuggee"
);
dbg.addDebuggee(g);
const frame2 = dbg.adoptFrame(suspendedFrame);
assertMatchingFrame(frame2, suspendedFrame);
})();
generator.next();
const deadFrame = suspendedFrame;
(function() {
// Test working with a dead frame.
const dbg = new Debugger();
// This doesn't throw because the dead frame doesn't have any
// debuggee-specific data associated with it anymore.
dbg.adoptFrame(deadFrame);
dbg.addDebuggee(g);
const frame2 = dbg.adoptFrame(deadFrame);
assertMatchingFrame(frame2, deadFrame);
})();
function assertMatchingFrame(frame1, frame2) {
assertEq(frame2.onStack, frame1.onStack);
assertEq(frame2.terminated, frame1.terminated);
if (!frame2.terminated) {
assertEq(frame2.type, frame1.type);
assertEq(frame2.offset, frame1.offset);
}
}