|
1 // Dynamically generated sources should have their introduction script and |
|
2 // offset set correctly. |
|
3 |
|
4 var g = newGlobal(); |
|
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.getOffsetLine(introduced.introductionOffset), 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.getOffsetLine(introduced.introductionOffset), 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.getOffsetLine(source.introductionOffset), |
|
75 outerScript.getOffsetLine(outerOffset)); |
|
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.evalInGlobal('debugger; Function("origami;")', { lineNumber: 1685 }).return; |
|
91 var source = fDO.script.source; |
|
92 assertEq(log, 'F2'); |
|
93 assertEq(source.introductionScript, introducer); |
|
94 assertEq(introducer.getOffsetLine(source.introductionOffset), 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'); |