summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/unit/test_breakpoint-20.js
blob: b70282dae45b12d35980333a740dacbbc8e6a115 (plain)
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
  );
}