181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch/*
281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Copyright (C) 2011 Google Inc. All rights reserved.
381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * Redistribution and use in source and binary forms, with or without
581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * modification, are permitted provided that the following conditions are
681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * met:
781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     * Redistributions of source code must retain the above copyright
981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * notice, this list of conditions and the following disclaimer.
1081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     * Redistributions in binary form must reproduce the above
1181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * copyright notice, this list of conditions and the following disclaimer
1281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * in the documentation and/or other materials provided with the
1381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * distribution.
1481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *     * Neither the name of Google Inc. nor the names of its
1581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * contributors may be used to endorse or promote products derived from
1681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * this software without specific prior written permission.
1781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch *
1881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch */
3081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.DebuggerPresentationModel = function()
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch{
332bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._sourceFiles = {};
342bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._messages = [];
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this._breakpointsByDebuggerId = {};
362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this._breakpointsWithoutSourceFile = {};
372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
382bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._presentationCallFrames = [];
392bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._selectedCallFrameIndex = 0;
4081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
412bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerWasEnabled, this._debuggerWasEnabled, this);
422bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.ParsedScriptSource, this._parsedScriptSource, this);
432bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.FailedToParseScriptSource, this._failedToParseScriptSource, this);
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.BreakpointResolved, this._breakpointResolved, this);
452bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerPaused, this._debuggerPaused, this);
462bde8e466a4451c7319e3a072d118917957d6554Steve Block    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.DebuggerResumed, this._debuggerResumed, this);
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WebInspector.debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.Reset, this._debuggerReset, this);
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    new WebInspector.DebuggerPresentationModelResourceBinding(this);
5081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.DebuggerPresentationModel.Events = {
532bde8e466a4451c7319e3a072d118917957d6554Steve Block    SourceFileAdded: "source-file-added",
542bde8e466a4451c7319e3a072d118917957d6554Steve Block    SourceFileChanged: "source-file-changed",
552bde8e466a4451c7319e3a072d118917957d6554Steve Block    ConsoleMessageAdded: "console-message-added",
5681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    BreakpointAdded: "breakpoint-added",
572bde8e466a4451c7319e3a072d118917957d6554Steve Block    BreakpointRemoved: "breakpoint-removed",
582bde8e466a4451c7319e3a072d118917957d6554Steve Block    DebuggerPaused: "debugger-paused",
592bde8e466a4451c7319e3a072d118917957d6554Steve Block    DebuggerResumed: "debugger-resumed",
602bde8e466a4451c7319e3a072d118917957d6554Steve Block    CallFrameSelected: "call-frame-selected"
6181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
6281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
6381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.DebuggerPresentationModel.prototype = {
642bde8e466a4451c7319e3a072d118917957d6554Steve Block    _debuggerWasEnabled: function()
652bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        if (this._breakpointsRestored)
6754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            return;
682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._restoreBreakpointsFromSettings();
6954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        this._breakpointsRestored = true;
702bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
712bde8e466a4451c7319e3a072d118917957d6554Steve Block
722bde8e466a4451c7319e3a072d118917957d6554Steve Block    sourceFile: function(sourceFileId)
732bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
742bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._sourceFiles[sourceFileId];
752bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
762bde8e466a4451c7319e3a072d118917957d6554Steve Block
772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    sourceFileForScriptURL: function(scriptURL)
782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this._sourceFiles[scriptURL];
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
822bde8e466a4451c7319e3a072d118917957d6554Steve Block    requestSourceFileContent: function(sourceFileId, callback)
832bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
842bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._sourceFiles[sourceFileId].requestContent(callback);
852bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
862bde8e466a4451c7319e3a072d118917957d6554Steve Block
872bde8e466a4451c7319e3a072d118917957d6554Steve Block    _parsedScriptSource: function(event)
882bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
892bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._addScript(event.data);
902bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
912bde8e466a4451c7319e3a072d118917957d6554Steve Block
922bde8e466a4451c7319e3a072d118917957d6554Steve Block    _failedToParseScriptSource: function(event)
932bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
942bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._addScript(event.data);
952bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
962bde8e466a4451c7319e3a072d118917957d6554Steve Block
972bde8e466a4451c7319e3a072d118917957d6554Steve Block    _addScript: function(script)
982bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFileId = this._createSourceFileId(script.sourceURL, script.sourceID);
1002bde8e466a4451c7319e3a072d118917957d6554Steve Block        var sourceFile = this._sourceFiles[sourceFileId];
1012bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (sourceFile) {
1022bde8e466a4451c7319e3a072d118917957d6554Steve Block            sourceFile.addScript(script);
1032bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
1042bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1052bde8e466a4451c7319e3a072d118917957d6554Steve Block
1062bde8e466a4451c7319e3a072d118917957d6554Steve Block        function contentChanged(sourceFile)
1072bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
1082bde8e466a4451c7319e3a072d118917957d6554Steve Block            this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.SourceFileChanged, this._sourceFiles[sourceFileId]);
1092bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1102bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!this._formatSourceFiles)
1112bde8e466a4451c7319e3a072d118917957d6554Steve Block            sourceFile = new WebInspector.SourceFile(sourceFileId, script, contentChanged.bind(this));
1122bde8e466a4451c7319e3a072d118917957d6554Steve Block        else
1132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            sourceFile = new WebInspector.FormattedSourceFile(sourceFileId, script, contentChanged.bind(this), this._formatter());
1142bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._sourceFiles[sourceFileId] = sourceFile;
1152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._restoreBreakpoints(sourceFile);
1172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1182bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.SourceFileAdded, sourceFile);
1192bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
1202bde8e466a4451c7319e3a072d118917957d6554Steve Block
1212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _restoreBreakpoints: function(sourceFile)
1222bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var pendingBreakpoints = this._breakpointsWithoutSourceFile[sourceFile.id];
1242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var i = 0; pendingBreakpoints && i < pendingBreakpoints.length; ++i) {
1252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var breakpointData = pendingBreakpoints[i];
1262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if ("debuggerId" in breakpointData) {
1272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var breakpoint = new WebInspector.PresentationBreakpoint(sourceFile, breakpointData.lineNumber, breakpointData.condition, breakpointData.enabled);
1282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._bindDebuggerId(breakpoint, breakpointData.debuggerId);
1292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._breakpointAdded(breakpoint);
1302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            } else
1312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this.setBreakpoint(sourceFile.id, breakpointData.lineNumber, breakpointData.condition, breakpointData.enabled, true);
1322bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        delete this._breakpointsWithoutSourceFile[sourceFile.id];
1342bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
1352bde8e466a4451c7319e3a072d118917957d6554Steve Block
1362bde8e466a4451c7319e3a072d118917957d6554Steve Block    canEditScriptSource: function(sourceFileId)
1372bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!Preferences.canEditScriptSource || this._formatSourceFiles)
1392bde8e466a4451c7319e3a072d118917957d6554Steve Block            return false;
1402bde8e466a4451c7319e3a072d118917957d6554Steve Block        var script = this._scriptForSourceFileId(sourceFileId);
1412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return !script.lineOffset && !script.columnOffset;
1422bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
1432bde8e466a4451c7319e3a072d118917957d6554Steve Block
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    editScriptSource: function(sourceFileId, newSource, callback)
1452bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1462bde8e466a4451c7319e3a072d118917957d6554Steve Block        var script = this._scriptForSourceFileId(sourceFileId);
1472bde8e466a4451c7319e3a072d118917957d6554Steve Block        var sourceFile = this._sourceFiles[sourceFileId];
1482bde8e466a4451c7319e3a072d118917957d6554Steve Block
1492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function didEditScriptSource(oldSource, error)
1502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!error) {
1522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                sourceFile.content = newSource;
1532bde8e466a4451c7319e3a072d118917957d6554Steve Block
1542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var resource = WebInspector.resourceForURL(sourceFile.url);
1552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                if (resource)
1562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    resource.addRevision(newSource);
1572bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
1582bde8e466a4451c7319e3a072d118917957d6554Steve Block
1592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            callback(error);
1602bde8e466a4451c7319e3a072d118917957d6554Steve Block
1612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!error && WebInspector.debuggerModel.callFrames)
1622bde8e466a4451c7319e3a072d118917957d6554Steve Block                this._debuggerPaused();
1632bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
1642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var oldSource = sourceFile.requestContent(didReceiveSource.bind(this));
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function didReceiveSource(oldSource)
1672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
1682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            WebInspector.debuggerModel.editScriptSource(script.sourceID, newSource, didEditScriptSource.bind(this, oldSource));
1692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
1702bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
1712bde8e466a4451c7319e3a072d118917957d6554Steve Block
1722bde8e466a4451c7319e3a072d118917957d6554Steve Block    _updateBreakpointsAfterLiveEdit: function(sourceFileId, oldSource, newSource)
1732bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
1742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = this._sourceFiles[sourceFileId];
1752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1762bde8e466a4451c7319e3a072d118917957d6554Steve Block        // Clear and re-create breakpoints according to text diff.
1772bde8e466a4451c7319e3a072d118917957d6554Steve Block        var diff = Array.diff(oldSource.split("\n"), newSource.split("\n"));
1782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var lineNumber in sourceFile.breakpoints) {
1792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var breakpoint = sourceFile.breakpoints[lineNumber];
1802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1812bde8e466a4451c7319e3a072d118917957d6554Steve Block            var lineNumber = breakpoint.lineNumber;
1822bde8e466a4451c7319e3a072d118917957d6554Steve Block            this.removeBreakpoint(sourceFileId, lineNumber);
1832bde8e466a4451c7319e3a072d118917957d6554Steve Block
1842bde8e466a4451c7319e3a072d118917957d6554Steve Block            var newLineNumber = diff.left[lineNumber].row;
1852bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (newLineNumber === undefined) {
1862bde8e466a4451c7319e3a072d118917957d6554Steve Block                for (var i = lineNumber - 1; i >= 0; --i) {
1872bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (diff.left[i].row === undefined)
1882bde8e466a4451c7319e3a072d118917957d6554Steve Block                        continue;
1892bde8e466a4451c7319e3a072d118917957d6554Steve Block                    var shiftedLineNumber = diff.left[i].row + lineNumber - i;
1902bde8e466a4451c7319e3a072d118917957d6554Steve Block                    if (shiftedLineNumber < diff.right.length) {
1912bde8e466a4451c7319e3a072d118917957d6554Steve Block                        var originalLineNumber = diff.right[shiftedLineNumber].row;
1922bde8e466a4451c7319e3a072d118917957d6554Steve Block                        if (originalLineNumber === lineNumber || originalLineNumber === undefined)
1932bde8e466a4451c7319e3a072d118917957d6554Steve Block                            newLineNumber = shiftedLineNumber;
1942bde8e466a4451c7319e3a072d118917957d6554Steve Block                    }
1952bde8e466a4451c7319e3a072d118917957d6554Steve Block                    break;
1962bde8e466a4451c7319e3a072d118917957d6554Steve Block                }
1972bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
1982bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (newLineNumber !== undefined)
1992bde8e466a4451c7319e3a072d118917957d6554Steve Block                this.setBreakpoint(sourceFileId, newLineNumber, breakpoint.condition, breakpoint.enabled);
2002bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
2012bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
2022bde8e466a4451c7319e3a072d118917957d6554Steve Block
2032bde8e466a4451c7319e3a072d118917957d6554Steve Block    toggleFormatSourceFiles: function()
2042bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
2052bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._formatSourceFiles = !this._formatSourceFiles;
2062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var id in this._sourceFiles) {
2082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var sourceFile = this._sourceFiles[id];
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            for (var line in sourceFile.breakpoints)
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._removeBreakpointFromDebugger(sourceFile.breakpoints[line]);
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
2122bde8e466a4451c7319e3a072d118917957d6554Steve Block
2132bde8e466a4451c7319e3a072d118917957d6554Steve Block        var messages = this._messages;
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._reset();
2152bde8e466a4451c7319e3a072d118917957d6554Steve Block
2162bde8e466a4451c7319e3a072d118917957d6554Steve Block        var scripts = WebInspector.debuggerModel.scripts;
2172bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var id in scripts)
2182bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._addScript(scripts[id]);
2192bde8e466a4451c7319e3a072d118917957d6554Steve Block
2202bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var i = 0; i < messages.length; ++i)
2212bde8e466a4451c7319e3a072d118917957d6554Steve Block            this.addConsoleMessage(messages[i]);
2222bde8e466a4451c7319e3a072d118917957d6554Steve Block
2232bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (WebInspector.debuggerModel.callFrames)
2242bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._debuggerPaused();
2252bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
2262bde8e466a4451c7319e3a072d118917957d6554Steve Block
2272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    formatSourceFilesToggled: function()
2282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
2292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this._formatSourceFiles;
2302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
2312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _formatter: function()
2332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
2342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!this._scriptFormatter)
2352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._scriptFormatter = new WebInspector.ScriptFormatter();
2362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this._scriptFormatter;
2372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2392bde8e466a4451c7319e3a072d118917957d6554Steve Block    addConsoleMessage: function(message)
2402bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
2412bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._messages.push(message);
2422bde8e466a4451c7319e3a072d118917957d6554Steve Block
2432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = this._sourceFileForScript(message.url);
2442bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!sourceFile)
2452bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
2462bde8e466a4451c7319e3a072d118917957d6554Steve Block
2472bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestSourceMapping(mapping)
2482bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
2492bde8e466a4451c7319e3a072d118917957d6554Steve Block            var presentationMessage = {};
2502bde8e466a4451c7319e3a072d118917957d6554Steve Block            presentationMessage.sourceFileId = sourceFile.id;
2512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            presentationMessage.lineNumber = mapping.scriptLocationToSourceLine({lineNumber:message.line - 1, columnNumber:0});
2522bde8e466a4451c7319e3a072d118917957d6554Steve Block            presentationMessage.originalMessage = message;
2532bde8e466a4451c7319e3a072d118917957d6554Steve Block            sourceFile.messages.push(presentationMessage);
2542bde8e466a4451c7319e3a072d118917957d6554Steve Block            this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.ConsoleMessageAdded, presentationMessage);
2552bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
2562bde8e466a4451c7319e3a072d118917957d6554Steve Block        sourceFile.requestSourceMapping(didRequestSourceMapping.bind(this));
2572bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
2582bde8e466a4451c7319e3a072d118917957d6554Steve Block
2592bde8e466a4451c7319e3a072d118917957d6554Steve Block    clearConsoleMessages: function()
2602bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
2612bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._messages = [];
2622bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var id in this._sourceFiles)
2632bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._sourceFiles[id].messages = [];
2642bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
2652bde8e466a4451c7319e3a072d118917957d6554Steve Block
2662bde8e466a4451c7319e3a072d118917957d6554Steve Block    continueToLine: function(sourceFileId, lineNumber)
2672bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
2682bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestSourceMapping(mapping)
2692bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
2702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var location = mapping.sourceLineToScriptLocation(lineNumber);
2712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            WebInspector.debuggerModel.continueToLocation(location);
2722bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
2732bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._sourceFiles[sourceFileId].requestSourceMapping(didRequestSourceMapping.bind(this));
2742bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
2752bde8e466a4451c7319e3a072d118917957d6554Steve Block
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    breakpointsForSourceFileId: function(sourceFileId)
27781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
2782bde8e466a4451c7319e3a072d118917957d6554Steve Block        var sourceFile = this.sourceFile(sourceFileId);
2792bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!sourceFile)
2802bde8e466a4451c7319e3a072d118917957d6554Steve Block            return [];
28181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        var breakpoints = [];
2822bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var lineNumber in sourceFile.breakpoints)
2832bde8e466a4451c7319e3a072d118917957d6554Steve Block            breakpoints.push(sourceFile.breakpoints[lineNumber]);
28481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return breakpoints;
28581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
28681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
2872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setBreakpoint: function(sourceFileId, lineNumber, condition, enabled, dontSaveBreakpoints)
28881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
2892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = this._sourceFiles[sourceFileId];
2902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!sourceFile)
2912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
2922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var breakpoint = new WebInspector.PresentationBreakpoint(sourceFile, lineNumber, condition, enabled);
2942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!enabled) {
2952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._breakpointAdded(breakpoint);
2962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!dontSaveBreakpoints)
2972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._saveBreakpoints();
2982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
2992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function callback()
3022bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
3032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._breakpointAdded(breakpoint);
3042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!dontSaveBreakpoints)
3052bde8e466a4451c7319e3a072d118917957d6554Steve Block                this._saveBreakpoints();
3062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._setBreakpointInDebugger(breakpoint, callback.bind(this));
3082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
3092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _setBreakpointInDebugger: function(breakpoint, callback)
3112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function didSetBreakpoint(breakpointId, locations)
3132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!breakpointId)
3152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                return;
3162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._bindDebuggerId(breakpoint, breakpointId);
3182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            breakpoint.location = locations[0];
3192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            callback();
3202bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
32181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3222bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestSourceMapping(mapping)
3232bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
3242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var location = mapping.sourceLineToScriptLocation(breakpoint.lineNumber);
3252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var script = WebInspector.debuggerModel.scriptForSourceID(location.sourceID);
3262bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (script.sourceURL)
3272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WebInspector.debuggerModel.setBreakpoint(script.sourceURL, location.lineNumber, location.columnNumber, breakpoint.condition, didSetBreakpoint.bind(this));
3282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            else {
3292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                location.sourceID = script.sourceID;
3302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                WebInspector.debuggerModel.setBreakpointBySourceId(location, breakpoint.condition, didSetBreakpoint.bind(this));
3312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
33281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        }
3332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        breakpoint.sourceFile.requestSourceMapping(didRequestSourceMapping.bind(this));
3342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
3352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _removeBreakpointFromDebugger: function(breakpoint, callback)
3372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!("debuggerId" in breakpoint)) {
3392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (callback)
3402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                callback();
3412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
3422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function didRemoveBreakpoint()
3452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._unbindDebuggerId(breakpoint);
3472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (callback)
3482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                callback();
3492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        WebInspector.debuggerModel.removeBreakpoint(breakpoint.debuggerId, didRemoveBreakpoint.bind(this));
3512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
3522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _bindDebuggerId: function(breakpoint, debuggerId)
3542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        breakpoint.debuggerId = debuggerId;
3562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._breakpointsByDebuggerId[debuggerId] = breakpoint;
3572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
3582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _unbindDebuggerId: function(breakpoint)
3602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
3612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        delete this._breakpointsByDebuggerId[breakpoint.debuggerId];
3622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        delete breakpoint.debuggerId;
3632bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
36481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3652bde8e466a4451c7319e3a072d118917957d6554Steve Block    setBreakpointEnabled: function(sourceFileId, lineNumber, enabled)
3662bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
3672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var breakpoint = this.findBreakpoint(sourceFileId, lineNumber);
3682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!breakpoint)
3692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
3702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.BreakpointRemoved, breakpoint);
3722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        breakpoint.enabled = enabled;
3742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function afterUpdate()
3762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
3772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.BreakpointAdded, breakpoint);
3782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._saveBreakpoints();
3792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
3802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!enabled)
3822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._removeBreakpointFromDebugger(breakpoint, afterUpdate.call(this));
3832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        else
3842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._setBreakpointInDebugger(breakpoint, afterUpdate.bind(this));
3852bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
38681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3872bde8e466a4451c7319e3a072d118917957d6554Steve Block    updateBreakpoint: function(sourceFileId, lineNumber, condition, enabled)
3882bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
3892bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.removeBreakpoint(sourceFileId, lineNumber);
3902bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.setBreakpoint(sourceFileId, lineNumber, condition, enabled);
3912bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
39281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
3932bde8e466a4451c7319e3a072d118917957d6554Steve Block    removeBreakpoint: function(sourceFileId, lineNumber)
3942bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
3952bde8e466a4451c7319e3a072d118917957d6554Steve Block        var breakpoint = this.findBreakpoint(sourceFileId, lineNumber);
3962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!breakpoint)
3972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
3982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
3992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function callback()
4002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
4012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._breakpointRemoved(breakpoint);
4022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this._saveBreakpoints();
4032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
4042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._removeBreakpointFromDebugger(breakpoint, callback.bind(this));
4052bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
4062bde8e466a4451c7319e3a072d118917957d6554Steve Block
4072bde8e466a4451c7319e3a072d118917957d6554Steve Block    findBreakpoint: function(sourceFileId, lineNumber)
4082bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
4092bde8e466a4451c7319e3a072d118917957d6554Steve Block        var sourceFile = this.sourceFile(sourceFileId);
4102bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (sourceFile)
4112bde8e466a4451c7319e3a072d118917957d6554Steve Block            return sourceFile.breakpoints[lineNumber];
41281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
41381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4142bde8e466a4451c7319e3a072d118917957d6554Steve Block    _breakpointAdded: function(breakpoint)
41581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
4162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = breakpoint.sourceFile;
4172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!sourceFile)
4182bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
4192bde8e466a4451c7319e3a072d118917957d6554Steve Block
4202bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestSourceMapping(mapping)
4212bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
4222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // Refine line number based on resolved location.
4232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (breakpoint.location)
4242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                breakpoint.lineNumber = mapping.scriptLocationToSourceLine(breakpoint.location);
4252bde8e466a4451c7319e3a072d118917957d6554Steve Block
4262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var existingBreakpoint = this.findBreakpoint(sourceFile.id, breakpoint.lineNumber);
4272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (existingBreakpoint) {
4282bde8e466a4451c7319e3a072d118917957d6554Steve Block                // We can't show more than one breakpoint on a single source file line.
4292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._removeBreakpointFromDebugger(breakpoint);
4302bde8e466a4451c7319e3a072d118917957d6554Steve Block                return;
4312bde8e466a4451c7319e3a072d118917957d6554Steve Block            }
4322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            sourceFile.breakpoints[breakpoint.lineNumber] = breakpoint;
4332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.BreakpointAdded, breakpoint);
4342bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4352bde8e466a4451c7319e3a072d118917957d6554Steve Block        sourceFile.requestSourceMapping(didRequestSourceMapping.bind(this));
4362bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
4372bde8e466a4451c7319e3a072d118917957d6554Steve Block
4382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _breakpointRemoved: function(breakpoint)
4392bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
4402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = breakpoint.sourceFile;
4412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (sourceFile.breakpoints[breakpoint.lineNumber] === breakpoint) {
4422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // There can already be a newer breakpoint;
4432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            delete sourceFile.breakpoints[breakpoint.lineNumber];
4442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.BreakpointRemoved, breakpoint);
4452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
44881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    _breakpointResolved: function(event)
44981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
4502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var debuggerId = event.data.breakpointId;
4512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!(debuggerId in this._breakpointsByDebuggerId))
4522bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
4532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var breakpoint = this._breakpointsByDebuggerId[debuggerId];
4542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._breakpointRemoved(breakpoint);
4562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        breakpoint.location = event.data.location;
4572bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._breakpointAdded(breakpoint);
4582bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
4592bde8e466a4451c7319e3a072d118917957d6554Steve Block
4602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _restoreBreakpointsFromSettings: function()
4612bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
4622bde8e466a4451c7319e3a072d118917957d6554Steve Block        var breakpoints = WebInspector.settings.breakpoints;
4632bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var i = 0; i < breakpoints.length; ++i) {
4642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var breakpointData = breakpoints[i];
4652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var sourceFileId = breakpointData.sourceFileId;
4662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!sourceFileId)
4672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                continue;
4682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var sourceFile = this._sourceFiles[sourceFileId];
4692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (sourceFile) {
4702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this.setBreakpoint(sourceFileId, breakpointData.lineNumber, breakpointData.condition, breakpointData.enabled);
4712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                continue;
4722daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
4732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // Add breakpoint once source file becomes available.
4752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var pendingBreakpoints = this._breakpointsWithoutSourceFile[sourceFileId];
4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!pendingBreakpoints) {
4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                pendingBreakpoints = [];
4782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._breakpointsWithoutSourceFile[sourceFileId] = pendingBreakpoints;
4792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            pendingBreakpoints.push(breakpointData);
4812bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
48281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
48381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
4842bde8e466a4451c7319e3a072d118917957d6554Steve Block    _saveBreakpoints: function()
48581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
4862bde8e466a4451c7319e3a072d118917957d6554Steve Block        var serializedBreakpoints = [];
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Store added breakpoints.
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var sourceFileId in this._sourceFiles) {
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var sourceFile = this._sourceFiles[sourceFileId];
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!sourceFile.url)
4922bde8e466a4451c7319e3a072d118917957d6554Steve Block                continue;
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            for (var lineNumber in sourceFile.breakpoints)
4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                serializedBreakpoints.push(sourceFile.breakpoints[lineNumber].serialize());
4962bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Store not added breakpoints.
4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var sourceFileId in this._breakpointsWithoutSourceFile)
5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            serializedBreakpoints = serializedBreakpoints.concat(this._breakpointsWithoutSourceFile[sourceFileId]);
5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // Sanitize debugger ids.
50354cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        for (var i = 0; i < serializedBreakpoints.length; ++i) {
50454cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            var breakpoint = serializedBreakpoints[i];
50554cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            var breakpointCopy = {};
50654cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            for (var property in breakpoint) {
50754cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                if (property !== "debuggerId")
50854cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block                    breakpointCopy[property] = breakpoint[property];
50954cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            }
51054cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block            serializedBreakpoints[i] = breakpointCopy;
51154cdeeebc7adcbcd900e8b6a141a8cae27d9a631Steve Block        }
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5132bde8e466a4451c7319e3a072d118917957d6554Steve Block        WebInspector.settings.breakpoints = serializedBreakpoints;
51481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
51581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5162bde8e466a4451c7319e3a072d118917957d6554Steve Block    _debuggerPaused: function()
51781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5182bde8e466a4451c7319e3a072d118917957d6554Steve Block        var callFrames = WebInspector.debuggerModel.callFrames;
5192bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._presentationCallFrames = [];
5202bde8e466a4451c7319e3a072d118917957d6554Steve Block        for (var i = 0; i < callFrames.length; ++i) {
5212bde8e466a4451c7319e3a072d118917957d6554Steve Block            var callFrame = callFrames[i];
5222bde8e466a4451c7319e3a072d118917957d6554Steve Block            var sourceFile;
5232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var script = WebInspector.debuggerModel.scriptForSourceID(callFrame.location.sourceID);
5242bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (script)
5252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                sourceFile = this._sourceFileForScript(script.sourceURL, script.sourceID);
5262bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._presentationCallFrames.push(new WebInspector.PresenationCallFrame(callFrame, i, sourceFile));
5272bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5282bde8e466a4451c7319e3a072d118917957d6554Steve Block        var details = WebInspector.debuggerModel.debuggerPausedDetails;
5292bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.DebuggerPaused, { callFrames: this._presentationCallFrames, details: details });
5302bde8e466a4451c7319e3a072d118917957d6554Steve Block
5312bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.selectedCallFrame = this._presentationCallFrames[this._selectedCallFrameIndex];
5322bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
5332bde8e466a4451c7319e3a072d118917957d6554Steve Block
5342bde8e466a4451c7319e3a072d118917957d6554Steve Block    _debuggerResumed: function()
5352bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
5362bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._presentationCallFrames = [];
5372bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._selectedCallFrameIndex = 0;
5382bde8e466a4451c7319e3a072d118917957d6554Steve Block        this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.DebuggerResumed);
5392bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
54081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5412bde8e466a4451c7319e3a072d118917957d6554Steve Block    set selectedCallFrame(callFrame)
5422bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
5432bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._selectedCallFrameIndex = callFrame.index;
5442bde8e466a4451c7319e3a072d118917957d6554Steve Block        callFrame.select();
54581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        this.dispatchEventToListeners(WebInspector.DebuggerPresentationModel.Events.CallFrameSelected, callFrame);
54681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
54781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
54881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    get selectedCallFrame()
54981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5502bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._presentationCallFrames[this._selectedCallFrameIndex];
5512bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
5522bde8e466a4451c7319e3a072d118917957d6554Steve Block
5532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _sourceFileForScript: function(sourceURL, sourceID)
5542bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
5552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this._sourceFiles[this._createSourceFileId(sourceURL, sourceID)];
5562bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
5572bde8e466a4451c7319e3a072d118917957d6554Steve Block
5582bde8e466a4451c7319e3a072d118917957d6554Steve Block    _scriptForSourceFileId: function(sourceFileId)
5592bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
5602bde8e466a4451c7319e3a072d118917957d6554Steve Block        function filter(script)
5612bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
5622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return this._createSourceFileId(script.sourceURL, script.sourceID) === sourceFileId;
5632bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
5642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return WebInspector.debuggerModel.queryScripts(filter.bind(this))[0];
5652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
5662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _createSourceFileId: function(sourceURL, sourceID)
5682daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var prefix = this._formatSourceFiles ? "deobfuscated:" : "";
5702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return prefix + (sourceURL || sourceID);
57181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    },
57281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
5732bde8e466a4451c7319e3a072d118917957d6554Steve Block    _reset: function()
57481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    {
5752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        for (var id in this._sourceFiles) {
5762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            var sourceFile = this._sourceFiles[id];
5772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            for (var line in sourceFile.breakpoints) {
5782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                var breakpoints = this._breakpointsWithoutSourceFile[sourceFile.id];
5792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                if (!breakpoints) {
5802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    breakpoints = [];
5812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                    this._breakpointsWithoutSourceFile[sourceFile.id] = breakpoints;
5822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                }
5832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                breakpoints.push(sourceFile.breakpoints[line].serialize());
5842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
5852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
5862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5872bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._sourceFiles = {};
5882bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._messages = [];
5892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._breakpointsByDebuggerId = {};
5902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
5912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _debuggerReset: function()
5932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
5942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._reset();
5952bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._presentationCallFrames = [];
5962bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._selectedCallFrameIndex = 0;
59781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    }
59881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch}
59981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
60081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen MurdochWebInspector.DebuggerPresentationModel.prototype.__proto__ = WebInspector.Object.prototype;
6012bde8e466a4451c7319e3a072d118917957d6554Steve Block
6022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.PresentationBreakpoint = function(sourceFile, lineNumber, condition, enabled)
6032bde8e466a4451c7319e3a072d118917957d6554Steve Block{
6042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.sourceFile = sourceFile;
6052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.sourceFileId = sourceFile.id;
6062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.lineNumber = lineNumber;
6072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.condition = condition;
6082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this.enabled = enabled;
6092bde8e466a4451c7319e3a072d118917957d6554Steve Block}
6102bde8e466a4451c7319e3a072d118917957d6554Steve Block
6112bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebInspector.PresentationBreakpoint.prototype = {
6122bde8e466a4451c7319e3a072d118917957d6554Steve Block    get url()
6132bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this.sourceFile.url;
6152bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6162bde8e466a4451c7319e3a072d118917957d6554Steve Block
6172bde8e466a4451c7319e3a072d118917957d6554Steve Block    get resolved()
6182bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return !!this.location;
6202bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6212bde8e466a4451c7319e3a072d118917957d6554Steve Block
6222bde8e466a4451c7319e3a072d118917957d6554Steve Block    loadSnippet: function(callback)
6232bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6242bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestContent(mimeType, content)
6252bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
6262bde8e466a4451c7319e3a072d118917957d6554Steve Block            var lineEndings = content.lineEndings();
6272bde8e466a4451c7319e3a072d118917957d6554Steve Block            var snippet = "";
6282bde8e466a4451c7319e3a072d118917957d6554Steve Block            if (this.lineNumber < lineEndings.length)
6292bde8e466a4451c7319e3a072d118917957d6554Steve Block                snippet = content.substring(lineEndings[this.lineNumber - 1], lineEndings[this.lineNumber]);
6302bde8e466a4451c7319e3a072d118917957d6554Steve Block            callback(snippet);
6312bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
6322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!this.sourceFile) {
6332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            callback(WebInspector.UIString("N/A"));
6342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
6352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
6362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this.sourceFile.requestContent(didRequestContent.bind(this));
6372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
6382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
6392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    serialize: function()
6402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
6412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var serializedBreakpoint = {};
6422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        serializedBreakpoint.sourceFileId = this.sourceFile.id;
6432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        serializedBreakpoint.lineNumber = this.lineNumber;
6442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        serializedBreakpoint.condition = this.condition;
6452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        serializedBreakpoint.enabled = this.enabled;
6462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        serializedBreakpoint.debuggerId = this.debuggerId;
6472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return serializedBreakpoint;
6482bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
6492bde8e466a4451c7319e3a072d118917957d6554Steve Block}
6502bde8e466a4451c7319e3a072d118917957d6554Steve Block
6512bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebInspector.PresenationCallFrame = function(callFrame, index, sourceFile)
6522bde8e466a4451c7319e3a072d118917957d6554Steve Block{
6532bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._callFrame = callFrame;
6542bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._index = index;
6552bde8e466a4451c7319e3a072d118917957d6554Steve Block    this._sourceFile = sourceFile;
6562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this._script = WebInspector.debuggerModel.scriptForSourceID(callFrame.location.sourceID);
6572bde8e466a4451c7319e3a072d118917957d6554Steve Block}
6582bde8e466a4451c7319e3a072d118917957d6554Steve Block
6592bde8e466a4451c7319e3a072d118917957d6554Steve BlockWebInspector.PresenationCallFrame.prototype = {
6602bde8e466a4451c7319e3a072d118917957d6554Steve Block    get functionName()
6612bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6622bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._callFrame.functionName;
6632bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6642bde8e466a4451c7319e3a072d118917957d6554Steve Block
6652bde8e466a4451c7319e3a072d118917957d6554Steve Block    get type()
6662bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6672bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._callFrame.type;
6682bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6692bde8e466a4451c7319e3a072d118917957d6554Steve Block
6702bde8e466a4451c7319e3a072d118917957d6554Steve Block    get isInternalScript()
6712bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6722bde8e466a4451c7319e3a072d118917957d6554Steve Block        return !this._script;
6732bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6742bde8e466a4451c7319e3a072d118917957d6554Steve Block
6752bde8e466a4451c7319e3a072d118917957d6554Steve Block    get url()
6762bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6772bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (this._sourceFile)
6782bde8e466a4451c7319e3a072d118917957d6554Steve Block            return this._sourceFile.url;
6792bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6802bde8e466a4451c7319e3a072d118917957d6554Steve Block
6812bde8e466a4451c7319e3a072d118917957d6554Steve Block    get scopeChain()
6822bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6832bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._callFrame.scopeChain;
6842bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6852bde8e466a4451c7319e3a072d118917957d6554Steve Block
6862bde8e466a4451c7319e3a072d118917957d6554Steve Block    get index()
6872bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6882bde8e466a4451c7319e3a072d118917957d6554Steve Block        return this._index;
6892bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6902bde8e466a4451c7319e3a072d118917957d6554Steve Block
6912bde8e466a4451c7319e3a072d118917957d6554Steve Block    select: function()
6922bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6932bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (this._sourceFile)
6942bde8e466a4451c7319e3a072d118917957d6554Steve Block            this._sourceFile.forceLoadContent(this._script);
6952bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
6962bde8e466a4451c7319e3a072d118917957d6554Steve Block
6972bde8e466a4451c7319e3a072d118917957d6554Steve Block    evaluate: function(code, objectGroup, includeCommandLineAPI, callback)
6982bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
6992bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didEvaluateOnCallFrame(error, result)
7002bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
7012bde8e466a4451c7319e3a072d118917957d6554Steve Block            callback(WebInspector.RemoteObject.fromPayload(result));
7022bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
7032bde8e466a4451c7319e3a072d118917957d6554Steve Block        DebuggerAgent.evaluateOnCallFrame(this._callFrame.id, code, objectGroup, includeCommandLineAPI, didEvaluateOnCallFrame.bind(this));
7042bde8e466a4451c7319e3a072d118917957d6554Steve Block    },
7052bde8e466a4451c7319e3a072d118917957d6554Steve Block
7062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    sourceLine: function(callback)
7072bde8e466a4451c7319e3a072d118917957d6554Steve Block    {
7082bde8e466a4451c7319e3a072d118917957d6554Steve Block        if (!this._sourceFile) {
7092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            callback(undefined, this._callFrame.location.lineNumber);
7102bde8e466a4451c7319e3a072d118917957d6554Steve Block            return;
7112bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
7122bde8e466a4451c7319e3a072d118917957d6554Steve Block
7132bde8e466a4451c7319e3a072d118917957d6554Steve Block        function didRequestSourceMapping(mapping)
7142bde8e466a4451c7319e3a072d118917957d6554Steve Block        {
7152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            callback(this._sourceFile.id, mapping.scriptLocationToSourceLine(this._callFrame.location));
7162bde8e466a4451c7319e3a072d118917957d6554Steve Block        }
7172bde8e466a4451c7319e3a072d118917957d6554Steve Block        this._sourceFile.requestSourceMapping(didRequestSourceMapping.bind(this));
7182bde8e466a4451c7319e3a072d118917957d6554Steve Block    }
7192bde8e466a4451c7319e3a072d118917957d6554Steve Block}
7202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7212daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DebuggerPresentationModelResourceBinding = function(model)
7222daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
7232daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    this._presentationModel = model;
7242daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    WebInspector.Resource.registerDomainModelBinding(WebInspector.Resource.Type.Script, this);
7252daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7262daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7272daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DebuggerPresentationModelResourceBinding.prototype = {
7282daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    canSetContent: function(resource)
7292daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = this._presentationModel._sourceFileForScript(resource.url)
7312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!sourceFile)
7322daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return false;
7332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return this._presentationModel.canEditScriptSource(sourceFile.id);
7342daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
7352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    setContent: function(resource, content, majorChange, userCallback)
7372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!majorChange)
7392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
7402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        var sourceFile = this._presentationModel._sourceFileForScript(resource.url);
7422daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!sourceFile) {
7432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            userCallback("Resource is not editable");
7442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
7452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
7462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        resource.requestContent(this._setContentWithInitialContent.bind(this, sourceFile, content, userCallback));
7482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    },
7492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    _setContentWithInitialContent: function(sourceFile, content, userCallback, oldContent)
7512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
7522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        function callback(error)
7532daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        {
7542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (userCallback)
7552daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                userCallback(error);
7562daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            if (!error) {
7572daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                this._presentationModel._updateBreakpointsAfterLiveEdit(sourceFile.id, oldContent, content);
7582daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                sourceFile.reload();
7592daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            }
7602daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        }
7612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        this._presentationModel.editScriptSource(sourceFile.id, content, callback.bind(this));
7622daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7632daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
7642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
7652daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben MurdochWebInspector.DebuggerPresentationModelResourceBinding.prototype.__proto__ = WebInspector.ResourceDomainModelBinding.prototype;
766