Bug 1333219 - Allow setBreakpoint on server fail when script is absent. r=jlast draft
authorYury Delendik <ydelendik@mozilla.com>
Mon, 30 Jan 2017 13:53:42 -0600
changeset 494422 caba187788fd05566871827936fe6140d244946e
parent 494263 b7e42143bbbc9dc3e5c05bd1e93b6485ce1d0ad4
child 548093 a4445e0157b389d4a8a877ff662b39f3f1892a4c
push id48024
push userydelendik@mozilla.com
push dateTue, 07 Mar 2017 02:33:46 +0000
reviewersjlast
bugs1333219
milestone55.0a1
Bug 1333219 - Allow setBreakpoint on server fail when script is absent. r=jlast MozReview-Commit-ID: 4CDeTToUPfi
devtools/server/actors/source.js
devtools/server/tests/unit/test_breakpoint-22.js
devtools/server/tests/unit/xpcshell.ini
--- 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]