|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 /** |
|
5 * Tests the behavior of the debugger statement. |
|
6 */ |
|
7 |
|
8 const TAB_URL = EXAMPLE_URL + "doc_inline-debugger-statement.html"; |
|
9 |
|
10 let gClient; |
|
11 |
|
12 function test() { |
|
13 if (!DebuggerServer.initialized) { |
|
14 DebuggerServer.init(() => true); |
|
15 DebuggerServer.addBrowserActors(); |
|
16 } |
|
17 |
|
18 let transport = DebuggerServer.connectPipe(); |
|
19 gClient = new DebuggerClient(transport); |
|
20 gClient.connect((aType, aTraits) => { |
|
21 is(aType, "browser", |
|
22 "Root actor should identify itself as a browser."); |
|
23 |
|
24 addTab(TAB_URL) |
|
25 .then(() => attachTabActorForUrl(gClient, TAB_URL)) |
|
26 .then(testEarlyDebuggerStatement) |
|
27 .then(testDebuggerStatement) |
|
28 .then(closeConnection) |
|
29 .then(finish) |
|
30 .then(null, aError => { |
|
31 ok(false, "Got an error: " + aError.message + "\n" + aError.stack); |
|
32 }); |
|
33 }); |
|
34 } |
|
35 |
|
36 function testEarlyDebuggerStatement([aGrip, aResponse]) { |
|
37 let deferred = promise.defer(); |
|
38 |
|
39 let onPaused = function(aEvent, aPacket) { |
|
40 ok(false, "Pause shouldn't be called before we've attached!"); |
|
41 deferred.reject(); |
|
42 }; |
|
43 |
|
44 gClient.addListener("paused", onPaused); |
|
45 |
|
46 // This should continue without nesting an event loop and calling |
|
47 // the onPaused hook, because we haven't attached yet. |
|
48 let debuggee = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject; |
|
49 debuggee.runDebuggerStatement(); |
|
50 |
|
51 gClient.removeListener("paused", onPaused); |
|
52 |
|
53 // Now attach and resume... |
|
54 gClient.request({ to: aResponse.threadActor, type: "attach" }, () => { |
|
55 gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { |
|
56 ok(true, "Pause wasn't called before we've attached."); |
|
57 deferred.resolve([aGrip, aResponse]); |
|
58 }); |
|
59 }); |
|
60 |
|
61 return deferred.promise; |
|
62 } |
|
63 |
|
64 function testDebuggerStatement([aGrip, aResponse]) { |
|
65 let deferred = promise.defer(); |
|
66 |
|
67 gClient.addListener("paused", (aEvent, aPacket) => { |
|
68 gClient.request({ to: aResponse.threadActor, type: "resume" }, () => { |
|
69 ok(true, "The pause handler was triggered on a debugger statement."); |
|
70 deferred.resolve(); |
|
71 }); |
|
72 }); |
|
73 |
|
74 // Reach around the debugging protocol and execute the debugger statement. |
|
75 let debuggee = gBrowser.selectedTab.linkedBrowser.contentWindow.wrappedJSObject; |
|
76 debuggee.runDebuggerStatement(); |
|
77 } |
|
78 |
|
79 function closeConnection() { |
|
80 let deferred = promise.defer(); |
|
81 gClient.close(deferred.resolve); |
|
82 return deferred.promise; |
|
83 } |
|
84 |
|
85 registerCleanupFunction(function() { |
|
86 removeTab(gBrowser.selectedTab); |
|
87 gClient = null; |
|
88 }); |
|
89 |