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