| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 /** @type {!Object.<string, !WebInspector.SourceMap>} */ | 48 /** @type {!Object.<string, !WebInspector.SourceMap>} */ |
| 49 this._sourceMapForSourceMapURL = {}; | 49 this._sourceMapForSourceMapURL = {}; |
| 50 /** @type {!Object.<string, !Array.<function(?WebInspector.SourceMap)>>} */ | 50 /** @type {!Object.<string, !Array.<function(?WebInspector.SourceMap)>>} */ |
| 51 this._pendingSourceMapLoadingCallbacks = {}; | 51 this._pendingSourceMapLoadingCallbacks = {}; |
| 52 /** @type {!Object.<string, !WebInspector.SourceMap>} */ | 52 /** @type {!Object.<string, !WebInspector.SourceMap>} */ |
| 53 this._sourceMapForScriptId = {}; | 53 this._sourceMapForScriptId = {}; |
| 54 /** @type {!Map.<!WebInspector.SourceMap, !WebInspector.Script>} */ | 54 /** @type {!Map.<!WebInspector.SourceMap, !WebInspector.Script>} */ |
| 55 this._scriptForSourceMap = new Map(); | 55 this._scriptForSourceMap = new Map(); |
| 56 /** @type {!Map.<string, !WebInspector.SourceMap>} */ | 56 /** @type {!Map.<string, !WebInspector.SourceMap>} */ |
| 57 this._sourceMapForURL = new Map(); | 57 this._sourceMapForURL = new Map(); |
| 58 /** @type {!Map.<string, !WebInspector.UISourceCode>} */ |
| 59 this._stubUISourceCodes = new Map(); |
| 60 |
| 61 this._stubProjectID = "compiler-script-project"; |
| 62 this._stubProjectDelegate = new WebInspector.ContentProviderBasedProjectDele
gate(this._workspace, this._stubProjectID, WebInspector.projectTypes.Service); |
| 58 debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjec
tCleared, this._debuggerReset, this); | 63 debuggerModel.addEventListener(WebInspector.DebuggerModel.Events.GlobalObjec
tCleared, this._debuggerReset, this); |
| 59 } | 64 } |
| 60 | 65 |
| 61 WebInspector.CompilerScriptMapping.prototype = { | 66 WebInspector.CompilerScriptMapping.prototype = { |
| 62 /** | 67 /** |
| 63 * @param {!WebInspector.DebuggerModel.Location} rawLocation | 68 * @param {!WebInspector.DebuggerModel.Location} rawLocation |
| 64 * @return {?WebInspector.UILocation} | 69 * @return {?WebInspector.UILocation} |
| 65 */ | 70 */ |
| 66 rawLocationToUILocation: function(rawLocation) | 71 rawLocationToUILocation: function(rawLocation) |
| 67 { | 72 { |
| 68 var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Locat
ion} */ (rawLocation); | 73 var debuggerModelLocation = /** @type {!WebInspector.DebuggerModel.Locat
ion} */ (rawLocation); |
| 74 |
| 75 var stubUISourceCode = this._stubUISourceCodes.get(debuggerModelLocation
.scriptId); |
| 76 if (stubUISourceCode) |
| 77 return new WebInspector.UILocation(stubUISourceCode, 0, 0); |
| 78 |
| 69 var sourceMap = this._sourceMapForScriptId[debuggerModelLocation.scriptI
d]; | 79 var sourceMap = this._sourceMapForScriptId[debuggerModelLocation.scriptI
d]; |
| 70 if (!sourceMap) | 80 if (!sourceMap) |
| 71 return null; | 81 return null; |
| 72 var lineNumber = debuggerModelLocation.lineNumber; | 82 var lineNumber = debuggerModelLocation.lineNumber; |
| 73 var columnNumber = debuggerModelLocation.columnNumber || 0; | 83 var columnNumber = debuggerModelLocation.columnNumber || 0; |
| 74 var entry = sourceMap.findEntry(lineNumber, columnNumber); | 84 var entry = sourceMap.findEntry(lineNumber, columnNumber); |
| 75 if (!entry || entry.length === 2) | 85 if (!entry || entry.length === 2) |
| 76 return null; | 86 return null; |
| 77 var url = /** @type {string} */ (entry[2]); | 87 var url = /** @type {string} */ (entry[2]); |
| 78 var uiSourceCode = this._workspace.uiSourceCodeForURL(url); | 88 var uiSourceCode = this._workspace.uiSourceCodeForURL(url); |
| 79 if (!uiSourceCode) | 89 if (!uiSourceCode) |
| 80 return null; | 90 return null; |
| 81 return uiSourceCode.uiLocation(/** @type {number} */ (entry[3]), /** @ty
pe {number} */ (entry[4])); | 91 return uiSourceCode.uiLocation(/** @type {number} */ (entry[3]), /** @ty
pe {number} */ (entry[4])); |
| 82 }, | 92 }, |
| 83 | 93 |
| 84 /** | 94 /** |
| 85 * @param {!WebInspector.UISourceCode} uiSourceCode | 95 * @param {!WebInspector.UISourceCode} uiSourceCode |
| 86 * @param {number} lineNumber | 96 * @param {number} lineNumber |
| 87 * @param {number} columnNumber | 97 * @param {number} columnNumber |
| 88 * @return {?WebInspector.DebuggerModel.Location} | 98 * @return {?WebInspector.DebuggerModel.Location} |
| 89 */ | 99 */ |
| 90 uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) | 100 uiLocationToRawLocation: function(uiSourceCode, lineNumber, columnNumber) |
| 91 { | 101 { |
| 102 if (uiSourceCode.project().type() === WebInspector.projectTypes.Service) |
| 103 return null; |
| 92 if (!uiSourceCode.url) | 104 if (!uiSourceCode.url) |
| 93 return null; | 105 return null; |
| 94 var sourceMap = this._sourceMapForURL.get(uiSourceCode.url); | 106 var sourceMap = this._sourceMapForURL.get(uiSourceCode.url); |
| 95 if (!sourceMap) | 107 if (!sourceMap) |
| 96 return null; | 108 return null; |
| 97 var script = /** @type {!WebInspector.Script} */ (this._scriptForSourceM
ap.get(sourceMap)); | 109 var script = /** @type {!WebInspector.Script} */ (this._scriptForSourceM
ap.get(sourceMap)); |
| 98 console.assert(script); | 110 console.assert(script); |
| 99 var mappingSearchLinesCount = 5; | 111 var mappingSearchLinesCount = 5; |
| 100 // We do not require precise (breakpoint) location but limit the number
of lines to search or mapping. | 112 // We do not require precise (breakpoint) location but limit the number
of lines to search or mapping. |
| 101 var entry = sourceMap.findEntryReversed(uiSourceCode.url, lineNumber, ma
ppingSearchLinesCount); | 113 var entry = sourceMap.findEntryReversed(uiSourceCode.url, lineNumber, ma
ppingSearchLinesCount); |
| 102 if (!entry) | 114 if (!entry) |
| 103 return null; | 115 return null; |
| 104 return this._debuggerModel.createRawLocation(script, /** @type {number}
*/ (entry[0]), /** @type {number} */ (entry[1])); | 116 return this._debuggerModel.createRawLocation(script, /** @type {number}
*/ (entry[0]), /** @type {number} */ (entry[1])); |
| 105 }, | 117 }, |
| 106 | 118 |
| 107 /** | 119 /** |
| 108 * @param {!WebInspector.Script} script | 120 * @param {!WebInspector.Script} script |
| 109 */ | 121 */ |
| 110 addScript: function(script) | 122 addScript: function(script) |
| 111 { | 123 { |
| 112 if (!script.sourceMapURL) { | 124 if (!script.sourceMapURL) { |
| 113 script.addEventListener(WebInspector.Script.Events.SourceMapURLAdded
, this._sourceMapURLAdded.bind(this)); | 125 script.addEventListener(WebInspector.Script.Events.SourceMapURLAdded
, this._sourceMapURLAdded.bind(this)); |
| 114 return; | 126 return; |
| 115 } | 127 } |
| 128 |
| 116 this._processScript(script); | 129 this._processScript(script); |
| 117 }, | 130 }, |
| 118 | 131 |
| 119 /** | 132 /** |
| 120 * @param {!WebInspector.Event} event | 133 * @param {!WebInspector.Event} event |
| 121 */ | 134 */ |
| 122 _sourceMapURLAdded: function(event) | 135 _sourceMapURLAdded: function(event) |
| 123 { | 136 { |
| 124 var script = /** @type {!WebInspector.Script} */ (event.target); | 137 var script = /** @type {!WebInspector.Script} */ (event.target); |
| 125 if (!script.sourceMapURL) | 138 if (!script.sourceMapURL) |
| 126 return; | 139 return; |
| 127 this._processScript(script); | 140 this._processScript(script); |
| 128 }, | 141 }, |
| 129 | 142 |
| 130 /** | 143 /** |
| 131 * @param {!WebInspector.Script} script | 144 * @param {!WebInspector.Script} script |
| 132 */ | 145 */ |
| 133 _processScript: function(script) | 146 _processScript: function(script) |
| 134 { | 147 { |
| 148 // Create stub UISourceCode for the time source mapping is being loaded. |
| 149 var url = script.sourceURL; |
| 150 var splitURL = WebInspector.ParsedURL.splitURLIntoPathComponents(url); |
| 151 var projectName = splitURL[0]; |
| 152 var parentPath = splitURL.slice(1, -1).join("/"); |
| 153 var name = splitURL.peekLast() || ""; |
| 154 var uiSourceCodePath = this._stubProjectDelegate.addContentProvider(pare
ntPath, name, url, url, new WebInspector.StaticContentProvider(WebInspector.reso
urceTypes.Script, "\n\n\n\n\n// Please wait a bit.\n// Compiled script is not sh
own while source map is being loaded!", url)); |
| 155 var stubUISourceCode = /** @type {!WebInspector.UISourceCode} */ (this._
workspace.uiSourceCode(this._stubProjectID, uiSourceCodePath)); |
| 156 this._stubUISourceCodes.set(script.scriptId, stubUISourceCode); |
| 157 |
| 135 this._debuggerWorkspaceBinding.pushSourceMapping(script, this); | 158 this._debuggerWorkspaceBinding.pushSourceMapping(script, this); |
| 136 this._loadSourceMapForScript(script, sourceMapLoaded.bind(this)); | 159 this._loadSourceMapForScript(script, sourceMapLoaded.bind(this)); |
| 137 | 160 |
| 138 /** | 161 /** |
| 139 * @param {?WebInspector.SourceMap} sourceMap | 162 * @param {?WebInspector.SourceMap} sourceMap |
| 140 * @this {WebInspector.CompilerScriptMapping} | 163 * @this {WebInspector.CompilerScriptMapping} |
| 141 */ | 164 */ |
| 142 function sourceMapLoaded(sourceMap) | 165 function sourceMapLoaded(sourceMap) |
| 143 { | 166 { |
| 144 if (!sourceMap) | 167 this._stubUISourceCodes.delete(script.scriptId); |
| 168 this._stubProjectDelegate.removeFile(uiSourceCodePath); |
| 169 |
| 170 if (!sourceMap) { |
| 171 this._debuggerWorkspaceBinding.updateLocations(script); |
| 145 return; | 172 return; |
| 173 } |
| 146 | 174 |
| 147 if (this._scriptForSourceMap.get(sourceMap)) { | 175 if (this._scriptForSourceMap.get(sourceMap)) { |
| 148 this._sourceMapForScriptId[script.scriptId] = sourceMap; | 176 this._sourceMapForScriptId[script.scriptId] = sourceMap; |
| 149 this._debuggerWorkspaceBinding.updateLocations(script); | 177 this._debuggerWorkspaceBinding.updateLocations(script); |
| 150 return; | 178 return; |
| 151 } | 179 } |
| 152 | 180 |
| 153 this._sourceMapForScriptId[script.scriptId] = sourceMap; | 181 this._sourceMapForScriptId[script.scriptId] = sourceMap; |
| 154 this._scriptForSourceMap.set(sourceMap, script); | 182 this._scriptForSourceMap.set(sourceMap, script); |
| 155 | 183 |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 313 this._sourceMapForScriptId = {}; | 341 this._sourceMapForScriptId = {}; |
| 314 this._scriptForSourceMap.clear(); | 342 this._scriptForSourceMap.clear(); |
| 315 this._sourceMapForURL.clear(); | 343 this._sourceMapForURL.clear(); |
| 316 }, | 344 }, |
| 317 | 345 |
| 318 dispose: function() | 346 dispose: function() |
| 319 { | 347 { |
| 320 this._workspace.removeEventListener(WebInspector.Workspace.Events.UISour
ceCodeAdded, this._uiSourceCodeAddedToWorkspace, this); | 348 this._workspace.removeEventListener(WebInspector.Workspace.Events.UISour
ceCodeAdded, this._uiSourceCodeAddedToWorkspace, this); |
| 321 } | 349 } |
| 322 } | 350 } |
| OLD | NEW |