15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)(function () { 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var DebuggerScript = {}; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.PauseOnExceptionsState = { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DontPauseOnExceptions : 0, 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnAllExceptions : 1, 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnUncaughtExceptions: 2 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._pauseOnExceptionsState = DebuggerScript.PauseOnExceptionsState.DontPauseOnExceptions; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Debug.clearBreakOnException(); 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Debug.clearBreakOnUncaughtException(); 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getAfterCompileScript = function(eventData) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DebuggerScript._formatScript(eventData.script_.script_); 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getWorkerScripts = function() 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; ++i) { 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var script = scripts[i]; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Workers don't share same V8 heap now so there is no need to complicate stuff with 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the context id like we do to discriminate between scripts from different pages. 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // However we need to filter out v8 native scripts. 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.context_data && script.context_data === "worker") 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(DebuggerScript._formatScript(script)); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getFunctionScopes = function(fun) 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mirror = MakeMirror(fun); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var count = mirror.scopeCount(); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (count == 0) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < count; i++) { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeMirror = mirror.scope(i); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result[i] = { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) type: scopeMirror.scopeType(), 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) object: DebuggerScript._buildScopeObject(scopeMirror) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getInternalProperties = function(value) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var properties = ObjectMirror.GetInternalProperties(value); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < properties.length; i++) { 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mirror = properties[i]; 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push({ 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name: mirror.name(), 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value: mirror.value().value() 91591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch }); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 96926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.setFunctionVariableValue = function(functionValue, scopeIndex, variableName, newValue) 97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 98926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var mirror = MakeMirror(functionValue); 99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!mirror.isFunction()) 100926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) throw new Error("Function value has incorrect type"); 101926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return DebuggerScript._setScopeVariableValue(mirror, scopeIndex, variableName, newValue); 102926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 104926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript._setScopeVariableValue = function(scopeHolder, scopeIndex, variableName, newValue) 105926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 106926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var scopeMirror = scopeHolder.scope(scopeIndex); 107926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!scopeMirror) 108926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) throw new Error("Incorrect scope index"); 109926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scopeMirror.setVariableValue(variableName, newValue); 110926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return undefined; 111926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 112926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getScripts = function(contextData) 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!contextData) 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var comma = contextData.indexOf(","); 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (comma === -1) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Context data is a string in the following format: 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ("page"|"injected")","<page id> 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var idSuffix = contextData.substring(comma); // including the comma 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; ++i) { 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var script = scripts[i]; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.context_data && script.context_data.lastIndexOf(idSuffix) != -1) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(DebuggerScript._formatScript(script)); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._formatScript = function(script) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lineEnds = script.line_ends; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lineCount = lineEnds.length; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endLine = script.line_offset + lineCount - 1; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endColumn; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // V8 will not count last line if script source ends with \n. 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.source[script.source.length - 1] === '\n') { 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endLine += 1; 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = 0; 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (lineCount === 1) 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = script.source.length + script.column_offset; 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = script.source.length - (lineEnds[lineCount - 2] + 1); 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) id: script.id, 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name: script.nameOrSourceURL(), 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) source: script.source, 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startLine: script.line_offset, 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startColumn: script.column_offset, 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endLine: endLine, 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn: endColumn, 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isContentScript: !!script.context_data && script.context_data.indexOf("injected") == 0 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.setBreakpoint = function(execState, args) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 166e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch var positionAlignment = args.interstatementLocation ? Debug.BreakPositionAlignment.BreakPosition : Debug.BreakPositionAlignment.Statement; 167e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch var breakId = Debug.setScriptBreakPointById(args.sourceID, args.lineNumber, args.columnNumber, args.condition, undefined, positionAlignment); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var locations = Debug.findBreakPointActualLocations(breakId); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!locations.length) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return undefined; 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.lineNumber = locations[0].line; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) args.columnNumber = locations[0].column; 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return breakId.toString(); 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.removeBreakpoint = function(execState, args) 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.findBreakPoint(args.breakpointId, true); 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.pauseOnExceptionsState = function() 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DebuggerScript._pauseOnExceptionsState; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.setPauseOnExceptionsState = function(newState) 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DebuggerScript._pauseOnExceptionsState = newState; 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (DebuggerScript.PauseOnExceptionsState.PauseOnAllExceptions === newState) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.setBreakOnException(); 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearBreakOnException(); 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (DebuggerScript.PauseOnExceptionsState.PauseOnUncaughtExceptions === newState) 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.setBreakOnUncaughtException(); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearBreakOnUncaughtException(); 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 202e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben MurdochDebuggerScript.currentCallFrame = function(execState, maximumLimit) 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var frameCount = execState.frameCount(); 205e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch if (maximumLimit >= 0 && maximumLimit < frameCount) 206e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch frameCount = maximumLimit; 207e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch var topFrame = undefined; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = frameCount - 1; i >= 0; i--) { 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var frameMirror = execState.frame(i); 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) topFrame = DebuggerScript._frameMirrorToJSCallFrame(frameMirror, topFrame); 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return topFrame; 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.stepIntoStatement = function(execState) 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) execState.prepareStep(Debug.StepAction.StepIn, 1); 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.stepOverStatement = function(execState) 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) execState.prepareStep(Debug.StepAction.StepNext, 1); 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.stepOutOfFunction = function(execState) 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) execState.prepareStep(Debug.StepAction.StepOut, 1); 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// Returns array in form: 231591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// [ 0, <v8_result_report> ] in case of success 232591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// or [ 1, <general_error_message>, <compiler_message>, <line_number>, <column_number> ] in case of compile error, numbers are 1-based. 233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// or throws exception with message. 234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.liveEditScriptSource = function(scriptId, newSource, preview) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scriptToEdit = null; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; i++) { 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (scripts[i].id == scriptId) { 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scriptToEdit = scripts[i]; 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!scriptToEdit) 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw("Script not found"); 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var changeLog = []; 248591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch try { 249591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var result = Debug.LiveEdit.SetScriptSource(scriptToEdit, newSource, preview, changeLog); 250591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return [0, result]; 251591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } catch (e) { 252591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (e instanceof Debug.LiveEdit.Failure && "details" in e) { 253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var details = e.details; 254591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (details.type === "liveedit_compile_error") { 255591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var startPosition = details.position.start; 256591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return [1, String(e), String(details.syntaxErrorMessage), Number(startPosition.line), Number(startPosition.column)]; 257591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 258591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch throw e; 260591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.clearBreakpoints = function(execState, args) 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearAllBreakPoints(); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.setBreakpointsActivated = function(execState, args) 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.debuggerFlags().breakPointsActive.setValue(args.enabled); 2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 273926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.getScriptSource = function(eventData) 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 275926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventData.script().source(); 276926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 277926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 278926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.setScriptSource = function(eventData, source) 279926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 280926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (eventData.script().data() === "injected-script") 281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 282926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventData.script().setSource(source); 283926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 284926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 285926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.getScriptName = function(eventData) 286926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 287926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventData.script().script_.nameOrSourceURL(); 288926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 289926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 2905267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)DebuggerScript.getBreakpointNumbers = function(eventData) 2915267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 2925267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var breakpoints = eventData.breakPointsHit(); 2935267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var numbers = []; 2945267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!breakpoints) 2955267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return numbers; 2965267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 2975267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = 0; i < breakpoints.length; i++) { 2985267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var breakpoint = breakpoints[i]; 2995267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var scriptBreakPoint = breakpoint.script_break_point(); 3005267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) numbers.push(scriptBreakPoint ? scriptBreakPoint.number() : breakpoint.number()); 3015267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3025267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return numbers; 3035267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 3045267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._frameMirrorToJSCallFrame = function(frameMirror, callerFrame) 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get function name. 3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var func; 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) try { 3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) func = frameMirror.func(); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } catch(e) { 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var functionName; 3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (func) 3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) functionName = func.name() || func.inferredName(); 3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get script ID. 3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var script = func.script(); 3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sourceID = script && script.id(); 3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get location. 3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var location = frameMirror.sourceLocation(); 3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Get this object. 3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var thisObject = frameMirror.details_.receiver(); 3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeChain = []; 3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeType = []; 3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < frameMirror.scopeCount(); i++) { 3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeMirror = frameMirror.scope(i); 3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeType.push(scopeMirror.scopeType()); 3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeChain.push(DebuggerScript._buildScopeObject(scopeMirror)); 3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function evaluate(expression) 3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frameMirror.evaluate(expression, false).value(); 3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function restart() 3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Debug.LiveEdit.RestartFrame(frameMirror); 3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) function setVariableValue(scopeNumber, variableName, newValue) 346926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 347926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return DebuggerScript._setScopeVariableValue(frameMirror, scopeNumber, variableName, newValue); 348926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 349926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3507757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch function stepInPositions() 3517757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch { 3527757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var stepInPositionsV8 = frameMirror.stepInPositions(); 3537757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var stepInPositionsProtocol; 3547757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (stepInPositionsV8) { 3557757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch stepInPositionsProtocol = []; 3567757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var script = frameMirror.func().script(); 3577757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (script) { 3587757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var scriptId = String(script.id()); 3597757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch for (var i = 0; i < stepInPositionsV8.length; i++) { 3607757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var item = { 3617757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch scriptId: scriptId, 3627757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch lineNumber: stepInPositionsV8[i].position.line, 3637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch columnNumber: stepInPositionsV8[i].position.column 3647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch }; 3657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch stepInPositionsProtocol.push(item); 3667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 3677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 3687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 3697757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return JSON.stringify(stepInPositionsProtocol); 3707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 3717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "sourceID": sourceID, 3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "line": location ? location.line : 0, 3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "column": location ? location.column : 0, 3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "functionName": functionName, 3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "thisObject": thisObject, 3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "scopeChain": scopeChain, 3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "scopeType": scopeType, 3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "evaluate": evaluate, 3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "caller": callerFrame, 382926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "restart": restart, 3837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch "setVariableValue": setVariableValue, 3847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch "stepInPositions": stepInPositions 3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._buildScopeObject = function(scopeMirror) { 3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeObject; 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) switch (scopeMirror.scopeType()) { 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Local: 3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Closure: 3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Catch: 3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For transient objects we create a "persistent" copy that contains 3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same properties. 3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeObject = {}; 3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reset scope object prototype to null so that the proto properties 3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't appear in the local scope section. 3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeObject.__proto__ = null; 4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scopeObjectMirror = scopeMirror.scopeObject(); 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var properties = scopeObjectMirror.properties(); 4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var j = 0; j < properties.length; j++) { 4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name = properties[j].name(); 4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name.charAt(0) === ".") 4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; // Skip internal variables like ".arguments" 4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeObject[name] = properties[j].value_; 4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Global: 4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.With: 4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scopeObject = scopeMirror.details_.object(); 4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Block: 4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unsupported yet. Mustn't be reachable. 4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return scopeObject; 4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)return DebuggerScript; 4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 422