// Calls to 'eval', etc. by JS primitives get attributed to the point of // the primitive's call. var g = newGlobal({newCompartment: true}); var dbg = new Debugger; var gDO = dbg.addDebuggee(g); var log = ''; function outerHandler(frame) { log += 'o'; var outerScript = frame.script; dbg.onDebuggerStatement = function (frame) { log += 'i'; var source = frame.script.source; var introScript = source.introductionScript; assertEq(introScript, outerScript); assertEq(introScript.getOffsetLocation(source.introductionOffset).lineNumber, 1234); }; }; log = ''; dbg.onDebuggerStatement = outerHandler; g.evaluate('debugger; ["debugger;"].map(eval)', { lineNumber: 1234 }); assertEq(log, 'oi'); log = ''; dbg.onDebuggerStatement = outerHandler; g.evaluate('debugger; "debugger;".replace(/.*/, eval);', { lineNumber: 1234 }); assertEq(log, 'oi'); // If the call takes place in another global, however, we don't record the // introduction script. log = ''; dbg.onDebuggerStatement = function (frame) { log += 'd'; assertEq(frame.script.source.introductionScript, undefined); assertEq(frame.script.source.introductionOffset, undefined); }; ["debugger;"].map(g.eval); "debugger;".replace(/.*/, g.eval); assertEq(log, 'dd');