1a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Copyright 2008 the V8 project authors. All rights reserved.
2a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Redistribution and use in source and binary forms, with or without
3a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// modification, are permitted provided that the following conditions are
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// met:
5a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions of source code must retain the above copyright
7a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       notice, this list of conditions and the following disclaimer.
8a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Redistributions in binary form must reproduce the above
9a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       copyright notice, this list of conditions and the following
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       disclaimer in the documentation and/or other materials provided
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       with the distribution.
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//     * Neither the name of Google Inc. nor the names of its
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       contributors may be used to endorse or promote products derived
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//       from this software without specific prior written permission.
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block//
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
28a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Flags: --expose-debug-as debug
29a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// The functions used for testing backtraces. They are at the top to make the
30a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// testing of source line/column easier.
31a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction f(x, y) {
32a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  a=1;
33a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvar m = function() {
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  new f(1);
37a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction g() {
40a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  m();
41a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
42a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
43a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
44a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Get the Debug object exposed from the debug context global object.
45a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug = debug.Debug
46a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
47a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlocklistenerCalled = false;
48a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockexception = false;
49a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
50a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
51a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction ParsedResponse(json) {
52a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.response_ = eval('(' + json + ')');
53a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  this.refs_ = [];
54a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  if (this.response_.refs) {
55a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    for (var i = 0; i < this.response_.refs.length; i++) {
56a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      this.refs_[this.response_.refs[i].handle] = this.response_.refs[i];
57a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
58a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  }
59a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
60a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
61a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
62a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockParsedResponse.prototype.response = function() {
63a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.response_;
64a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
65a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
66a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
67a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockParsedResponse.prototype.body = function() {
68a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.response_.body;
69a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
70a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
71a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
723ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve BlockParsedResponse.prototype.running = function() {
733ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block  return this.response_.running;
743ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block}
753ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
763ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
77a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockParsedResponse.prototype.lookup = function(handle) {
78a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  return this.refs_[handle];
79a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
80a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
81a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
82a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockfunction listener(event, exec_state, event_data, data) {
83a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  try {
84a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    if (event == Debug.DebugEvent.Break) {
85a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // The expected backtrace is
86a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 0: f
87a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 1: m
88a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 2: g
89a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // 3: [anonymous]
90a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
91a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var response;
92a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var backtrace;
93a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var frame;
94a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var source;
95a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
963ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      var dcp;
973ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // New copy of debug command processor paused state.
983ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      dcp = exec_state.debugCommandProcessor(false);
99a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
100a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Get the backtrace.
101a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var json;
102a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"backtrace"}'
103a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var resp = dcp.processDebugJSONRequest(json);
104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(resp);
105a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      backtrace = response.body();
106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(0, backtrace.fromFrame);
107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, backtrace.toFrame);
108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, backtrace.totalFrames);
109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var frames = backtrace.frames;
110a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, frames.length);
111a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for (var i = 0; i < frames.length; i++) {
112a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        assertEquals('frame', frames[i].type);
113a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(0, frames[0].index);
115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("f", response.lookup(frames[0].func.ref).name);
116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, frames[1].index);
117a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frames[1].func.ref).name);
118a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("m", response.lookup(frames[1].func.ref).inferredName);
119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frames[2].index);
120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("g", response.lookup(frames[2].func.ref).name);
121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, frames[3].index);
122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frames[3].func.ref).name);
1233ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      assertFalse(response.running(), "expected not running");
124a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
125a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Get backtrace with two frames.
126a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":1,"toFrame":3}}'
127a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      backtrace = response.body();
129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, backtrace.fromFrame);
130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, backtrace.toFrame);
131a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, backtrace.totalFrames);
132a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var frames = backtrace.frames;
133a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frames.length);
134a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for (var i = 0; i < frames.length; i++) {
135a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        assertEquals('frame', frames[i].type);
136a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
137a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, frames[0].index);
138a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frames[0].func.ref).name);
139a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("m", response.lookup(frames[0].func.ref).inferredName);
140a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frames[1].index);
141a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("g", response.lookup(frames[1].func.ref).name);
142a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
143a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Get backtrace with bottom two frames.
144a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"backtrace","arguments":{"fromFrame":0,"toFrame":2, "bottom":true}}'
145a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      backtrace = response.body();
147a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, backtrace.fromFrame);
148a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, backtrace.toFrame);
149a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(4, backtrace.totalFrames);
150a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      var frames = backtrace.frames;
151a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frames.length);
152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      for (var i = 0; i < frames.length; i++) {
153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block        assertEquals('frame', frames[i].type);
154a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      }
155a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frames[0].index);
156a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("g", response.lookup(frames[0].func.ref).name);
157a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, frames[1].index);
158a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frames[1].func.ref).name);
159a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
160a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Get the individual frames.
161a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"frame"}'
162a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      frame = response.body();
164a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(0, frame.index);
165a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("f", response.lookup(frame.func.ref).name);
166a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertTrue(frame.constructCall);
167a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(31, frame.line);
168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, frame.column);
169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frame.arguments.length);
170a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('x', frame.arguments[0].name);
171a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('number', response.lookup(frame.arguments[0].value.ref).type);
172a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('y', frame.arguments[1].name);
174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type);
175a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
176a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":0}}'
177a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
178a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      frame = response.body();
179a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(0, frame.index);
180a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("f", response.lookup(frame.func.ref).name);
181a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(31, frame.line);
182a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, frame.column);
183a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frame.arguments.length);
184a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('x', frame.arguments[0].name);
185a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('number', response.lookup(frame.arguments[0].value.ref).type);
186a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, response.lookup(frame.arguments[0].value.ref).value);
187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('y', frame.arguments[1].name);
188a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals('undefined', response.lookup(frame.arguments[1].value.ref).type);
189a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
190a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":1}}'
191a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
192a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      frame = response.body();
193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(1, frame.index);
194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frame.func.ref).name);
195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("m", response.lookup(frame.func.ref).inferredName);
196a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertFalse(frame.constructCall);
197a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(35, frame.line);
198a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(2, frame.column);
199a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(0, frame.arguments.length);
200a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
201a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"frame","arguments":{"number":3}}'
202a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
203a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      frame = response.body();
204a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(3, frame.index);
205a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("", response.lookup(frame.func.ref).name);
206a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
207a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Source slices for the individual frames (they all refer to this script).
208a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"source",' +
209a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              '"arguments":{"frame":0,"fromLine":30,"toLine":32}}'
210a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
211a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      source = response.body();
212a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("function f(x, y) {", source.source.substring(0, 18));
213a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(30, source.fromLine);
214a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(32, source.toLine);
215a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
216a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"source",' +
217a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              '"arguments":{"frame":1,"fromLine":31,"toLine":32}}'
218a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
219a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      source = response.body();
220a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("  a=1;", source.source.substring(0, 6));
221a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(31, source.fromLine);
222a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(32, source.toLine);
223a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
224a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"source",' +
225a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              '"arguments":{"frame":2,"fromLine":35,"toLine":36}}'
226a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
227a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      source = response.body();
228a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals("  new f(1);", source.source.substring(0, 11));
229a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(35, source.fromLine);
230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(36, source.toLine);
231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Test line interval way beyond this script will result in an error.
233a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"source",' +
234a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block              '"arguments":{"frame":0,"fromLine":10000,"toLine":20000}}'
235a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
236a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertFalse(response.response().success);
237a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      // Test without arguments.
239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      json = '{"seq":0,"type":"request","command":"source"}'
240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      response = new ParsedResponse(dcp.processDebugJSONRequest(json));
241a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      source = response.body();
242a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      assertEquals(Debug.findScript(f).source, source.source);
243a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
2443ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // New copy of debug command processor in running state.
2453ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      dcp = exec_state.debugCommandProcessor(true);
2463ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // Get the backtrace.
2473ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      json = '{"seq":0,"type":"request","command":"backtrace"}'
2483ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      resp = dcp.processDebugJSONRequest(json);
2493ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      response = new ParsedResponse(resp);
2503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // It might be argueable, but we expect response to have body when
2513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      // not suspended
2523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      assertTrue(!!response.body(), "response should be null");
2533ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block      assertTrue(response.running(), "expected running");
2543ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block
255a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block      listenerCalled = true;
256a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    }
257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  } catch (e) {
258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block    exception = e
259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  };
260a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block};
261a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
262a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Add the debug event listener.
263a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.setListener(listener);
264a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
265a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Set a break point and call to invoke the debug event listener.
266a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockDebug.setBreakPoint(f, 0, 0);
267a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockg();
268a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
269a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Make sure that the debug event listener vas invoked.
270a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertFalse(exception, "exception in listener");
271a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockassertTrue(listenerCalled);
272a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
273