tor-browser

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

Frame-onStack-07.js (1481B)


      1 // frame.onStack is false for generator frames popped due to exception or termination.
      2 
      3 load(libdir + "/asserts.js");
      4 
      5 function test(when, what) {
      6    let g = newGlobal({newCompartment: true});
      7    g.eval("function* f(x) { yield x; }");
      8 
      9    let dbg = new Debugger;
     10    let gw = dbg.addDebuggee(g);
     11    let fw = gw.getOwnPropertyDescriptor("f").value;
     12 
     13    let t = 0;
     14    let poppedFrame;
     15 
     16    function tick(frame) {
     17        if (frame.callee == fw) {
     18            if (t == when) {
     19                poppedFrame = frame;
     20                dbg.onEnterFrame = undefined;
     21                frame.onPop = undefined;
     22                return what;
     23            }
     24            t++;
     25        }
     26        return undefined;
     27    }
     28 
     29    dbg.onDebuggerStatement = frame => {
     30        dbg.onEnterFrame = frame => {
     31            frame.onPop = function() {
     32                return tick(this);
     33            };
     34            return tick(frame);
     35        };
     36        let result = frame.eval("for (let _ of f(0)) {}");
     37        if (result && "stack" in result) {
     38          result.stack = true;
     39        }
     40        assertDeepEq(result, what);
     41    };
     42    g.eval("debugger;");
     43 
     44    assertEq(t, when);
     45    assertEq(poppedFrame.onStack, false);
     46    assertErrorMessage(() => poppedFrame.older,
     47                       Error,
     48                       "Debugger.Frame is not on stack or suspended");
     49 }
     50 
     51 for (let when = 0; when < 6; when++) {
     52    for (let what of [null, {throw: "fit", stack: true}]) {
     53        test(when, what);
     54    }
     55 }