Commit c44a0646 authored by Miriam's avatar Miriam
Browse files

Bug 1587497 - Ensure debugger advances to next line when encountering breakpoint and watchpoint.

Differential Revision: https://phabricator.services.mozilla.com/D48721

--HG--
extra : moz-landing-system : lando
parent cdc7c1a8
......@@ -139,6 +139,12 @@ const proto = {
desc.value = v;
}),
get: this.obj.makeDebuggeeValue(() => {
const frame = this.thread.dbg.getNewestFrame();
if (!this.thread.hasMoved(frame, "getWatchpoint")) {
return false;
}
pauseAndRespond("getWatchpoint");
return desc.value;
}),
......@@ -150,6 +156,12 @@ const proto = {
configurable: desc.configurable,
enumerable: desc.enumerable,
set: this.obj.makeDebuggeeValue(v => {
const frame = this.thread.dbg.getNewestFrame();
if (!this.thread.hasMoved(frame, "setWatchpoint")) {
return;
}
pauseAndRespond("setWatchpoint");
desc.value = v;
}),
......
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/* eslint-disable no-shadow */
"use strict";
/*
Test that debugger advances instead of pausing twice on the
same line when encountering both a watchpoint and a breakpoint.
*/
add_task(
threadFrontTest(async args => {
await testBreakpointAndSetWatchpoint(args);
await testBreakpointAndGetWatchpoint(args);
await testLoops(args);
})
);
// Test that we advance to the next line when a location
// has both a breakpoint and set watchpoint.
async function testBreakpointAndSetWatchpoint({ threadFront, debuggee }) {
function evaluateTestCode(debuggee) {
/* eslint-disable */
Cu.evalInSandbox(
` // 1
function stopMe(obj) { // 2
debugger; // 3
obj.a = 2; // 4
debugger; // 5
} //
stopMe({a: 1})`,
debuggee,
"1.8",
"test_watchpoint-02.js",
);
/* eslint-disable */
}
const packet = await executeOnNextTickAndWaitForPause(
() => evaluateTestCode(debuggee),
threadFront
);
info("Test that we pause on the debugger statement.");
Assert.equal(packet.frame.where.line, 3);
Assert.equal(packet.why.type, "debuggerStatement");
info("Add set watchpoint.");
const args = packet.frame.arguments;
const obj = args[0];
const objClient = threadFront.pauseGrip(obj);
await objClient.addWatchpoint("a", "obj.a", "set");
info("Add breakpoint.");
const source = await getSourceById(threadFront, packet.frame.where.actor);
const location = {
sourceUrl: source.url,
line: 4,
};
threadFront.setBreakpoint(
location,
{},
);
info("Test that pause occurs on breakpoint.");
const packet2 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet2.frame.where.line, 4);
Assert.equal(packet2.why.type, "breakpoint");
const packet3 = await resumeAndWaitForPause(threadFront);
info("Test that we pause on the second debugger statement.");
Assert.equal(packet3.frame.where.line, 5);
Assert.equal(packet3.why.type, "debuggerStatement");
info("Remove breakpoint and finish.");
threadFront.removeBreakpoint(
location,
{}
);
await resume(threadFront);
}
// Test that we advance to the next line when a location
// has both a breakpoint and get watchpoint.
async function testBreakpointAndGetWatchpoint({ threadFront, debuggee }) {
function evaluateTestCode(debuggee) {
/* eslint-disable */
Cu.evalInSandbox(
` // 1
function stopMe(obj) { // 2
debugger; // 3
obj.a + 4; // 4
debugger; // 5
} //
stopMe({a: 1})`,
debuggee,
"1.8",
"test_watchpoint-02.js",
);
/* eslint-disable */
}
const packet = await executeOnNextTickAndWaitForPause(
() => evaluateTestCode(debuggee),
threadFront
);
info("Test that we pause on the debugger statement.");
Assert.equal(packet.frame.where.line, 3);
info("Add get watchpoint.");
const args = packet.frame.arguments;
const obj = args[0];
const objClient = threadFront.pauseGrip(obj);
await objClient.addWatchpoint("a", "obj.a", "get");
info("Add breakpoint.");
const source = await getSourceById(threadFront, packet.frame.where.actor);
const location = {
sourceUrl: source.url,
line: 4,
};
threadFront.setBreakpoint(
location,
{},
);
info("Test that pause occurs on breakpoint.");
const packet2 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet2.frame.where.line, 4);
Assert.equal(packet2.why.type, "breakpoint");
const packet3 = await resumeAndWaitForPause(threadFront);
info("Test that we pause on the second debugger statement.");
Assert.equal(packet3.frame.where.line, 5);
Assert.equal(packet3.why.type, "debuggerStatement");
info("Remove breakpoint and finish.");
threadFront.removeBreakpoint(
location,
{}
);
await resume(threadFront);
}
// Test that we can pause multiple times
// on the same line for a watchpoint.
async function testLoops({ threadFront, debuggee, targetFront }) {
async function evaluateJS(input) {
const consoleFront = await targetFront.getFront("console");
const { result } = await consoleFront.evaluateJSAsync(input, {
thread: threadFront.actor,
frameActor: packet.frame.actor,
});
return result;
}
function evaluateTestCode(debuggee) {
/* eslint-disable */
Cu.evalInSandbox(
` // 1
function stopMe(obj) { // 2
let i = 0; // 3
debugger; // 4
while (i++ < 2) { // 5
obj.a = 2; // 6
} // 7
debugger; // 8
} //
stopMe({a: 1})`,
debuggee,
"1.8",
"test_watchpoint-02.js",
);
/* eslint-disable */
}
const packet = await executeOnNextTickAndWaitForPause(
() => evaluateTestCode(debuggee),
threadFront
);
info("Test that we pause on the debugger statement.");
Assert.equal(packet.frame.where.line, 4);
Assert.equal(packet.why.type, "debuggerStatement");
info("Add set watchpoint.");
const args = packet.frame.arguments;
const obj = args[0];
const objClient = threadFront.pauseGrip(obj);
await objClient.addWatchpoint("a", "obj.a", "set");
info("Test that watchpoint triggers pause on set.");
const packet2 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet2.frame.where.line, 6);
Assert.equal(packet2.why.type, "setWatchpoint");
let result = await evaluateJS("obj.a");
Assert.equal(result, 1);
info("Test that watchpoint triggers pause on set (2nd time).");
const packet3 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet3.frame.where.line, 6);
Assert.equal(packet3.why.type, "setWatchpoint");
let result2 = await evaluateJS("obj.a");
Assert.equal(result2, 2);
info("Test that we pause on second debugger statement.");
const packet4 = await resumeAndWaitForPause(threadFront);
Assert.equal(packet4.frame.where.line, 8);
Assert.equal(packet4.why.type, "debuggerStatement");
await resume(threadFront);
}
......@@ -217,6 +217,7 @@ skip-if = true # breakpoint sliding is not supported bug 1525685
[test_source-04.js]
[test_wasm_source-01.js]
[test_watchpoint-01.js]
[test_watchpoint-02.js]
[test_breakpoint-actor-map.js]
skip-if = true # tests for breakpoint actors are obsolete bug 1524374
[test_unsafeDereference.js]
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment