Bug 1436151 - Breakpoints at the beginning of a line are missed. r=jimb

--HG--
extra : rebase_source : 247b33c30e746b81edc78a8e3bdcb99ae97f598e
This commit is contained in:
Jason Laster 2018-02-14 12:02:00 +02:00
Родитель a2d70d4acc
Коммит 2e8b477080
3 изменённых файлов: 100 добавлений и 12 удалений

Просмотреть файл

@ -907,7 +907,15 @@ let SourceActor = ActorClassWithSpec(sourceSpec, {
entryPoints.push({ script, offsets }); entryPoints.push({ script, offsets });
} }
} }
} else {
if (entryPoints.length > 0) {
setBreakpointAtEntryPoints(actor, entryPoints);
return true;
}
return false;
}
// This is a column breakpoint, so we are interested in all column // This is a column breakpoint, so we are interested in all column
// offsets that correspond to the given line *and* column number. // offsets that correspond to the given line *and* column number.
for (let script of scripts) { for (let script of scripts) {
@ -921,11 +929,26 @@ let SourceActor = ActorClassWithSpec(sourceSpec, {
} }
} }
} }
// If we don't find any matching entrypoints, then
// we should check to see if the breakpoint is to the left of the first offset.
if (entryPoints.length === 0) {
for (let script of scripts) {
let columnToOffsetMap = script
.getAllColumnOffsets()
.filter(({ lineNumber }) => {
return lineNumber === generatedLine;
});
if (columnToOffsetMap.length > 0) {
let { columnNumber: column, offset } = columnToOffsetMap[0];
if (generatedColumn < column) {
entryPoints.push({ script, offsets: [offset] });
}
}
}
} }
if (entryPoints.length === 0) {
return false;
}
setBreakpointAtEntryPoints(actor, entryPoints); setBreakpointAtEntryPoints(actor, entryPoints);
return true; return true;
} }

Просмотреть файл

@ -0,0 +1,64 @@
"use strict";
var SOURCE_URL = getFileUrl("setBreakpoint-on-column.js");
function run_test() {
return Task.spawn(function* () {
do_test_pending();
DebuggerServer.registerModule("xpcshell-test/testactors");
DebuggerServer.init(() => true);
let global = createTestGlobal("test");
DebuggerServer.addTestGlobal(global);
let client = new DebuggerClient(DebuggerServer.connectPipe());
yield connect(client);
let { tabs } = yield listTabs(client);
let tab = findTab(tabs, "test");
let [, tabClient] = yield attachTab(client, tab);
let [, threadClient] = yield attachThread(tabClient);
yield resume(threadClient);
let promise = waitForNewSource(threadClient, SOURCE_URL);
loadSubScript(SOURCE_URL, global);
let { source } = yield promise;
let sourceClient = threadClient.source(source);
let location = { line: 4, column: 2 };
let [packet, breakpointClient] = yield setBreakpoint(
sourceClient,
location
);
Assert.ok(!packet.isPending);
Assert.equal(false, "actualLocation" in packet);
packet = yield executeOnNextTickAndWaitForPause(function () {
Cu.evalInSandbox("f()", global);
}, client);
Assert.equal(packet.type, "paused");
let why = packet.why;
Assert.equal(why.type, "breakpoint");
Assert.equal(why.actors.length, 1);
Assert.equal(why.actors[0], breakpointClient.actor);
let frame = packet.frame;
let where = frame.where;
Assert.equal(where.source.actor, source.actor);
Assert.equal(where.line, location.line);
Assert.equal(where.column, 6);
let variables = frame.environment.bindings.variables;
Assert.equal(variables.a.value.type, "undefined");
Assert.equal(variables.b.value.type, "undefined");
Assert.equal(variables.c.value.type, "undefined");
yield resume(threadClient);
yield close(client);
do_test_finished();
});
}

Просмотреть файл

@ -222,6 +222,7 @@ reason = bug 937197
[test_get-executable-lines-source-map.js] [test_get-executable-lines-source-map.js]
[test_xpcshell_debugging.js] [test_xpcshell_debugging.js]
support-files = xpcshell_debugging_script.js support-files = xpcshell_debugging_script.js
[test_setBreakpoint-at-the-beginning-of-a-line.js]
[test_setBreakpoint-on-column.js] [test_setBreakpoint-on-column.js]
[test_setBreakpoint-on-column-in-gcd-script.js] [test_setBreakpoint-on-column-in-gcd-script.js]
[test_setBreakpoint-on-column-with-no-offsets-at-end-of-line.js] [test_setBreakpoint-on-column-with-no-offsets-at-end-of-line.js]