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 = { 3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch DontPauseOnExceptions: 0, 3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch PauseOnAllExceptions: 1, 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) PauseOnUncaughtExceptions: 2 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochDebuggerScript.ScopeInfoDetails = { 4207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch AllScopes: 0, 4307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch FastAsyncScopes: 1, 4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch NoScopes: 2 4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}; 4607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._pauseOnExceptionsState = DebuggerScript.PauseOnExceptionsState.DontPauseOnExceptions; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Debug.clearBreakOnException(); 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Debug.clearBreakOnUncaughtException(); 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getAfterCompileScript = function(eventData) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DebuggerScript._formatScript(eventData.script_.script_); 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getWorkerScripts = function() 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; ++i) { 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var script = scripts[i]; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Workers don't share same V8 heap now so there is no need to complicate stuff with 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the context id like we do to discriminate between scripts from different pages. 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // However we need to filter out v8 native scripts. 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.context_data && script.context_data === "worker") 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(DebuggerScript._formatScript(script)); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getFunctionScopes = function(fun) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mirror = MakeMirror(fun); 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var count = mirror.scopeCount(); 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (count == 0) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return null; 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < count; i++) { 79d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var scopeDetails = mirror.scope(i).details(); 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result[i] = { 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) type: scopeDetails.type(), 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) object: DebuggerScript._buildScopeObject(scopeDetails.type(), scopeDetails.object()) 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDebuggerScript.getCollectionEntries = function(object) 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var mirror = MakeMirror(object, true /* transient */); 917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (mirror.isMap()) 927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return mirror.entries(); 937242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (mirror.isSet()) { 947242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var result = []; 957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci var values = mirror.values(); 967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (var i = 0; i < values.length; ++i) 977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci result.push({ value: values[i] }); 987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return result; 997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 1007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 1017242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getInternalProperties = function(value) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var properties = ObjectMirror.GetInternalProperties(value); 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < properties.length; i++) { 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var mirror = properties[i]; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push({ 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name: mirror.name(), 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) value: mirror.value().value() 111591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch }); 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.setFunctionVariableValue = function(functionValue, scopeIndex, variableName, newValue) 117926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 118926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var mirror = MakeMirror(functionValue); 119926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!mirror.isFunction()) 120926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) throw new Error("Function value has incorrect type"); 121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return DebuggerScript._setScopeVariableValue(mirror, scopeIndex, variableName, newValue); 122926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript._setScopeVariableValue = function(scopeHolder, scopeIndex, variableName, newValue) 125926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 126926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) var scopeMirror = scopeHolder.scope(scopeIndex); 127926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (!scopeMirror) 128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) throw new Error("Incorrect scope index"); 129926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) scopeMirror.setVariableValue(variableName, newValue); 130926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return undefined; 131926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 132926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.getScripts = function(contextData) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = []; 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!contextData) 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var comma = contextData.indexOf(","); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (comma === -1) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Context data is a string in the following format: 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // ("page"|"injected")","<page id> 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var idSuffix = contextData.substring(comma); // including the comma 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; ++i) { 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var script = scripts[i]; 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.context_data && script.context_data.lastIndexOf(idSuffix) != -1) 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.push(DebuggerScript._formatScript(script)); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript._formatScript = function(script) 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lineEnds = script.line_ends; 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var lineCount = lineEnds.length; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endLine = script.line_offset + lineCount - 1; 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var endColumn; 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // V8 will not count last line if script source ends with \n. 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (script.source[script.source.length - 1] === '\n') { 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endLine += 1; 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = 0; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } else { 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (lineCount === 1) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = script.source.length + script.column_offset; 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn = script.source.length - (lineEnds[lineCount - 2] + 1); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) id: script.id, 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) name: script.nameOrSourceURL(), 175197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch sourceURL: script.source_url, 176197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch sourceMappingURL: script.source_mapping_url, 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) source: script.source, 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startLine: script.line_offset, 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) startColumn: script.column_offset, 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endLine: endLine, 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) endColumn: endColumn, 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) isContentScript: !!script.context_data && script.context_data.indexOf("injected") == 0 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 18619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)DebuggerScript.setBreakpoint = function(execState, info) 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 18819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) var positionAlignment = info.interstatementLocation ? Debug.BreakPositionAlignment.BreakPosition : Debug.BreakPositionAlignment.Statement; 18919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) var breakId = Debug.setScriptBreakPointById(info.sourceID, info.lineNumber, info.columnNumber, info.condition, undefined, positionAlignment); 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var locations = Debug.findBreakPointActualLocations(breakId); 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!locations.length) 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return undefined; 19419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) info.lineNumber = locations[0].line; 19519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) info.columnNumber = locations[0].column; 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return breakId.toString(); 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 19919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)DebuggerScript.removeBreakpoint = function(execState, info) 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 20119cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) Debug.findBreakPoint(info.breakpointId, true); 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.pauseOnExceptionsState = function() 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return DebuggerScript._pauseOnExceptionsState; 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.setPauseOnExceptionsState = function(newState) 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) DebuggerScript._pauseOnExceptionsState = newState; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (DebuggerScript.PauseOnExceptionsState.PauseOnAllExceptions === newState) 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.setBreakOnException(); 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearBreakOnException(); 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (DebuggerScript.PauseOnExceptionsState.PauseOnUncaughtExceptions === newState) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.setBreakOnUncaughtException(); 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearBreakOnUncaughtException(); 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 224f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)DebuggerScript.frameCount = function(execState) 225f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles){ 226f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) return execState.frameCount(); 227f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)} 228f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 22907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochDebuggerScript.currentCallFrame = function(execState, data) 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 23107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch var maximumLimit = data >> 2; 23207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch var scopeDetailsLevel = data & 3; 23307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var frameCount = execState.frameCount(); 23507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch if (maximumLimit && maximumLimit < frameCount) 236e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch frameCount = maximumLimit; 237e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch var topFrame = undefined; 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = frameCount - 1; i >= 0; i--) { 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var frameMirror = execState.frame(i); 24007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch topFrame = DebuggerScript._frameMirrorToJSCallFrame(frameMirror, topFrame, scopeDetailsLevel); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return topFrame; 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 245c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)DebuggerScript.currentCallFrameByIndex = function(execState, index) 246c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 247c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (index < 0) 248c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return undefined; 249c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) var frameCount = execState.frameCount(); 250c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (index >= frameCount) 251c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return undefined; 252c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return DebuggerScript._frameMirrorToJSCallFrame(execState.frame(index), undefined, DebuggerScript.ScopeInfoDetails.NoScopes); 253c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 254c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)DebuggerScript.stepIntoStatement = function(execState) 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) execState.prepareStep(Debug.StepAction.StepIn, 1); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 26006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)DebuggerScript.stepOverStatement = function(execState, callFrame) 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26276c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) execState.prepareStep(Debug.StepAction.StepNext, 1); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)DebuggerScript.stepOutOfFunction = function(execState, callFrame) 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 26776c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) execState.prepareStep(Debug.StepAction.StepOut, 1); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 270591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// Returns array in form: 271591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// [ 0, <v8_result_report> ] in case of success 272591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// or [ 1, <general_error_message>, <compiler_message>, <line_number>, <column_number> ] in case of compile error, numbers are 1-based. 273591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch// or throws exception with message. 274926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.liveEditScriptSource = function(scriptId, newSource, preview) 2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scripts = Debug.scripts(); 2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var scriptToEdit = null; 2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < scripts.length; i++) { 2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (scripts[i].id == scriptId) { 2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) scriptToEdit = scripts[i]; 2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!scriptToEdit) 2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) throw("Script not found"); 2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var changeLog = []; 288591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch try { 289591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var result = Debug.LiveEdit.SetScriptSource(scriptToEdit, newSource, preview, changeLog); 290591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return [0, result]; 291591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } catch (e) { 292591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (e instanceof Debug.LiveEdit.Failure && "details" in e) { 293591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var details = e.details; 294591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch if (details.type === "liveedit_compile_error") { 295591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch var startPosition = details.position.start; 296591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch return [1, String(e), String(details.syntaxErrorMessage), Number(startPosition.line), Number(startPosition.column)]; 297591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 298591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 299591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch throw e; 300591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch } 3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)DebuggerScript.clearBreakpoints = function(execState, info) 3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) Debug.clearAllBreakPoints(); 3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 30819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)DebuggerScript.setBreakpointsActivated = function(execState, info) 3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 31019cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) Debug.debuggerFlags().breakPointsActive.setValue(info.enabled); 3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 313926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.getScriptSource = function(eventData) 314926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 315926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventData.script().source(); 316926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 318926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.setScriptSource = function(eventData, source) 319926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 320926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) if (eventData.script().data() === "injected-script") 321926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return; 322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) eventData.script().setSource(source); 323926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 324926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 325926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)DebuggerScript.getScriptName = function(eventData) 326926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 327926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return eventData.script().script_.nameOrSourceURL(); 328926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 329926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 3305267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)DebuggerScript.getBreakpointNumbers = function(eventData) 3315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){ 3325267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var breakpoints = eventData.breakPointsHit(); 3335267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var numbers = []; 3345267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) if (!breakpoints) 3355267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return numbers; 3365267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 3375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) for (var i = 0; i < breakpoints.length; i++) { 3385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var breakpoint = breakpoints[i]; 3395267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) var scriptBreakPoint = breakpoint.script_break_point(); 3405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) numbers.push(scriptBreakPoint ? scriptBreakPoint.number() : breakpoint.number()); 3415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) } 3425267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) return numbers; 3435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)} 3445267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles) 345e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)DebuggerScript.isEvalCompilation = function(eventData) 346e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 347e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) var script = eventData.script(); 348e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) return (script.compilationType() === Debug.ScriptCompilationType.Eval); 349e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 350e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 351d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// NOTE: This function is performance critical, as it can be run on every 352d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// statement that generates an async event (like addEventListener) to support 353d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)// asynchronous call stacks. Thus, when possible, initialize the data lazily. 35407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochDebuggerScript._frameMirrorToJSCallFrame = function(frameMirror, callerFrame, scopeDetailsLevel) 3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 356d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Stuff that can not be initialized lazily (i.e. valid while paused with a valid break_id). 357d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // The frameMirror and scopeMirror can be accessed only while paused on the debugger. 358d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var frameDetails = frameMirror.details(); 359d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 360d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var funcObject = frameDetails.func(); 361d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var sourcePosition = frameDetails.sourcePosition(); 362d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var thisObject = frameDetails.receiver(); 363d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 364d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var isAtReturn = !!frameDetails.isAtReturn(); 365d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var returnValue = isAtReturn ? frameDetails.returnValue() : undefined; 366d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 36707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch var scopeMirrors = (scopeDetailsLevel === DebuggerScript.ScopeInfoDetails.NoScopes ? [] : frameMirror.allScopes(scopeDetailsLevel === DebuggerScript.ScopeInfoDetails.FastAsyncScopes)); 368d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var scopeTypes = new Array(scopeMirrors.length); 369d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var scopeObjects = new Array(scopeMirrors.length); 370d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (var i = 0; i < scopeMirrors.length; ++i) { 371d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var scopeDetails = scopeMirrors[i].details(); 372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scopeTypes[i] = scopeDetails.type(); 373d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scopeObjects[i] = scopeDetails.object(); 374d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) // Calculated lazily. 377d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var scopeChain; 378f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) var funcMirror; 379d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var location; 380d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 381d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function lazyScopeChain() 382d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 383d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!scopeChain) { 384d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scopeChain = []; 385d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (var i = 0; i < scopeObjects.length; ++i) 386d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scopeChain.push(DebuggerScript._buildScopeObject(scopeTypes[i], scopeObjects[i])); 387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) scopeObjects = null; // Free for GC. 388f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) } 389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return scopeChain; 3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 392d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function ensureFuncMirror() 393d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 394d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!funcMirror) { 395d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) funcMirror = MakeMirror(funcObject); 396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!funcMirror.isFunction()) 397d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) funcMirror = new UnresolvedFunctionMirror(funcObject); 398d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 399d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return funcMirror; 400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 402d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function ensureLocation() 403d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 404d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!location) { 405d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var script = ensureFuncMirror().script(); 406d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (script) 407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) location = script.locationFromPosition(sourcePosition, true); 408d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!location) 409d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) location = { line: 0, column: 0 }; 410d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 411d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return location; 412d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 414d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function line() 415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 416d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return ensureLocation().line; 417d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 418d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function column() 420d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 421d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return ensureLocation().column; 422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 424d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function sourceID() 425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 426d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var script = ensureFuncMirror().script(); 427d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return script && script.id(); 428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 42951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 430197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch function scriptName() 431197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch { 432197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch var script = ensureFuncMirror().script(); 433197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return script && script.name(); 434197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch } 435197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch 436d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) function functionName() 437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 438d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var func = ensureFuncMirror(); 439d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (!func.resolved()) 440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return undefined; 441d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var displayName; 442d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var valueMirror = func.property("displayName").value(); 443d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (valueMirror && valueMirror.isString()) 444d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) displayName = valueMirror.value(); 445d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return displayName || func.name() || func.inferredName(); 4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function evaluate(expression) 4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return frameMirror.evaluate(expression, false).value(); 4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) function restart() 4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Debug.LiveEdit.RestartFrame(frameMirror); 4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) function setVariableValue(scopeNumber, variableName, newValue) 459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) { 460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return DebuggerScript._setScopeVariableValue(frameMirror, scopeNumber, variableName, newValue); 461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) } 462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 4637757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch function stepInPositions() 4647757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch { 4657757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var stepInPositionsV8 = frameMirror.stepInPositions(); 4667757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var stepInPositionsProtocol; 4677757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (stepInPositionsV8) { 4687757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch stepInPositionsProtocol = []; 469d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var script = ensureFuncMirror().script(); 4707757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (script) { 4717757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var scriptId = String(script.id()); 4727757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch for (var i = 0; i < stepInPositionsV8.length; i++) { 4737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch var item = { 4747757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch scriptId: scriptId, 4757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch lineNumber: stepInPositionsV8[i].position.line, 4767757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch columnNumber: stepInPositionsV8[i].position.column 4777757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch }; 4787757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch stepInPositionsProtocol.push(item); 4797757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 4807757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 4817757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 4827757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch return JSON.stringify(stepInPositionsProtocol); 4837757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch } 4847757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch 4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return { 4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "sourceID": sourceID, 487d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) "line": line, 488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) "column": column, 489197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch "scriptName": scriptName, 4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "functionName": functionName, 4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "thisObject": thisObject, 492d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) "scopeChain": lazyScopeChain, 493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) "scopeType": scopeTypes, 4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "evaluate": evaluate, 4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) "caller": callerFrame, 496926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) "restart": restart, 4977757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch "setVariableValue": setVariableValue, 49806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles) "stepInPositions": stepInPositions, 49951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) "isAtReturn": isAtReturn, 50076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) "returnValue": returnValue 5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) }; 5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 504d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)DebuggerScript._buildScopeObject = function(scopeType, scopeObject) 505d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 506d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var result; 507d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) switch (scopeType) { 5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Local: 5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Closure: 5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Catch: 5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // For transient objects we create a "persistent" copy that contains 5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // the same properties. 5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Reset scope object prototype to null so that the proto properties 5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // don't appear in the local scope section. 515d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) result = { __proto__: null }; 516d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) var properties = MakeMirror(scopeObject, true /* transient */).properties(); 5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var j = 0; j < properties.length; j++) { 5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var name = properties[j].name(); 5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (name.charAt(0) === ".") 5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) continue; // Skip internal variables like ".arguments" 521d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) result[name] = properties[j].value_; 5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Global: 5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.With: 526d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) result = scopeObject; 5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) case ScopeType.Block: 5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Unsupported yet. Mustn't be reachable. 5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) break; 5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 532d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return result; 5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 5357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciDebuggerScript.getPromiseDetails = function(eventData) 5367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 5377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return { 5387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "promise": eventData.promise().value(), 5397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "parentPromise": eventData.parentPromise().value(), 5407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci "status": eventData.status() 5417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci }; 5427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 5437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 544f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)// We never resolve Mirror by its handle so to avoid memory leaks caused by Mirrors in the cache we disable it. 545f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)ToggleMirrorCache(false); 546f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles) 5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)return DebuggerScript; 5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)})(); 549