Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(17)

Side by Side Diff: Source/devtools/front_end/sdk/SourceMap.js

Issue 1328843002: DevTools: introduce WI.SourceMap.Entry structure and cleanup WI.SourceMap API. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: fix test Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
69 WebInspector.SourceMap = function(sourceMappingURL, payload) 69 WebInspector.SourceMap = function(sourceMappingURL, payload)
70 { 70 {
71 if (!WebInspector.SourceMap.prototype._base64Map) { 71 if (!WebInspector.SourceMap.prototype._base64Map) {
72 const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/"; 72 const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwx yz0123456789+/";
73 WebInspector.SourceMap.prototype._base64Map = {}; 73 WebInspector.SourceMap.prototype._base64Map = {};
74 for (var i = 0; i < base64Digits.length; ++i) 74 for (var i = 0; i < base64Digits.length; ++i)
75 WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i; 75 WebInspector.SourceMap.prototype._base64Map[base64Digits.charAt(i)] = i;
76 } 76 }
77 77
78 this._sourceMappingURL = sourceMappingURL; 78 this._sourceMappingURL = sourceMappingURL;
79 this._reverseMappingsBySourceURL = {}; 79 this._reverseMappingsBySourceURL = new Map();
80 this._mappings = []; 80 this._mappings = [];
81 this._sources = {}; 81 this._sources = {};
82 this._sourceContentByURL = {}; 82 this._sourceContentByURL = {};
83 this._parseMappingPayload(payload); 83 this._parseMappingPayload(payload);
84 } 84 }
85 85
86 /** 86 /**
87 * @param {string} sourceMapURL 87 * @param {string} sourceMapURL
88 * @param {string} compiledURL 88 * @param {string} compiledURL
89 * @param {function(?WebInspector.SourceMap)} callback 89 * @param {function(?WebInspector.SourceMap)} callback
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 { 184 {
185 for (var i = 0; i < sections.length; ++i) { 185 for (var i = 0; i < sections.length; ++i) {
186 var section = sections[i]; 186 var section = sections[i];
187 this._parseMap(section.map, section.offset.line, section.offset.colu mn); 187 this._parseMap(section.map, section.offset.line, section.offset.colu mn);
188 } 188 }
189 }, 189 },
190 190
191 /** 191 /**
192 * @param {number} lineNumber in compiled resource 192 * @param {number} lineNumber in compiled resource
193 * @param {number} columnNumber in compiled resource 193 * @param {number} columnNumber in compiled resource
194 * @return {?Array.<number|string>} 194 * @return {?WebInspector.SourceMap.Entry}
195 */ 195 */
196 findEntry: function(lineNumber, columnNumber) 196 findEntry: function(lineNumber, columnNumber)
197 { 197 {
198 var first = 0; 198 var first = 0;
199 var count = this._mappings.length; 199 var count = this._mappings.length;
200 while (count > 1) { 200 while (count > 1) {
201 var step = count >> 1; 201 var step = count >> 1;
202 var middle = first + step; 202 var middle = first + step;
203 var mapping = this._mappings[middle]; 203 var mapping = this._mappings[middle];
204 if (lineNumber < mapping[0] || (lineNumber === mapping[0] && columnNum ber < mapping[1])) 204 if (lineNumber < mapping.lineNumber || (lineNumber === mapping.lineNum ber && columnNumber < mapping.columnNumber))
205 count = step; 205 count = step;
206 else { 206 else {
207 first = middle; 207 first = middle;
208 count -= step; 208 count -= step;
209 } 209 }
210 } 210 }
211 var entry = this._mappings[first]; 211 var entry = this._mappings[first];
212 if (!first && entry && (lineNumber < entry[0] || (lineNumber === entry[0 ] && columnNumber < entry[1]))) 212 if (!first && entry && (lineNumber < entry.lineNumber || (lineNumber === entry.lineNumber && columnNumber < entry.columnNumber)))
213 return null; 213 return null;
214 return entry; 214 return entry;
215 }, 215 },
216 216
217 /** 217 /**
218 * @param {string} sourceURL of the originating resource 218 * @param {string} sourceURL
219 * @param {number} lineNumber in the originating resource 219 * @param {number} lineNumber
220 * @param {number=} span 220 * @return {?WebInspector.SourceMap.Entry}
221 * @return {?Array.<*>}
222 */ 221 */
223 findEntryReversed: function(sourceURL, lineNumber, span) 222 firstSourceLineMapping: function(sourceURL, lineNumber)
224 { 223 {
225 var mappings = this._reverseMappingsBySourceURL[sourceURL]; 224 var mappings = this._reversedMappings(sourceURL);
226 if (!mappings) 225 var index = mappings.lowerBound(lineNumber, lineComparator);
226 if (index >= mappings.length || mappings[index].sourceLineNumber !== lin eNumber)
227 return null; 227 return null;
228 var maxLineNumber = typeof span === "number" ? Math.min(lineNumber + spa n + 1, mappings.length) : mappings.length; 228 var minColumn = mappings[index];
229 for ( ; lineNumber < maxLineNumber; ++lineNumber) { 229 for (var i = index + 1; i < mappings.length && mappings[i].sourceLineNum ber === lineNumber; ++i) {
230 var mapping = mappings[lineNumber]; 230 if (minColumn.sourceColumnNumber > mappings[i].sourceColumnNumber)
231 if (mapping) 231 minColumn = mappings[i];
232 return mapping;
233 } 232 }
234 return null; 233 return minColumn;
234
235 /**
236 * @param {number} lineNumber
237 * @param {!WebInspector.SourceMap.Entry} mapping
238 * @return {number}
239 */
240 function lineComparator(lineNumber, mapping)
241 {
242 return lineNumber - mapping.sourceLineNumber;
243 }
235 }, 244 },
236 245
237 /** 246 /**
247 * @param {string} sourceURL
248 * @return {!Array.<!WebInspector.SourceMap.Entry>}
249 */
250 _reversedMappings: function(sourceURL)
251 {
252 var mappings = this._reverseMappingsBySourceURL.get(sourceURL);
253 if (!mappings)
254 return [];
255 if (!mappings._sorted) {
256 mappings.sort(sourceMappingComparator);
257 mappings._sorted = true;
258 }
259 return mappings;
260
261 /**
262 * @param {!WebInspector.SourceMap.Entry} a
263 * @param {!WebInspector.SourceMap.Entry} b
264 * @return {number}
265 */
266 function sourceMappingComparator(a, b)
267 {
268 if (a.sourceLineNumber !== b.sourceLineNumber)
269 return a.sourceLineNumber - b.sourceLineNumber;
270 return a.sourceColumnNumber - b.sourceColumnNumber;
271 }
272 },
273
274 /**
238 * @param {!SourceMapV3} map 275 * @param {!SourceMapV3} map
239 * @param {number} lineNumber 276 * @param {number} lineNumber
240 * @param {number} columnNumber 277 * @param {number} columnNumber
241 */ 278 */
242 _parseMap: function(map, lineNumber, columnNumber) 279 _parseMap: function(map, lineNumber, columnNumber)
243 { 280 {
244 var sourceIndex = 0; 281 var sourceIndex = 0;
245 var sourceLineNumber = 0; 282 var sourceLineNumber = 0;
246 var sourceColumnNumber = 0; 283 var sourceColumnNumber = 0;
247 var nameIndex = 0; 284 var nameIndex = 0;
(...skipping 26 matching lines...) Expand all
274 lineNumber += 1; 311 lineNumber += 1;
275 columnNumber = 0; 312 columnNumber = 0;
276 stringCharIterator.next(); 313 stringCharIterator.next();
277 } 314 }
278 if (!stringCharIterator.hasNext()) 315 if (!stringCharIterator.hasNext())
279 break; 316 break;
280 } 317 }
281 318
282 columnNumber += this._decodeVLQ(stringCharIterator); 319 columnNumber += this._decodeVLQ(stringCharIterator);
283 if (!stringCharIterator.hasNext() || this._isSeparator(stringCharIte rator.peek())) { 320 if (!stringCharIterator.hasNext() || this._isSeparator(stringCharIte rator.peek())) {
284 this._mappings.push([lineNumber, columnNumber]); 321 this._mappings.push(new WebInspector.SourceMap.Entry(lineNumber, columnNumber));
285 continue; 322 continue;
286 } 323 }
287 324
288 var sourceIndexDelta = this._decodeVLQ(stringCharIterator); 325 var sourceIndexDelta = this._decodeVLQ(stringCharIterator);
289 if (sourceIndexDelta) { 326 if (sourceIndexDelta) {
290 sourceIndex += sourceIndexDelta; 327 sourceIndex += sourceIndexDelta;
291 sourceURL = sources[sourceIndex]; 328 sourceURL = sources[sourceIndex];
292 } 329 }
293 sourceLineNumber += this._decodeVLQ(stringCharIterator); 330 sourceLineNumber += this._decodeVLQ(stringCharIterator);
294 sourceColumnNumber += this._decodeVLQ(stringCharIterator); 331 sourceColumnNumber += this._decodeVLQ(stringCharIterator);
295 if (!this._isSeparator(stringCharIterator.peek())) 332 if (!this._isSeparator(stringCharIterator.peek()))
296 nameIndex += this._decodeVLQ(stringCharIterator); 333 nameIndex += this._decodeVLQ(stringCharIterator);
297 334
298 this._mappings.push([lineNumber, columnNumber, sourceURL, sourceLine Number, sourceColumnNumber]); 335 this._mappings.push(new WebInspector.SourceMap.Entry(lineNumber, col umnNumber, sourceURL, sourceLineNumber, sourceColumnNumber));
299 } 336 }
300 337
301 for (var i = 0; i < this._mappings.length; ++i) { 338 for (var i = 0; i < this._mappings.length; ++i) {
302 var mapping = this._mappings[i]; 339 var mapping = this._mappings[i];
303 var url = mapping[2]; 340 var url = mapping.sourceURL;
304 if (!url) 341 if (!url)
305 continue; 342 continue;
306 if (!this._reverseMappingsBySourceURL[url]) 343 if (!this._reverseMappingsBySourceURL.has(url))
307 this._reverseMappingsBySourceURL[url] = []; 344 this._reverseMappingsBySourceURL.set(url, []);
308 var reverseMappings = this._reverseMappingsBySourceURL[url]; 345 var reverseMappings = this._reverseMappingsBySourceURL.get(url);
309 var sourceLine = mapping[3]; 346 reverseMappings.push(mapping);
pfeldman 2015/09/04 01:38:36 reverseMapping.get(mapping.lineNumber).push(mappin
lushnikov 2015/09/04 17:46:45 This will render findEntriesReversed implementatio
310 if (!reverseMappings[sourceLine])
311 reverseMappings[sourceLine] = [mapping[0], mapping[1]];
312 } 347 }
313 }, 348 },
314 349
315 /** 350 /**
316 * @param {string} char 351 * @param {string} char
317 * @return {boolean} 352 * @return {boolean}
318 */ 353 */
319 _isSeparator: function(char) 354 _isSeparator: function(char)
320 { 355 {
321 return char === "," || char === ";"; 356 return char === "," || char === ";";
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
375 }, 410 },
376 411
377 /** 412 /**
378 * @return {boolean} 413 * @return {boolean}
379 */ 414 */
380 hasNext: function() 415 hasNext: function()
381 { 416 {
382 return this._position < this._string.length; 417 return this._position < this._string.length;
383 } 418 }
384 } 419 }
420
421 /**
422 * @constructor
423 * @param {number} lineNumber
424 * @param {number} columnNumber
425 * @param {string=} sourceURL
426 * @param {number=} sourceLineNumber
427 * @param {number=} sourceColumnNumber
428 */
429 WebInspector.SourceMap.Entry = function(lineNumber, columnNumber, sourceURL, sou rceLineNumber, sourceColumnNumber)
430 {
431 this.lineNumber = lineNumber;
432 this.columnNumber = columnNumber;
433 this.sourceURL = sourceURL;
434 this.sourceLineNumber = sourceLineNumber;
435 this.sourceColumnNumber = sourceColumnNumber;
436 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698