tor-browser

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

Environment-inspectable-01.js (2271B)


      1 // Environments are only inspectable while their globals are debuggees.
      2 
      3 load(libdir + 'asserts.js');
      4 
      5 var g1 = newGlobal({newCompartment: true});
      6 var g2 = newGlobal({newCompartment: true});
      7 g2.g1 = g1;
      8 g1.g2 = g2;
      9 
     10 g1.eval('function f(xf) { return function h(xh) { eval(""); debugger; } }');
     11 g1.eval('var h = f("value of xf");');
     12 
     13 // To ensure that xk gets located on the heap, and thus outlives its stack frame, we
     14 // store a function that captures it here. Kind of a kludge.
     15 g2.eval('var capture;');
     16 g2.eval('function k(xk) { capture = function () { return xk; }; g1.h("value of xh"); }');
     17 
     18 var dbg = new Debugger;
     19 dbg.addDebuggee(g1);
     20 dbg.addDebuggee(g2);
     21 
     22 dbg.onDebuggerStatement = debuggerHandler;
     23 
     24 var log = '';
     25 
     26 g1.eval('g2.k("value of xk");');
     27 
     28 var he, ke, ee;
     29 
     30 function debuggerHandler(frame) {
     31  log += 'd';
     32 
     33  assertEq(frame.type, 'call');
     34  he = frame.environment;
     35 
     36  assertEq(frame.older.type, 'call');
     37  ke = frame.older.environment;
     38 
     39  assertEq(frame.older.older.type, 'eval');
     40  ee = frame.older.older.environment;
     41 
     42  assertEq(he.inspectable, true);
     43  assertEq(he.getVariable('xh'), 'value of xh');
     44  assertEq(he.parent.parent.getVariable('xf'), 'value of xf');
     45  assertEq(ke.inspectable, true);
     46  assertEq(ke.getVariable('xk'), 'value of xk');
     47  assertEq(ee.inspectable, true);
     48  assertEq(ee.type, 'declarative');
     49  assertEq(ee.parent.type, 'object');
     50 
     51  dbg.removeDebuggee(g2);
     52 
     53  assertEq(he.inspectable, true);
     54  assertEq(he.type, 'declarative');
     55  assertEq(ke.inspectable, false);
     56  assertThrowsInstanceOf(() => ke.getVariable('xk'), Error);
     57  assertEq(ee.inspectable, true);
     58  assertEq(ee.type, 'declarative');
     59  assertEq(ee.parent.type, 'object');
     60 
     61  dbg.removeDebuggee(g1);
     62 
     63  assertEq(he.inspectable, false);
     64  assertThrowsInstanceOf(() => he.getVariable('xh'), Error);
     65  assertEq(ke.inspectable, false);
     66  assertThrowsInstanceOf(() => ke.getVariable('xk'), Error);
     67  assertEq(ee.inspectable, false);
     68  assertThrowsInstanceOf(() => ee.type, Error);
     69 }
     70 
     71 assertEq(log, 'd');
     72 
     73 dbg.addDebuggee(g2);
     74 
     75 assertEq(he.inspectable, false);
     76 assertThrowsInstanceOf(() => he.getVariable('xh'), Error);
     77 assertEq(ke.inspectable, true);
     78 assertEq(ke.getVariable('xk'), 'value of xk');
     79 assertEq(ee.inspectable, false);
     80 assertThrowsInstanceOf(() => ee.type, Error);