|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 /** |
|
5 * Bug 978019: Setting a breakpoint on the last line of a Debugger.Script and |
|
6 * reloading should still hit the breakpoint. |
|
7 */ |
|
8 |
|
9 const TAB_URL = EXAMPLE_URL + "doc_breakpoints-break-on-last-line-of-script-on-reload.html"; |
|
10 const CODE_URL = EXAMPLE_URL + "code_breakpoints-break-on-last-line-of-script-on-reload.js"; |
|
11 |
|
12 function test() { |
|
13 let gPanel, gDebugger, gThreadClient, gEvents; |
|
14 |
|
15 initDebugger(TAB_URL).then(([aTab, aDebuggee, aPanel]) => { |
|
16 gPanel = aPanel; |
|
17 gDebugger = gPanel.panelWin; |
|
18 gThreadClient = gDebugger.gThreadClient; |
|
19 gEvents = gDebugger.EVENTS; |
|
20 |
|
21 Task.spawn(function* () { |
|
22 try { |
|
23 |
|
24 // Refresh and hit the debugger statement before the location we want to |
|
25 // set our breakpoints. We have to pause before the breakpoint locations |
|
26 // so that GC doesn't get a chance to kick in and collect the IIFE's |
|
27 // script, which would causes us to receive a 'noScript' error from the |
|
28 // server when we try to set the breakpoints. |
|
29 const [paused, ] = yield promise.all([ |
|
30 waitForThreadEvents(gPanel, "paused"), |
|
31 reloadActiveTab(gPanel, gEvents.SOURCE_SHOWN), |
|
32 ]); |
|
33 |
|
34 is(paused.why.type, "debuggerStatement"); |
|
35 |
|
36 // Set our breakpoints. |
|
37 const [bp1, bp2, bp3] = yield promise.all([ |
|
38 setBreakpoint({ |
|
39 url: CODE_URL, |
|
40 line: 3 |
|
41 }), |
|
42 setBreakpoint({ |
|
43 url: CODE_URL, |
|
44 line: 4 |
|
45 }), |
|
46 setBreakpoint({ |
|
47 url: CODE_URL, |
|
48 line: 5 |
|
49 }) |
|
50 ]); |
|
51 |
|
52 // Refresh and hit the debugger statement again. |
|
53 yield promise.all([ |
|
54 reloadActiveTab(gPanel, gEvents.SOURCE_SHOWN), |
|
55 waitForCaretAndScopes(gPanel, 1) |
|
56 ]); |
|
57 |
|
58 // And we should hit the breakpoints as we resume. |
|
59 yield promise.all([ |
|
60 doResume(gPanel), |
|
61 waitForCaretAndScopes(gPanel, 3) |
|
62 ]); |
|
63 yield promise.all([ |
|
64 doResume(gPanel), |
|
65 waitForCaretAndScopes(gPanel, 4) |
|
66 ]); |
|
67 yield promise.all([ |
|
68 doResume(gPanel), |
|
69 waitForCaretAndScopes(gPanel, 5) |
|
70 ]); |
|
71 |
|
72 // Clean up the breakpoints. |
|
73 yield promise.all([ |
|
74 rdpInvoke(bp1, bp1.remove), |
|
75 rdpInvoke(bp2, bp1.remove), |
|
76 rdpInvoke(bp3, bp1.remove), |
|
77 ]); |
|
78 |
|
79 yield resumeDebuggerThenCloseAndFinish(gPanel); |
|
80 |
|
81 } catch (e) { |
|
82 DevToolsUtils.reportException( |
|
83 "browser_dbg_breakpoints-break-on-last-line-of-script-on-reload.js", |
|
84 e |
|
85 ); |
|
86 ok(false); |
|
87 } |
|
88 }); |
|
89 }); |
|
90 |
|
91 function setBreakpoint(location) { |
|
92 let deferred = promise.defer(); |
|
93 gThreadClient.setBreakpoint(location, ({ error, message }, bpClient) => { |
|
94 if (error) { |
|
95 deferred.reject(error + ": " + message); |
|
96 } |
|
97 deferred.resolve(bpClient); |
|
98 }); |
|
99 return deferred.promise; |
|
100 } |
|
101 } |