diff --git a/browser/devtools/debugger/test/Makefile.in b/browser/devtools/debugger/test/Makefile.in index 73db5907d1c..0d7154329fb 100644 --- a/browser/devtools/debugger/test/Makefile.in +++ b/browser/devtools/debugger/test/Makefile.in @@ -58,6 +58,7 @@ MOCHITEST_BROWSER_TESTS = \ browser_dbg_multiple-windows.js \ browser_dbg_menustatus.js \ browser_dbg_bfcache.js \ + browser_dbg_breakpoint-new-script.js \ head.js \ $(NULL) @@ -76,6 +77,7 @@ MOCHITEST_BROWSER_PAGES = \ browser_dbg_iframes.html \ browser_dbg_with-frame.html \ browser_dbg_pause-exceptions.html \ + browser_dbg_breakpoint-new-script.html \ $(NULL) MOCHITEST_BROWSER_FILES_PARTS = MOCHITEST_BROWSER_TESTS MOCHITEST_BROWSER_PAGES diff --git a/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.html b/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.html new file mode 100644 index 00000000000..9968a8aa0d1 --- /dev/null +++ b/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.html @@ -0,0 +1,19 @@ + + + + + + + + + + + diff --git a/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.js b/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.js new file mode 100644 index 00000000000..a5ac45e6bd3 --- /dev/null +++ b/browser/devtools/debugger/test/browser_dbg_breakpoint-new-script.js @@ -0,0 +1,94 @@ +/* vim:set ts=2 sw=2 sts=2 et: */ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +// Bug 771452: make sure that setting a breakpoint in an inline script doesn't +// add it twice. + +const TAB_URL = EXAMPLE_URL + "browser_dbg_breakpoint-new-script.html"; + +var gPane = null; +var gTab = null; +var gDebugger = null; +var gDebuggee = null; + +function test() +{ + debug_tab_pane(TAB_URL, function(aTab, aDebuggee, aPane) { + gTab = aTab; + gPane = aPane; + gDebugger = gPane.contentWindow; + gDebuggee = aDebuggee; + + testAddBreakpoint(); + }); +} + +function testAddBreakpoint() +{ + gDebugger.addEventListener("Debugger:FetchedVariables", function test() { + gDebugger.removeEventListener("Debugger:FetchedVariables", test, false); + executeSoon(function() { + var frames = gDebugger.DebuggerView.StackFrames._frames; + + is(gDebugger.DebuggerController.activeThread.state, "paused", + "The debugger statement was reached."); + + is(frames.querySelectorAll(".dbg-stackframe").length, 1, + "Should have one frame."); + + let location = { url: TAB_URL, line: 9 }; + gPane.addBreakpoint(location, function (aResponse, bpClient) { + testResume(); + }); + }); + }, false); + + gDebuggee.runDebuggerStatement(); +} + +function testResume() +{ + gDebugger.DebuggerController.activeThread.addOneTimeListener("resumed", function test() { + gDebugger.DebuggerController.activeThread.addOneTimeListener("paused", function test() { + executeSoon(testBreakpointHit); + }, false); + + EventUtils.sendMouseEvent({ type: "click" }, + content.document.querySelector("button"), + content.window); + + }); + + gDebugger.DebuggerController.activeThread.resume(); +} + +function testBreakpointHit() +{ + var frames = gDebugger.DebuggerView.StackFrames._frames; + + is(gDebugger.DebuggerController.activeThread.state, "paused", + "The breakpoint was hit."); + + resumeAndFinish(); +} + +function resumeAndFinish() { + let thread = gDebugger.DebuggerController.activeThread; + thread.addOneTimeListener("paused", function test(aEvent, aPacket) { + is(aPacket.why.type, "debuggerStatement", "Execution has advanced to the next line."); + isnot(aPacket.why.type, "breakpoint", "No ghost breakpoint was hit."); + + closeDebuggerAndFinish(); + }); + + thread.resume(); +} + +registerCleanupFunction(function() { + removeTab(gTab); + gPane = null; + gTab = null; + gDebugger = null; + gDebuggee = null; +}); diff --git a/toolkit/devtools/debugger/server/dbg-script-actors.js b/toolkit/devtools/debugger/server/dbg-script-actors.js index f529ded75f0..0a7e05b1f6b 100644 --- a/toolkit/devtools/debugger/server/dbg-script-actors.js +++ b/toolkit/devtools/debugger/server/dbg-script-actors.js @@ -945,11 +945,13 @@ ThreadActor.prototype = { // Set any stored breakpoints. let existing = this._breakpointStore[aScript.url]; if (existing) { + let endLine = aScript.startLine + aScript.lineCount - 1; // Iterate over the lines backwards, so that sliding breakpoints don't // affect the loop. for (let line = existing.length - 1; line >= 0; line--) { let bp = existing[line]; - if (bp) { + // Limit search to the line numbers contained in the new script. + if (bp && line >= aScript.startLine && line <= endLine) { this._setBreakpoint(bp); } }