tor-browser

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

Frame-environment-06.js (2299B)


      1 // |jit-test| error:all-jobs-completed-successfully
      2 // Test that Debugger.Frame.prototype.environment works on suspended
      3 // async function.
      4 
      5 load(libdir + "asserts.js");
      6 
      7 const g = newGlobal({ newCompartment: true });
      8 const dbg = new Debugger(g);
      9 
     10 g.eval(`
     11 var resolveTop;
     12 var resolveBlock;
     13 var resolveLoop;
     14 var resolveCatch;
     15 
     16 async function f() {
     17  var promises = {
     18    top: new Promise(r => { resolveTop = r; }),
     19    block: new Promise(r => { resolveBlock = r; }),
     20    loop: new Promise(r => { resolveLoop = r; }),
     21    catch: new Promise(r => { resolveCatch = r; }),
     22  };
     23 
     24  var value = 42;
     25  Promise.resolve().then(resolveTop);
     26  await promises.top;
     27  {
     28    let block = "block";
     29    Promise.resolve().then(resolveBlock);
     30    await promises.block;
     31  }
     32  for (let loop of ["loop"]) {
     33    Promise.resolve().then(resolveLoop);
     34    await promises.loop;
     35  }
     36  try {
     37    throw "err";
     38  } catch (err) {
     39    Promise.resolve().then(resolveCatch);
     40    await promises.catch;
     41  }
     42  return value;
     43 }
     44 `);
     45 
     46 const waitForOnPop = frame => new Promise(r => {
     47  assertEq(frame.onPop, undefined);
     48  frame.onPop = () => {
     49    frame.onPop = undefined;
     50    r();
     51  };
     52 });
     53 
     54 let frame;
     55 dbg.onEnterFrame = f => {
     56  frame = f;
     57  dbg.onEnterFrame = undefined;
     58 };
     59 
     60 (async () => {
     61  const promise = g.f();
     62 
     63  assertEq(!!frame, true);
     64  assertEq(
     65    JSON.stringify(frame.environment.names()),
     66    JSON.stringify(["arguments", "promises", "value"])
     67  );
     68  assertEq(frame.environment.getVariable("value"), 42);
     69 
     70  frame.environment.setVariable("value", 43);
     71 
     72  assertEq(frame.environment.getVariable("value"), 43);
     73 
     74  await waitForOnPop(frame);
     75 
     76  assertEq(
     77    JSON.stringify(frame.environment.names()),
     78    JSON.stringify(["block"])
     79  );
     80  assertEq(frame.environment.getVariable("block"), "block");
     81 
     82  await waitForOnPop(frame);
     83 
     84  assertEq(
     85    JSON.stringify(frame.environment.names()),
     86    JSON.stringify(["loop"])
     87  );
     88  assertEq(frame.environment.getVariable("loop"), "loop");
     89 
     90  await waitForOnPop(frame);
     91 
     92  assertEq(
     93    JSON.stringify(frame.environment.names()),
     94    JSON.stringify(["err"])
     95  );
     96  assertEq(frame.environment.getVariable("err"), "err");
     97 
     98  const result = await promise;
     99 
    100  assertEq(result, 43);
    101 
    102  assertThrowsInstanceOf(() => frame.environment, Error);
    103 
    104  throw "all-jobs-completed-successfully";
    105 })();