tor-browser

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

Source-introductionScript-01.js (3836B)


      1 // Dynamically generated sources should have their introduction script and
      2 // offset set correctly.
      3 
      4 var g = newGlobal({newCompartment: true});
      5 var dbg = new Debugger;
      6 var gDO = dbg.addDebuggee(g);
      7 var log;
      8 
      9 // Direct eval, while the frame is live.
     10 dbg.onDebuggerStatement = function (frame) {
     11  log += 'd';
     12  var source = frame.script.source;
     13  var introducer = frame.older;
     14  assertEq(source.introductionScript, introducer.script);
     15  assertEq(source.introductionOffset, introducer.offset);
     16 };
     17 log = '';
     18 g.eval('\n\neval("\\n\\ndebugger;");');
     19 assertEq(log, 'd');
     20 
     21 // Direct eval, after the frame has been popped.
     22 var introducer, introduced;
     23 dbg.onDebuggerStatement = function (frame) {
     24  log += 'de1';
     25  introducer = frame.script;
     26  dbg.onDebuggerStatement = function (frame) {
     27    log += 'de2';
     28    introduced = frame.script.source;
     29  };
     30 };
     31 log = '';
     32 g.evaluate('debugger; eval("\\n\\ndebugger;");', { lineNumber: 1812 });
     33 assertEq(log, 'de1de2');
     34 assertEq(introduced.introductionScript, introducer);
     35 assertEq(introducer.getOffsetLocation(introduced.introductionOffset).lineNumber, 1812);
     36 
     37 // Indirect eval, while the frame is live.
     38 dbg.onDebuggerStatement = function (frame) {
     39  log += 'd';
     40  var source = frame.script.source;
     41  var introducer = frame.older;
     42  assertEq(source.introductionScript, introducer.script);
     43  assertEq(source.introductionOffset, introducer.offset);
     44 };
     45 log = '';
     46 g.eval('\n\n(0,eval)("\\n\\ndebugger;");');
     47 assertEq(log, 'd');
     48 
     49 // Indirect eval, after the frame has been popped.
     50 var introducer, introduced;
     51 dbg.onDebuggerStatement = function (frame) {
     52  log += 'de1';
     53  introducer = frame.script;
     54  dbg.onDebuggerStatement = function (frame) {
     55    log += 'de2';
     56    introduced = frame.script.source;
     57  };
     58 };
     59 log = '';
     60 g.evaluate('debugger; (0,eval)("\\n\\ndebugger;");', { lineNumber: 1066 });
     61 assertEq(log, 'de1de2');
     62 assertEq(introduced.introductionScript, introducer);
     63 assertEq(introducer.getOffsetLocation(introduced.introductionOffset).lineNumber, 1066);
     64 
     65 // Function constructor.
     66 dbg.onDebuggerStatement = function (frame) {
     67  log += 'o';
     68  var outerScript = frame.script;
     69  var outerOffset = frame.offset;
     70  dbg.onDebuggerStatement = function (frame) {
     71    log += 'i';
     72    var source = frame.script.source;
     73    assertEq(source.introductionScript, outerScript);
     74    assertEq(outerScript.getOffsetLocation(source.introductionOffset).lineNumber,
     75             outerScript.getOffsetLocation(outerOffset).lineNumber);
     76  };
     77 };
     78 log = '';
     79 g.eval('\n\n\ndebugger; Function("debugger;")()');
     80 assertEq(log, 'oi');
     81 
     82 // Function constructor, after the the introduction call's frame has been
     83 // popped.
     84 var introducer;
     85 dbg.onDebuggerStatement = function (frame) {
     86  log += 'F2';
     87  introducer = frame.script;
     88 };
     89 log = '';
     90 var fDO = gDO.executeInGlobal('debugger; Function("origami;")', { lineNumber: 1685 }).return;
     91 var source = fDO.script.source;
     92 assertEq(log, 'F2');
     93 assertEq(source.introductionScript, introducer);
     94 assertEq(introducer.getOffsetLocation(source.introductionOffset).lineNumber, 1685);
     95 
     96 // If the introduction script is in a different global from the script it
     97 // introduced, we don't record it.
     98 dbg.onDebuggerStatement = function (frame) {
     99  log += 'x';
    100  var source = frame.script.source;
    101  assertEq(source.introductionScript, undefined);
    102  assertEq(source.introductionOffset, undefined);
    103 };
    104 log = '';
    105 g.eval('debugger;'); // introduction script is this top-level script
    106 assertEq(log, 'x');
    107 
    108 // If the code is introduced by a function that doesn't provide
    109 // introduction information, that shouldn't be a problem.
    110 dbg.onDebuggerStatement = function (frame) {
    111  log += 'x';
    112  var source = frame.script.source;
    113  assertEq(source.introductionScript, undefined);
    114  assertEq(source.introductionOffset, undefined);
    115 };
    116 log = '';
    117 g.eval('evaluate("debugger;", { lineNumber: 1729 });');
    118 assertEq(log, 'x');