michael@0: /* Any copyright is dedicated to the Public Domain. michael@0: http://creativecommons.org/publicdomain/zero/1.0/ */ michael@0: michael@0: /** michael@0: * Bug 978019: Setting a breakpoint on the last line of a Debugger.Script and michael@0: * reloading should still hit the breakpoint. michael@0: */ michael@0: michael@0: const TAB_URL = EXAMPLE_URL + "doc_breakpoints-break-on-last-line-of-script-on-reload.html"; michael@0: const CODE_URL = EXAMPLE_URL + "code_breakpoints-break-on-last-line-of-script-on-reload.js"; michael@0: michael@0: function test() { michael@0: let gPanel, gDebugger, gThreadClient, gEvents; michael@0: michael@0: initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { michael@0: gPanel = aPanel; michael@0: gDebugger = gPanel.panelWin; michael@0: gThreadClient = gDebugger.gThreadClient; michael@0: gEvents = gDebugger.EVENTS; michael@0: michael@0: Task.spawn(function* () { michael@0: try { michael@0: michael@0: // Refresh and hit the debugger statement before the location we want to michael@0: // set our breakpoints. We have to pause before the breakpoint locations michael@0: // so that GC doesn't get a chance to kick in and collect the IIFE's michael@0: // script, which would causes us to receive a 'noScript' error from the michael@0: // server when we try to set the breakpoints. michael@0: const [paused, ] = yield promise.all([ michael@0: waitForThreadEvents(gPanel, "paused"), michael@0: reloadActiveTab(gPanel, gEvents.SOURCE_SHOWN), michael@0: ]); michael@0: michael@0: is(paused.why.type, "debuggerStatement"); michael@0: michael@0: // Set our breakpoints. michael@0: const [bp1, bp2, bp3] = yield promise.all([ michael@0: setBreakpoint({ michael@0: url: CODE_URL, michael@0: line: 3 michael@0: }), michael@0: setBreakpoint({ michael@0: url: CODE_URL, michael@0: line: 4 michael@0: }), michael@0: setBreakpoint({ michael@0: url: CODE_URL, michael@0: line: 5 michael@0: }) michael@0: ]); michael@0: michael@0: // Refresh and hit the debugger statement again. michael@0: yield promise.all([ michael@0: reloadActiveTab(gPanel, gEvents.SOURCE_SHOWN), michael@0: waitForCaretAndScopes(gPanel, 1) michael@0: ]); michael@0: michael@0: // And we should hit the breakpoints as we resume. michael@0: yield promise.all([ michael@0: doResume(gPanel), michael@0: waitForCaretAndScopes(gPanel, 3) michael@0: ]); michael@0: yield promise.all([ michael@0: doResume(gPanel), michael@0: waitForCaretAndScopes(gPanel, 4) michael@0: ]); michael@0: yield promise.all([ michael@0: doResume(gPanel), michael@0: waitForCaretAndScopes(gPanel, 5) michael@0: ]); michael@0: michael@0: // Clean up the breakpoints. michael@0: yield promise.all([ michael@0: rdpInvoke(bp1, bp1.remove), michael@0: rdpInvoke(bp2, bp1.remove), michael@0: rdpInvoke(bp3, bp1.remove), michael@0: ]); michael@0: michael@0: yield resumeDebuggerThenCloseAndFinish(gPanel); michael@0: michael@0: } catch (e) { michael@0: DevToolsUtils.reportException( michael@0: "browser_dbg_breakpoints-break-on-last-line-of-script-on-reload.js", michael@0: e michael@0: ); michael@0: ok(false); michael@0: } michael@0: }); michael@0: }); michael@0: michael@0: function setBreakpoint(location) { michael@0: let deferred = promise.defer(); michael@0: gThreadClient.setBreakpoint(location, ({ error, message }, bpClient) => { michael@0: if (error) { michael@0: deferred.reject(error + ": " + message); michael@0: } michael@0: deferred.resolve(bpClient); michael@0: }); michael@0: return deferred.promise; michael@0: } michael@0: }