Bug 1333219 - Allow setBreakpoint on server fail when script is absent. r=jlast
MozReview-Commit-ID: 4CDeTToUPfi
--- a/devtools/server/actors/source.js
+++ b/devtools/server/actors/source.js
@@ -790,22 +790,25 @@ let SourceActor = ActorClassWithSpec(sou
break;
}
}
// The above loop should never complete. We only did breakpoint sliding
// because we found scripts on the line we started from,
// which means there must be valid entry points somewhere
// within those scripts.
- assert(
- actualLine <= maxLine,
- "Could not find any entry points to set a breakpoint on, " +
- "even though I was told a script existed on the line I started " +
- "the search with."
- );
+ if (actualLine > maxLine) {
+ return promise.reject({
+ error: "noCodeAtLineColumn",
+ message:
+ "Could not find any entry points to set a breakpoint on, " +
+ "even though I was told a script existed on the line I started " +
+ "the search with."
+ });
+ }
// Update the actor to use the new location (reusing a
// previous breakpoint if it already exists on that line).
const actualLocation = new OriginalLocation(originalSourceActor, actualLine);
const existingActor = this.breakpointActorMap.getActor(actualLocation);
this.breakpointActorMap.deleteActor(originalLocation);
if (existingActor) {
actor.delete();
new file mode 100644
--- /dev/null
+++ b/devtools/server/tests/unit/test_breakpoint-22.js
@@ -0,0 +1,77 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Bug 1333219 - make that setBreakpoint fails when script is not found
+ * at the specified line.
+ */
+
+var gDebuggee;
+var gClient;
+var gThreadClient;
+var gCallback;
+
+function run_test()
+{
+ run_test_with_server(DebuggerServer, function () {
+ run_test_with_server(WorkerDebuggerServer, do_test_finished);
+ });
+ do_test_pending();
+}
+
+function run_test_with_server(aServer, aCallback)
+{
+ gCallback = aCallback;
+ initTestDebuggerServer(aServer);
+ gDebuggee = addTestGlobal("test-breakpoints", aServer);
+ gClient = new DebuggerClient(aServer.connectPipe());
+ gClient.connect().then(function () {
+ attachTestTabAndResume(gClient,
+ "test-breakpoints",
+ function (aResponse, aTabClient, aThreadClient) {
+ gThreadClient = aThreadClient;
+ test();
+ });
+ });
+}
+
+const test = Task.async(function* () {
+ // Populate the `ScriptStore` so that we only test that the script
+ // is added through `onNewScript`
+ yield getSources(gThreadClient);
+
+ let packet = yield executeOnNextTickAndWaitForPause(evalCode, gClient);
+ let source = gThreadClient.source(packet.frame.where.source);
+ let location = {
+ line: gDebuggee.line0 + 2
+ };
+
+ let [res, bpClient] = yield setBreakpoint(source, location);
+ ok(!res.error);
+
+ let location2 = {
+ line: gDebuggee.line0 + 5
+ };
+
+ yield source.setBreakpoint(location2).then(_ => {
+ do_throw("no code shall not be found the specified line or below it");
+ }, reason => {
+ do_check_eq(reason.error, "noCodeAtLineColumn");
+ ok(reason.message);
+ });
+
+ yield resume(gThreadClient);
+ finishClient(gClient);
+});
+
+function evalCode() {
+ // Start a new script
+ Components.utils.evalInSandbox(`
+var line0 = Error().lineNumber;
+function some_function() {
+ // breakpoint is valid here -- it slides one line below (line0 + 2)
+}
+debugger;
+// no breakpoint is allowed here (line0 + 5)
+`, gDebuggee);
+}
--- a/devtools/server/tests/unit/xpcshell.ini
+++ b/devtools/server/tests/unit/xpcshell.ini
@@ -125,16 +125,17 @@ skip-if = coverage # bug 1336670
[test_breakpoint-16.js]
[test_breakpoint-17.js]
[test_breakpoint-18.js]
[test_breakpoint-19.js]
skip-if = true
reason = bug 1104838
[test_breakpoint-20.js]
[test_breakpoint-21.js]
+[test_breakpoint-22.js]
[test_conditional_breakpoint-01.js]
[test_conditional_breakpoint-02.js]
[test_conditional_breakpoint-03.js]
[test_eventlooplag_actor.js]
skip-if = true
reason = only ran on B2G
[test_listsources-01.js]
[test_listsources-02.js]