tor-browser

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

Frame-asyncPromise-04.js (2613B)


      1 // Test the promise property on async generator function frames.
      2 
      3 load(libdir + 'asserts.js');
      4 
      5 var g = newGlobal({ newCompartment: true });
      6 var dbg = Debugger(g);
      7 g.eval(`
      8 async function* f() {
      9  debugger;
     10  yield 42;
     11  debugger;
     12  return 50
     13 }
     14 `);
     15 
     16 let frame;
     17 const promises = [];
     18 dbg.onEnterFrame = function(f) {
     19  frame = f;
     20  promises.push(["enter", frame.asyncPromise]);
     21 
     22  frame.onPop = function() {
     23    promises.push(["leave", frame.asyncPromise]);
     24  };
     25 
     26  dbg.onDebuggerStatement = function(f) {
     27    assertEq(f, frame);
     28    promises.push(["dbg", frame.asyncPromise]);
     29  };
     30 };
     31 
     32 
     33 (async () => {
     34  const it = g.f();
     35 
     36  // Promise is null until initial iteration.
     37  assertEq(frame.asyncPromise, null);
     38 
     39  assertEq(promises.length, 2);
     40  assertEq(promises[0][0], "enter");
     41  assertEq(promises[0][1], null);
     42 
     43  assertEq(promises[1][0], "leave");
     44  assertEq(promises[1][1], null);
     45 
     46 
     47  const result1Promise = it.next();
     48 
     49  const frameIt1Promise = frame.asyncPromise;
     50  assertEq(frameIt1Promise instanceof Debugger.Object, true);
     51  assertEq(frameIt1Promise.unsafeDereference(), result1Promise);
     52 
     53  assertEq(promises.length, 5);
     54  assertEq(promises[2][0], "enter");
     55  assertEq(promises[2][1], frameIt1Promise);
     56 
     57  assertEq(promises[3][0], "dbg");
     58  assertEq(promises[3][1], frameIt1Promise);
     59 
     60  assertEq(promises[4][0], "leave");
     61  assertEq(promises[4][1], frameIt1Promise);
     62 
     63  await result1Promise;
     64 
     65  // Iteration step has fully completed, so promise state has been cleared.
     66  assertEq(frame.asyncPromise, null);
     67 
     68  assertEq(promises.length, 7);
     69  assertEq(promises[5][0], "enter");
     70  assertEq(promises[5][1], frameIt1Promise);
     71 
     72  assertEq(promises[6][0], "leave");
     73  assertEq(promises[6][1], frameIt1Promise);
     74 
     75 
     76  const result2Promise = it.next();
     77 
     78  const frameIt2Promise = frame.asyncPromise;
     79  assertEq(frameIt2Promise instanceof Debugger.Object, true);
     80  assertEq(frameIt2Promise.unsafeDereference(), result2Promise);
     81  assertEq(frameIt1Promise !== frameIt2Promise, true);
     82 
     83  assertEq(promises.length, 10);
     84  assertEq(promises[7][0], "enter");
     85  assertEq(promises[7][1], frameIt2Promise);
     86 
     87  assertEq(promises[8][0], "dbg");
     88  assertEq(promises[8][1], frameIt2Promise);
     89 
     90  assertEq(promises[9][0], "leave");
     91  assertEq(promises[9][1], frameIt2Promise);
     92 
     93  await result2Promise;
     94 
     95  // Frame has terminated, so accessing the property throws.
     96  assertThrowsInstanceOf(() => frame.asyncPromise, Error);
     97 
     98  assertEq(promises.length, 12);
     99  assertEq(promises[10][0], "enter");
    100  assertEq(promises[10][1], frameIt2Promise);
    101 
    102  assertEq(promises[11][0], "leave");
    103  assertEq(promises[11][1], frameIt2Promise);
    104 })();