tor-browser

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

onEnterFrame-async-resumption-07.js (1873B)


      1 // A Debugger can't force-return from the first onEnterFrame for an async generator.
      2 
      3 ignoreUnhandledRejections();
      4 
      5 let g = newGlobal({newCompartment: true});
      6 g.eval(`async function* f(x) { await x; return "ponies"; }`);
      7 
      8 let dbg = new Debugger;
      9 dbg.uncaughtExceptionHook = exc => {}; // ignore errors
     10 let gw = dbg.addDebuggee(g);
     11 let hits = 0;
     12 let resumption = undefined;
     13 
     14 dbg.onEnterFrame = frame => {
     15    dbg.onEnterFrame = undefined;
     16    assertEq(frame.type, "call");
     17    assertEq(frame.callee.name, "f");
     18    frame.onPop = completion => {
     19        hits++;
     20    };
     21 
     22    // Try to force-return. It's too early. This results in a call to the
     23    // uncaughtExceptionHook but is otherwise ignored.
     24    return {return: "rainbows"};
     25 };
     26 let it = g.f(0);    // onPop #1: the initial yield
     27 assertEq(hits, 1);
     28 let p = it.next();  // onPop #2: await x
     29 assertEq(hits, 2);
     30 drainJobQueue();    // onPop #3: return "ponies", #4: the final yield
     31 assertEq(hits, 4);
     32 
     33 let pw = gw.makeDebuggeeValue(p);
     34 assertEq(pw.isPromise, true);
     35 assertEq(pw.promiseState, "fulfilled");
     36 assertEq(pw.promiseValue.getProperty("value").return, "ponies");
     37 assertEq(pw.promiseValue.getProperty("done").return, true);
     38 
     39 // ----
     40 
     41 g.eval(`async function* f2(x) { await x; return "moar ponies"; }`);
     42 
     43 let savedAsyncGen = undefined;
     44 dbg.onEnterFrame = frame => {
     45    dbg.onEnterFrame = undefined;
     46    assertEq(frame.type, "call");
     47    assertEq(frame.callee.name, "f2");
     48    frame.onPop = completion => {
     49        if (savedAsyncGen === undefined) {
     50            savedAsyncGen = completion.return;
     51        }
     52    };
     53 };
     54 let it2 = g.f2(123);
     55 let p2 = it2.next();
     56 drainJobQueue();
     57 
     58 let pw2 = gw.makeDebuggeeValue(p2);
     59 assertEq(pw2.isPromise, true);
     60 assertEq(pw2.promiseState, "fulfilled");
     61 assertEq(pw2.promiseValue.getProperty("value").return, "moar ponies");
     62 assertEq(pw2.promiseValue.getProperty("done").return, true);