tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Frame-offset-05.js (2235B)


      1 // frame.offset works in async generator fns.
      2 load(libdir + "asserts.js");
      3 
      4 var g = newGlobal({ newCompartment: true });
      5 var dbg = new Debugger(g);
      6 g.eval(`
      7 async function* f() {
      8  yield 11;
      9  yield 21;
     10  yield 31;
     11 }
     12 `);
     13 
     14 const ranges = [];
     15 let script;
     16 let frame;
     17 dbg.onEnterFrame = function(f) {
     18  if (frame) {
     19    assertEq(f, frame);
     20    assertEq(f.script, script);
     21  } else {
     22    frame = f;
     23    script = f.script;
     24    assertEq(frame instanceof Debugger.Frame, true);
     25    assertEq(script instanceof Debugger.Script, true);
     26  }
     27 
     28  const range = [script.getOffsetMetadata(frame.offset).lineNumber, null];
     29  ranges.push(range);
     30  f.onPop = () => {
     31    range[1] = script.getOffsetMetadata(frame.offset).lineNumber;
     32  };
     33 };
     34 
     35 (async () => {
     36  let promise;
     37  const it = g.f();
     38 
     39  assertEq(ranges.length, 1);
     40  assertEq(ranges[0][0], 2);
     41  assertEq(ranges[0][1], 2);
     42  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 2);
     43 
     44  promise = it.next();
     45 
     46  assertEq(ranges.length, 2);
     47  assertEq(ranges[1][0], 2);
     48  assertEq(ranges[1][1], 3);
     49  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 3);
     50 
     51  await promise;
     52 
     53  assertEq(ranges.length, 3);
     54  assertEq(ranges[2][0], 3);
     55  assertEq(ranges[2][1], 3);
     56  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 3);
     57 
     58  promise = it.next();
     59 
     60  assertEq(ranges.length, 4);
     61  assertEq(ranges[3][0], 3);
     62  assertEq(ranges[3][1], 4);
     63  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 4);
     64 
     65  await promise;
     66 
     67  assertEq(ranges.length, 5);
     68  assertEq(ranges[4][0], 4);
     69  assertEq(ranges[4][1], 4);
     70  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 4);
     71 
     72  promise = it.next();
     73 
     74  assertEq(ranges.length, 6);
     75  assertEq(ranges[5][0], 4);
     76  assertEq(ranges[5][1], 5);
     77  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 5);
     78 
     79  await promise;
     80 
     81  assertEq(ranges.length, 7);
     82  assertEq(ranges[6][0], 5);
     83  assertEq(ranges[6][1], 5);
     84  assertEq(script.getOffsetMetadata(frame.offset).lineNumber, 5);
     85 
     86  promise = it.next();
     87 
     88  assertEq(ranges.length, 8);
     89  assertEq(ranges[7][0], 5);
     90  assertEq(ranges[7][1], 6);
     91 
     92  // The frame has finished evaluating, so the callee is no longer accessible.
     93  assertThrowsInstanceOf(() => frame.offset, Error);
     94 })();