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');