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