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