|
1 /* Any copyright is dedicated to the Public Domain. |
|
2 http://creativecommons.org/publicdomain/zero/1.0/ */ |
|
3 |
|
4 /** |
|
5 * Tests that enteredFrame packets are sent on frame entry and |
|
6 * exitedFrame packets are sent on frame exit. Tests that the "name" |
|
7 * trace type works for function declarations. |
|
8 */ |
|
9 |
|
10 var gDebuggee; |
|
11 var gClient; |
|
12 var gTraceClient; |
|
13 |
|
14 function run_test() |
|
15 { |
|
16 initTestTracerServer(); |
|
17 gDebuggee = addTestGlobal("test-tracer-actor"); |
|
18 gClient = new DebuggerClient(DebuggerServer.connectPipe()); |
|
19 gClient.connect(function() { |
|
20 attachTestTab(gClient, "test-tracer-actor", function(aResponse, aTabClient) { |
|
21 gClient.attachTracer(aResponse.traceActor, function(aResponse, aTraceClient) { |
|
22 gTraceClient = aTraceClient; |
|
23 test_enter_exit_frame(); |
|
24 }); |
|
25 }); |
|
26 }); |
|
27 do_test_pending(); |
|
28 } |
|
29 |
|
30 function test_enter_exit_frame() |
|
31 { |
|
32 let tracesSeen = 0; |
|
33 let traceNames = []; |
|
34 let traceStopped = promise.defer(); |
|
35 |
|
36 gClient.addListener("traces", function onTraces(aEvent, { traces }) { |
|
37 for (let t of traces) { |
|
38 tracesSeen++; |
|
39 |
|
40 if (t.type == "enteredFrame") { |
|
41 do_check_eq(t.type, "enteredFrame", |
|
42 'enteredFrame response should have type "enteredFrame"'); |
|
43 do_check_eq(typeof t.sequence, "number", |
|
44 'enteredFrame response should have sequence number'); |
|
45 do_check_true(!isNaN(t.sequence), |
|
46 'enteredFrame sequence should be a number'); |
|
47 do_check_eq(typeof t.name, "string", |
|
48 'enteredFrame response should have function name'); |
|
49 traceNames[t.sequence] = t.name; |
|
50 } else { |
|
51 do_check_eq(t.type, "exitedFrame", |
|
52 'exitedFrame response should have type "exitedFrame"'); |
|
53 do_check_eq(typeof t.sequence, "number", |
|
54 'exitedFrame response should have sequence number'); |
|
55 do_check_true(!isNaN(t.sequence), |
|
56 'exitedFrame sequence should be a number'); |
|
57 } |
|
58 |
|
59 if (tracesSeen == 10) { |
|
60 gClient.removeListener("traces", onTraces); |
|
61 traceStopped.resolve(); |
|
62 } |
|
63 } |
|
64 }); |
|
65 |
|
66 start_trace() |
|
67 .then(eval_code) |
|
68 .then(() => traceStopped.promise) |
|
69 .then(stop_trace) |
|
70 .then(function() { |
|
71 do_check_eq(traceNames[2], "baz", |
|
72 'Should have entered "baz" frame in third packet'); |
|
73 do_check_eq(traceNames[3], "bar", |
|
74 'Should have entered "bar" frame in fourth packet'); |
|
75 do_check_eq(traceNames[4], "foo", |
|
76 'Should have entered "foo" frame in fifth packet'); |
|
77 finishClient(gClient); |
|
78 }); |
|
79 } |
|
80 |
|
81 function start_trace() |
|
82 { |
|
83 let deferred = promise.defer(); |
|
84 gTraceClient.startTrace(["name"], null, function() { deferred.resolve(); }); |
|
85 return deferred.promise; |
|
86 } |
|
87 |
|
88 function eval_code() |
|
89 { |
|
90 gDebuggee.eval("(" + function() { |
|
91 function foo() { |
|
92 return; |
|
93 } |
|
94 function bar() { |
|
95 return foo(); |
|
96 } |
|
97 function baz() { |
|
98 return bar(); |
|
99 } |
|
100 baz(); |
|
101 } + ")()"); |
|
102 } |
|
103 |
|
104 function stop_trace() |
|
105 { |
|
106 let deferred = promise.defer(); |
|
107 gTraceClient.stopTrace(null, function() { deferred.resolve(); }); |
|
108 return deferred.promise; |
|
109 } |