tor-browser

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

Debugger-onNativeCall-02.js (1295B)


      1 // Test that the onNativeCall hook can control the call's behavior.
      2 
      3 var g = newGlobal({newCompartment: true});
      4 var dbg = Debugger(g);
      5 var gdbg = dbg.addDebuggee(g);
      6 
      7 g.eval(`
      8 var x = [];
      9 Object.defineProperty(x, "a", {
     10  get: print,
     11  set: print,
     12 });
     13 var rv;
     14 function f() {
     15  x.a++;
     16  try {
     17    rv = x.push(4);
     18  } catch (e) {
     19    throw "rethrowing";
     20  }
     21 }
     22 `);
     23 
     24 for (let i = 0; i < 5; i++) {
     25  g.f();
     26 }
     27 
     28 for (let i = 0; i < 5; i++) {
     29  // Test terminating execution.
     30  dbg.onNativeCall = (callee, reason) => {
     31    return null;
     32  };
     33  const len = g.x.length;
     34  let v = gdbg.executeInGlobal(`f()`);
     35  assertEq(v, null);
     36  assertEq(g.x.length, len);
     37 
     38  // Test throwing an exception.
     39  dbg.onNativeCall = (callee, reason) => {
     40    return { throw: "throwing" };
     41  };
     42  v = gdbg.executeInGlobal(`f()`);
     43  assertEq(v.throw, "throwing");
     44 
     45  // Test throwing an exception #2.
     46  dbg.onNativeCall = (callee, reason) => {
     47    if (callee.name == "push") {
     48      return { throw: "throwing" };
     49    }
     50  };
     51  v = gdbg.executeInGlobal(`f()`);
     52  assertEq(v.throw, "rethrowing");
     53 
     54  // Test returning a different value from the native.
     55  dbg.onNativeCall = (callee, reason) => {
     56    return { return: "value" };
     57  };
     58  v = gdbg.executeInGlobal(`f()`);
     59  assertEq(v.return, undefined);
     60  assertEq(g.rv, "value");
     61 }