tor-browser

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

bug1773650.js (1275B)


      1 // This approach is based on async/debugger-reject-after-fulfill.js
      2 function searchLastBreakpointBeforeReturn(declCode, callCode) {
      3  const g = newGlobal({ newCompartment: true });
      4  const dbg = new Debugger(g);
      5  g.eval(declCode);
      6 
      7  let offset = 0;
      8  dbg.onEnterFrame = function(frame) {
      9    if (frame.callee && frame.callee.name == "f") {
     10      frame.onStep = () => {
     11        if (!g.returning) {
     12          return undefined;
     13        }
     14 
     15        offset = frame.offset;
     16        return undefined;
     17      };
     18    }
     19  };
     20  g.eval(callCode);
     21  drainJobQueue();
     22  assertEq(offset != 0, true);
     23  return offset;
     24 }
     25 
     26 let declaration = `
     27  var returning = false;
     28  async function f() {
     29    try {
     30      throw undefined;
     31    } catch (exc) {
     32      try {
     33        return (returning = true, "expected");
     34      } catch {}
     35    }
     36  }`;
     37 let call = "var p = f();"
     38 
     39 let offset = searchLastBreakpointBeforeReturn(declaration, call);
     40 
     41 let g = newGlobal({ newCompartment: true });
     42 let dbg = new Debugger(g);
     43 g.eval(declaration);
     44 
     45 dbg.onEnterFrame = function(frame) {
     46  if (frame.callee && frame.callee.name == "f") {
     47    dbg.onEnterFrame = undefined;
     48    frame.script.setBreakpoint(offset, {
     49      hit() {
     50        return { throw: "unexpected" };
     51      }
     52    });
     53  }
     54 };
     55 
     56 try {
     57  g.eval(call);
     58 } catch {}