forked from mirrors/gecko-dev
122 lines
3.6 KiB
JavaScript
122 lines
3.6 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
/* 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.
|
|
*/
|
|
|
|
var gDebuggee;
|
|
var gClient;
|
|
var gThreadClient;
|
|
var gCallback;
|
|
|
|
function run_test() {
|
|
run_test_with_server(DebuggerServer, do_test_finished);
|
|
do_test_pending();
|
|
}
|
|
|
|
function run_test_with_server(server, callback) {
|
|
gCallback = callback;
|
|
initTestDebuggerServer(server);
|
|
gDebuggee = addTestGlobal("test-breakpoints", server);
|
|
gClient = new DebuggerClient(server.connectPipe());
|
|
gClient.connect().then(function () {
|
|
attachTestTabAndResume(gClient, "test-breakpoints",
|
|
function (response, tabClient, threadClient) {
|
|
gThreadClient = threadClient;
|
|
test_breakpoints_columns();
|
|
});
|
|
});
|
|
}
|
|
|
|
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
|
|
};
|
|
|
|
function test_breakpoints_columns() {
|
|
gClient.addOneTimeListener("paused", set_breakpoints);
|
|
|
|
Components.utils.evalInSandbox(code, gDebuggee, "1.8", "http://example.com/", 1);
|
|
}
|
|
|
|
function set_breakpoints(event, packet) {
|
|
let first, second;
|
|
let source = gThreadClient.source(packet.frame.where.source);
|
|
|
|
source.setBreakpoint(firstLocation, function ({ error, actualLocation },
|
|
breakpointClient) {
|
|
do_check_true(!error, "Should not get an error setting the breakpoint");
|
|
do_check_true(!actualLocation, "Should not get an actualLocation");
|
|
first = breakpointClient;
|
|
|
|
source.setBreakpoint(secondLocation, function ({ error, actualLocation },
|
|
breakpointClient) {
|
|
do_check_true(!error, "Should not get an error setting the breakpoint");
|
|
do_check_true(!actualLocation, "Should not get an actualLocation");
|
|
second = breakpointClient;
|
|
|
|
test_different_actors(first, second);
|
|
});
|
|
});
|
|
}
|
|
|
|
function test_different_actors(first, second) {
|
|
do_check_neq(first.actor, second.actor,
|
|
"Each breakpoint should have a different actor");
|
|
test_remove_one(first, second);
|
|
}
|
|
|
|
function test_remove_one(first, second) {
|
|
first.remove(function ({error}) {
|
|
do_check_true(!error, "Should not get an error removing a breakpoint");
|
|
|
|
let hitSecond;
|
|
gClient.addListener("paused", function _onPaused(event, {why, frame}) {
|
|
if (why.type == "breakpoint") {
|
|
hitSecond = true;
|
|
do_check_eq(why.actors.length, 1,
|
|
"Should only be paused because of one breakpoint actor");
|
|
do_check_eq(why.actors[0], second.actor,
|
|
"Should be paused because of the correct breakpoint actor");
|
|
do_check_eq(frame.where.line, secondLocation.line,
|
|
"Should be at the right line");
|
|
do_check_eq(frame.where.column, secondLocation.column,
|
|
"Should be at the right column");
|
|
gThreadClient.resume();
|
|
return;
|
|
}
|
|
|
|
if (why.type == "debuggerStatement") {
|
|
gClient.removeListener("paused", _onPaused);
|
|
do_check_true(hitSecond,
|
|
"We should still hit `second`, but not `first`.");
|
|
|
|
gClient.close().then(gCallback);
|
|
return;
|
|
}
|
|
|
|
do_check_true(false, "Should never get here");
|
|
});
|
|
|
|
gThreadClient.resume(() => gDebuggee.foo());
|
|
});
|
|
}
|