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