Source code
Revision control
Copy as Markdown
Other Tools
Test Info: Warnings
- This test gets skipped with pattern: os == 'android' OR true
- Manifest: devtools/server/tests/xpcshell/xpcshell.toml
/* Any copyright is dedicated to the Public Domain.
/* eslint-disable no-shadow */
"use strict";
/**
* Test that when we add 2 breakpoints to the same line at different columns and
* then remove one of them, we don't remove them both.
*/
const code =
"(" +
function (global) {
global.foo = function () {
Math.abs(-1);
Math.log(0.5);
debugger;
};
debugger;
} +
"(this))";
const firstLocation = {
line: 3,
column: 4,
};
const secondLocation = {
line: 3,
column: 18,
};
add_task(
threadFrontTest(({ threadFront, debuggee }) => {
return new Promise(resolve => {
threadFront.on("paused", async packet => {
const [first, second] = await set_breakpoints(packet, threadFront);
test_different_actors(first, second);
await test_remove_one(first, second, threadFront, debuggee);
resolve();
});
});
})
);
async function set_breakpoints(packet, threadFront) {
const source = await getSourceById(threadFront, packet.frame.where.actor);
return new Promise(resolve => {
let first, second;
source.setBreakpoint(firstLocation).then(function ([
{ actualLocation },
breakpointClient,
]) {
Assert.ok(!actualLocation, "Should not get an actualLocation");
first = breakpointClient;
source.setBreakpoint(secondLocation).then(function ([
{ actualLocation },
breakpointClient,
]) {
Assert.ok(!actualLocation, "Should not get an actualLocation");
second = breakpointClient;
resolve([first, second]);
});
});
});
}
function test_different_actors(first, second) {
Assert.notEqual(
first.actor,
second.actor,
"Each breakpoint should have a different actor"
);
}
function test_remove_one(first, second, threadFront, debuggee) {
return new Promise(resolve => {
first.remove(function ({ error }) {
Assert.ok(!error, "Should not get an error removing a breakpoint");
let hitSecond;
threadFront.on("paused", function _onPaused({ why, frame }) {
if (why.type == "breakpoint") {
hitSecond = true;
Assert.equal(
why.actors.length,
1,
"Should only be paused because of one breakpoint actor"
);
Assert.equal(
why.actors[0],
second.actor,
"Should be paused because of the correct breakpoint actor"
);
Assert.equal(
frame.where.line,
secondLocation.line,
"Should be at the right line"
);
Assert.equal(
frame.where.column,
secondLocation.column,
"Should be at the right column"
);
threadFront.resume();
return;
}
if (why.type == "debuggerStatement") {
threadFront.off("paused", _onPaused);
Assert.ok(
hitSecond,
"We should still hit `second`, but not `first`."
);
resolve();
return;
}
Assert.ok(false, "Should never get here");
});
threadFront.resume().then(() => debuggee.foo());
});
});
}