summaryrefslogtreecommitdiffstats
path: root/dom/streams/test/xpcshell/bug-1387503-2.js
blob: 1678b46649cc7419cbb45df9eed06c735559f7be (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
// Test uncatchable error when a stream's queuing strategy's size() method is called.
/* global newGlobal */

let fnFinished = false;
let g;
add_task(async function test() {
  // Make `debugger;` raise an uncatchable exception.
  g = newGlobal();
  g.parent = this;
  g.hit = false;
  g.info = info;
  g.eval(`
    var dbg = new Debugger(parent);
    dbg.onDebuggerStatement = (_frame, exc) => {hit = true; info("hit"); return null};
`);

  async function fn() {
    // Await once to postpone the uncatchable error until we're running inside
    // a reaction job. We don't want the rest of the test to be terminated.
    // (`drainJobQueue` catches uncatchable errors!)
    await 1;

    try {
      // Create a stream with a strategy whose .size() method raises an
      // uncatchable exception, and have it call that method.
      new ReadableStream(
        {
          start(controller) {
            controller.enqueue("FIRST POST"); // this calls .size()
          },
        },
        {
          size() {
            // eslint-disable-next-line no-debugger
            debugger;
          },
        }
      );
    } finally {
      fnFinished = true;
    }
  }

  fn()
    .then(() => info("Resolved"))
    .catch(() => info("Rejected"));
});

add_task(() => {
  equal(g.hit, true, "We hit G");
  equal(fnFinished, false, "We didn't hit the finally block");
});