diff --git a/devtools/server/actors/source.js b/devtools/server/actors/source.js index 99db7ea9952d..9f326ff73475 100644 --- a/devtools/server/actors/source.js +++ b/devtools/server/actors/source.js @@ -795,12 +795,15 @@ let SourceActor = ActorClassWithSpec(sourceSpec, { // 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). diff --git a/devtools/server/tests/unit/test_breakpoint-22.js b/devtools/server/tests/unit/test_breakpoint-22.js new file mode 100644 index 000000000000..75fe8aa5a20a --- /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); +} diff --git a/devtools/server/tests/unit/xpcshell.ini b/devtools/server/tests/unit/xpcshell.ini index 3f8efab1b068..73dd1d9edf3b 100644 --- a/devtools/server/tests/unit/xpcshell.ini +++ b/devtools/server/tests/unit/xpcshell.ini @@ -130,6 +130,7 @@ 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]