tor-browser

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

debuggerNXHelper.js (2477B)


      1 function testDebuggerHooksNX(dbg, g, testHook) {
      2  function testDebuggerHook(hookName, trigger) {
      3    var hit = false;
      4    dbg[hookName] = () => {
      5      hit = true;
      6      dbg[hookName] = undefined;
      7      testHook(hookName);
      8    };
      9    trigger();
     10    assertEq(hit, true);
     11  }
     12 
     13  // Hooks on the Debugger instance itself.
     14  testDebuggerHook("onDebuggerStatement",
     15                   () => { g.eval("debugger;"); });
     16 
     17  testDebuggerHook("onExceptionUnwind",
     18                   () => {
     19                     try {
     20                       g.eval("throw 42;");
     21                     } catch (e) {
     22                       assertEq(e, 42);
     23                     }
     24                   });
     25 
     26  testDebuggerHook("onNewScript",
     27                   () => { g.eval("42"); });
     28 
     29  testDebuggerHook("onEnterFrame",
     30                   () => { g.eval("(() => {})()"); });
     31 
     32  testDebuggerHook("onNewGlobalObject",
     33                   () => { newGlobal(); });
     34 
     35  if ('Promise' in g) {
     36      testDebuggerHook("onNewPromise",
     37                       () => { new g.Promise(()=>{}); });
     38 
     39      testDebuggerHook("onPromiseSettled",
     40                       () => {
     41                         var p = new g.Promise(()=>{});
     42                         g.settlePromiseNow(p);
     43                       });
     44  }
     45 
     46  // Hooks on frames.
     47  var onStepHit = false;
     48  var onPopHit = false;
     49  dbg.onEnterFrame = (frame) => {
     50    dbg.onEnterFrame = undefined;
     51 
     52    frame.onStep = () => {
     53      onStepHit = true;
     54      frame.onStep = undefined;
     55      testHook("onStep");
     56    };
     57 
     58    frame.onPop = () => {
     59      onPopHit = true;
     60      testHook("onPop");
     61    };
     62  };
     63  g.eval("42");
     64  assertEq(onStepHit, true);
     65 
     66  // We can't actually assert that onPop executed because there's one test
     67  // that tests NX works across a removeDebuggee/addDebuggee toggle. The
     68  // removeDebuggee purges D.F instances, so the onPop won't be called even
     69  // when the global is re-added.
     70  //assertEq(onPopHit, true);
     71 
     72  // Breakpoints
     73  var breakpointHits = 0;
     74  dbg.onDebuggerStatement = (frame) => {
     75    dbg.onDebuggerStatement = undefined;
     76    var line0 = frame.script.getOffsetLocation(frame.offset).lineNumber;
     77    var offs = frame.script.getLineOffsets(line0 + 1);
     78    for (let i = 0; i < offs.length; i++) {
     79      frame.script.setBreakpoint(offs[i], {
     80        hit: () => {
     81          breakpointHits++;
     82          testHook("breakpoint");
     83        }
     84      });
     85    }
     86  };
     87  g.eval(`debugger;
     88         s = 'a'`);
     89  assertEq(breakpointHits >= 1, true);
     90 }