tor-browser

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

Script-01.js (2687B)


      1 // We get the same Debugger.Script object instance each time we ask.
      2 
      3 var global = newGlobal({newCompartment: true});
      4 global.eval('function f() { debugger; }');
      5 global.eval('function g() { debugger; }');
      6 
      7 var debug = new Debugger(global);
      8 
      9 function evalAndNoteScripts(prog) {
     10    var scripts = {};
     11    debug.onDebuggerStatement = function(frame) {
     12        if (frame.type == "call")
     13            assertEq(frame.script, frame.callee.script);
     14        scripts.frame = frame.script;
     15        if (frame.arguments[0])
     16            scripts.argument = frame.arguments[0].script;
     17    };
     18    global.eval(prog);
     19    return scripts;
     20 }
     21 
     22 // If we create a frame for a function and pass it as a value, those should
     23 // both yield the same Debugger.Script instance.
     24 var scripts = evalAndNoteScripts('f(f)');
     25 assertEq(scripts.frame, scripts.argument);
     26 var fScript = scripts.argument;
     27 
     28 // If we call a second time, we should still get the same instance.
     29 scripts = evalAndNoteScripts('f(f)');
     30 assertEq(scripts.frame, fScript);
     31 assertEq(scripts.argument, fScript);
     32 
     33 // If we call with a different argument, we should get a different Debugger.Script.
     34 scripts = evalAndNoteScripts('f(g)');
     35 assertEq(scripts.frame !== scripts.argument, true);
     36 assertEq(scripts.frame, fScript);
     37 var gScript = scripts.argument;
     38 
     39 // See if we can get g via the frame.
     40 scripts = evalAndNoteScripts('g(f)');
     41 assertEq(scripts.frame !== scripts.argument, true);
     42 assertEq(scripts.frame,    gScript);
     43 assertEq(scripts.argument, fScript);
     44 
     45 // Different closures made from the same 'function' expression should yield
     46 // the same script.
     47 global.eval('function gen1(x) { return function clo(y) { return x+y; }; }');
     48 global.eval('var clo1 = gen1(42);');
     49 global.eval('var clo2 = gen1("smoot");');
     50 var scripts1 = evalAndNoteScripts('f(clo1)');
     51 var scripts2 = evalAndNoteScripts('f(clo2)');
     52 assertEq(scripts1.argument, scripts2.argument);
     53 
     54 // Different closures made from the same 'function' declaration should yield
     55 // the same script.
     56 global.eval('function gen2(x) { function clo(y) { return x+y; }; return clo; }');
     57 global.eval('var clo1 = gen2(42);');
     58 global.eval('var clo2 = gen2("smoot");');
     59 var scripts1 = evalAndNoteScripts('f(clo1)');
     60 var scripts2 = evalAndNoteScripts('f(clo2)');
     61 assertEq(scripts1.argument, scripts2.argument);
     62 
     63 // Different closures made from the same 'function' statement should yield
     64 // the same script.
     65 global.eval('function gen3(x) { if (true) { function clo(y) { return x+y; }; return clo; } }');
     66 global.eval('var clo1 = gen3(42);');
     67 global.eval('var clo2 = gen3("smoot");');
     68 var scripts1 = evalAndNoteScripts('f(clo1)');
     69 var scripts2 = evalAndNoteScripts('f(clo2)');
     70 assertEq(scripts1.argument, scripts2.argument);