1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
/**
* Verify that when two of the "same" source are loaded concurrently (like e10s
* frame scripts), breakpoints get hit in scripts defined by all sources.
*/
var gDebuggee;
var gClient;
var gTraceClient;
var gThreadClient;
function run_test()
{
initTestDebuggerServer();
gDebuggee = addTestGlobal("test-breakpoints");
gClient = new DebuggerClient(DebuggerServer.connectPipe());
gClient.connect().then(function () {
attachTestThread(gClient, "test-breakpoints", testBreakpoint);
});
do_test_pending();
}
const testBreakpoint = Task.async(function* (threadResponse, tabClient, threadClient, tabResponse) {
evalSetupCode();
// Load the test source once.
evalTestCode();
equal(gDebuggee.functions.length, 1,
"The test code should have added a function.");
// Set a breakpoint in the test source.
const source = yield getSource(threadClient, "test.js");
const [response, bpClient] = yield setBreakpoint(source, {
line: 3
});
ok(!response.error, "Shouldn't get an error setting the BP.");
ok(!response.actualLocation,
"Shouldn't get an actualLocation, the location we provided was good.");
const bpActor = response.actor;
yield resume(threadClient);
// Load the test source again.
evalTestCode();
equal(gDebuggee.functions.length, 2,
"The test code should have added another function.");
// Should hit our breakpoint in a script defined by the first instance of the
// test source.
const bpPause1 = yield executeOnNextTickAndWaitForPause(gDebuggee.functions[0],
gClient);
equal(bpPause1.why.type, "breakpoint",
"Should pause because of hitting our breakpoint (not debugger statement).");
equal(bpPause1.why.actors[0], bpActor,
"And the breakpoint actor should be correct.");
const dbgStmtPause1 = yield executeOnNextTickAndWaitForPause(() => resume(threadClient),
gClient);
equal(dbgStmtPause1.why.type, "debuggerStatement",
"And we should hit the debugger statement after the pause.");
yield resume(threadClient);
// Should also hit our breakpoint in a script defined by the second instance
// of the test source.
const bpPause2 = yield executeOnNextTickAndWaitForPause(gDebuggee.functions[1],
gClient);
equal(bpPause2.why.type, "breakpoint",
"Should pause because of hitting our breakpoint (not debugger statement).");
equal(bpPause2.why.actors[0], bpActor,
"And the breakpoint actor should be correct.");
const dbgStmtPause2 = yield executeOnNextTickAndWaitForPause(() => resume(threadClient),
gClient);
equal(dbgStmtPause2.why.type, "debuggerStatement",
"And we should hit the debugger statement after the pause.");
finishClient(gClient);
});
function evalSetupCode() {
Cu.evalInSandbox(
"this.functions = [];",
gDebuggee,
"1.8",
"setup.js",
1
);
}
function evalTestCode() {
Cu.evalInSandbox(
` // 1
this.functions.push(function () { // 2
var setBreakpointHere = 1; // 3
debugger; // 4
}); // 5
`,
gDebuggee,
"1.8",
"test.js",
1
);
}
|