tor-browser

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

Debugger-debuggees-28.js (2269B)


      1 // Test that on->off->on and off->on->off toggles don't crash.
      2 
      3 function addRemove(dbg, g) {
      4  dbg.addDebuggee(g);
      5  var f = dbg.getNewestFrame();
      6  while (f)
      7    f = f.older;
      8  dbg.removeDebuggee(g);
      9 }
     10 
     11 function removeAdd(dbg, g) {
     12  dbg.removeDebuggee(g);
     13  dbg.addDebuggee(g);
     14  var f = dbg.getNewestFrame();
     15  while (f)
     16    f = f.older;
     17 }
     18 
     19 function newGlobalDebuggerPair(toggleSeq) {
     20  var g = newGlobal({newCompartment: true});
     21  var dbg = new Debugger;
     22 
     23  if (toggleSeq == removeAdd)
     24    dbg.addDebuggee(g);
     25 
     26  g.eval("" + function f() { return g(); });
     27  g.eval("" + function g() { return h(); });
     28  g.eval("line0 = Error().lineNumber;");
     29  g.eval("" + function h() {
     30    for (var i = 0; i < 100; i++)
     31      interruptIf(i == 95);
     32    debugger;
     33    return i;
     34  });
     35 
     36  setInterruptCallback(function () { return true; });
     37 
     38  return [g, dbg];
     39 }
     40 
     41 function testInterrupt(toggleSeq) {
     42  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
     43 
     44  setInterruptCallback(function () {
     45    toggleSeq(dbg, g);
     46    return true;
     47  });
     48 
     49  assertEq(g.f(), 100);
     50 }
     51 
     52 function testPrologue(toggleSeq) {
     53  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
     54 
     55  dbg.onEnterFrame = function (f) {
     56    if (f.callee && f.callee.name == "h")
     57      toggleSeq(dbg, g);
     58  };
     59 
     60  assertEq(g.f(), 100);
     61 }
     62 
     63 function testEpilogue(toggleSeq) {
     64  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
     65 
     66  dbg.onEnterFrame = function (f) {
     67    if (f.callee && f.callee.name == "h") {
     68      f.onPop = function () {
     69        toggleSeq(dbg, g);
     70      };
     71    }
     72  };
     73 
     74  assertEq(g.f(), 100);
     75 }
     76 
     77 function testTrap(toggleSeq) {
     78  var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
     79 
     80  dbg.onEnterFrame = function (f) {
     81    if (f.callee && f.callee.name == "h") {
     82      var offs = f.script.getLineOffsets(g.line0 + 2);
     83      assertEq(offs.length > 0, true);
     84      f.script.setBreakpoint(offs[0], { hit: function () {
     85        toggleSeq(dbg, g);
     86      }});
     87    }
     88  };
     89 
     90  assertEq(g.f(), 100);
     91 }
     92 
     93 function testDebugger(toggleSeq) {
     94 var [g, dbg] = newGlobalDebuggerPair(toggleSeq);
     95 
     96  dbg.onDebuggerStatement = function () {
     97    toggleSeq(dbg, g);
     98  };
     99 
    100  assertEq(g.f(), 100);
    101 }
    102 
    103 testInterrupt(addRemove);
    104 testInterrupt(removeAdd);
    105 
    106 testPrologue(removeAdd);
    107 testEpilogue(removeAdd);
    108 testTrap(removeAdd);
    109 testDebugger(removeAdd);