239 lines
6.7 KiB
JavaScript
239 lines
6.7 KiB
JavaScript
/* eslint-disable max-nested-callbacks */
|
|
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
/**
|
|
* Bug 1441183 - Verify that the debugger advances to a new location
|
|
* when encountering debugger statements and brakpoints
|
|
*
|
|
* Bug 1613165 - Verify that debugger statement is not disabled by
|
|
* adding/removing a breakpoint
|
|
*/
|
|
add_task(
|
|
threadFrontTest(async props => {
|
|
await testDebuggerStatements(props);
|
|
await testBreakpoints(props);
|
|
await testBreakpointsAndDebuggerStatements(props);
|
|
await testLoops(props);
|
|
await testRemovingBreakpoint(props);
|
|
await testAddingBreakpoint(props);
|
|
})
|
|
);
|
|
|
|
// Ensure that we advance to the next line when we
|
|
// step to a debugger statement and resume.
|
|
async function testDebuggerStatements({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
debugger;
|
|
debugger;
|
|
debugger;
|
|
}
|
|
foo();
|
|
//# sourceURL=http://example.com/code.js`);
|
|
|
|
await performActions(threadFront, [
|
|
[
|
|
"paused at first debugger statement",
|
|
{ line: 2, type: "debuggerStatement" },
|
|
"stepOver",
|
|
],
|
|
[
|
|
"paused at the second debugger statement",
|
|
{ line: 3, type: "resumeLimit" },
|
|
"resume",
|
|
],
|
|
[
|
|
"paused at the third debugger statement",
|
|
{ line: 4, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
]);
|
|
}
|
|
|
|
// Ensure that we advance to the next line when we hit a breakpoint
|
|
// on a line with a debugger statement and resume.
|
|
async function testBreakpointsAndDebuggerStatements({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
debugger;
|
|
debugger;
|
|
debugger;
|
|
}
|
|
foo();
|
|
//# sourceURL=http://example.com/testBreakpointsAndDebuggerStatements.js`);
|
|
|
|
threadFront.setBreakpoint(
|
|
{
|
|
sourceUrl: "http://example.com/testBreakpointsAndDebuggerStatements.js",
|
|
line: 3,
|
|
},
|
|
{}
|
|
);
|
|
|
|
await performActions(threadFront, [
|
|
[
|
|
"paused at first debugger statement",
|
|
{ line: 2, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
[
|
|
"paused at the breakpoint at the second debugger statement",
|
|
{ line: 3, type: "breakpoint" },
|
|
"resume",
|
|
],
|
|
[
|
|
"pause at the third debugger statement",
|
|
{ line: 4, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
]);
|
|
}
|
|
|
|
// Ensure that we advance to the next line when we step to
|
|
// a line with a breakpoint and resume.
|
|
async function testBreakpoints({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
debugger;
|
|
a();
|
|
debugger;
|
|
}
|
|
function a() {}
|
|
foo();
|
|
//# sourceURL=http://example.com/testBreakpoints.js`);
|
|
|
|
threadFront.setBreakpoint(
|
|
{ sourceUrl: "http://example.com/testBreakpoints.js", line: 3, column: 6 },
|
|
{}
|
|
);
|
|
|
|
await performActions(threadFront, [
|
|
[
|
|
"paused at first debugger statement",
|
|
{ line: 2, type: "debuggerStatement" },
|
|
"stepOver",
|
|
],
|
|
["paused at a()", { line: 3, type: "resumeLimit" }, "resume"],
|
|
[
|
|
"pause at the second debugger satement",
|
|
{ line: 4, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
]);
|
|
}
|
|
|
|
// Ensure that we advance to the next line when we step to
|
|
// a line with a breakpoint and resume.
|
|
async function testLoops({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
let i = 0;
|
|
debugger;
|
|
while (i++ < 2) {
|
|
debugger;
|
|
}
|
|
debugger;
|
|
}
|
|
foo();
|
|
//# sourceURL=http://example.com/testLoops.js`);
|
|
|
|
await performActions(threadFront, [
|
|
[
|
|
"paused at first debugger statement",
|
|
{ line: 3, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
[
|
|
"pause at the second debugger satement",
|
|
{ line: 5, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
[
|
|
"pause at the second debugger satement (2nd time)",
|
|
{ line: 5, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
[
|
|
"pause at the third debugger satement",
|
|
{ line: 7, type: "debuggerStatement" },
|
|
"resume",
|
|
],
|
|
]);
|
|
}
|
|
|
|
// Bug 1613165 - ensure that if you pause on a breakpoint on a line with
|
|
// debugger statement, remove the breakpoint, and try to pause on the
|
|
// debugger statement before pausing anywhere else, debugger pauses instead of
|
|
// skipping debugger statement.
|
|
async function testRemovingBreakpoint({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
debugger;
|
|
}
|
|
foo();
|
|
foo();
|
|
//# sourceURL=http://example.com/testRemovingBreakpoint.js`);
|
|
|
|
const location = {
|
|
sourceUrl: "http://example.com/testRemovingBreakpoint.js",
|
|
line: 2,
|
|
column: 6,
|
|
};
|
|
|
|
threadFront.setBreakpoint(location, {});
|
|
|
|
info("paused at the breakpoint at the first debugger statement");
|
|
const packet = await waitForEvent(threadFront, "paused");
|
|
Assert.equal(packet.frame.where.line, 2);
|
|
Assert.equal(packet.why.type, "breakpoint");
|
|
threadFront.removeBreakpoint(location);
|
|
|
|
info("paused at the first debugger statement");
|
|
const packet2 = await resumeAndWaitForPause(threadFront);
|
|
Assert.equal(packet2.frame.where.line, 2);
|
|
Assert.equal(packet2.why.type, "debuggerStatement");
|
|
await threadFront.resume();
|
|
}
|
|
|
|
// Bug 1613165 - ensure if you pause on a debugger statement, add a
|
|
// breakpoint on the same line, and try to pause on the breakpoint
|
|
// before pausing anywhere else, debugger pauses on that line instead of
|
|
// skipping breakpoint.
|
|
async function testAddingBreakpoint({ commands, threadFront }) {
|
|
commands.scriptCommand.execute(`function foo(stop) {
|
|
debugger;
|
|
}
|
|
foo();
|
|
foo();
|
|
//# sourceURL=http://example.com/testAddingBreakpoint.js`);
|
|
|
|
const location = {
|
|
sourceUrl: "http://example.com/testAddingBreakpoint.js",
|
|
line: 2,
|
|
column: 6,
|
|
};
|
|
|
|
info("paused at the first debugger statement");
|
|
const packet = await waitForEvent(threadFront, "paused");
|
|
Assert.equal(packet.frame.where.line, 2);
|
|
Assert.equal(packet.why.type, "debuggerStatement");
|
|
threadFront.setBreakpoint(location, {});
|
|
|
|
info("paused at the breakpoint at the first debugger statement");
|
|
const packet2 = await resumeAndWaitForPause(threadFront);
|
|
Assert.equal(packet2.frame.where.line, 2);
|
|
Assert.equal(packet2.why.type, "breakpoint");
|
|
await threadFront.resume();
|
|
}
|
|
|
|
async function performActions(threadFront, actions) {
|
|
for (const action of actions) {
|
|
await performAction(threadFront, action);
|
|
}
|
|
}
|
|
|
|
async function performAction(threadFront, [description, result, action]) {
|
|
info(description);
|
|
const packet = await waitForEvent(threadFront, "paused");
|
|
Assert.equal(packet.frame.where.line, result.line);
|
|
Assert.equal(packet.why.type, result.type);
|
|
await threadFront[action]();
|
|
}
|