| OLD | NEW |
| 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /** @typedef {{startOffset: number, endOffset: number, count: number}} */ | 5 /** @typedef {{startOffset: number, endOffset: number, count: number}} */ |
| 6 Coverage.RangeUseCount; | 6 Coverage.RangeUseCount; |
| 7 | 7 |
| 8 /** @typedef {{end: number, count: (number|undefined), depth: number}} */ | 8 /** @typedef {{end: number, count: (number|undefined)}} */ |
| 9 Coverage.CoverageSegment; | 9 Coverage.CoverageSegment; |
| 10 | 10 |
| 11 /** | 11 /** |
| 12 * @enum {number} | 12 * @enum {number} |
| 13 */ | 13 */ |
| 14 Coverage.CoverageType = { | 14 Coverage.CoverageType = { |
| 15 CSS: (1 << 0), | 15 CSS: (1 << 0), |
| 16 JavaScript: (1 << 1), | 16 JavaScript: (1 << 1), |
| 17 }; | 17 }; |
| 18 | 18 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 * @param {!Array<!Coverage.RangeUseCount>} ranges | 81 * @param {!Array<!Coverage.RangeUseCount>} ranges |
| 82 * @return {!Array<!Coverage.CoverageSegment>} | 82 * @return {!Array<!Coverage.CoverageSegment>} |
| 83 */ | 83 */ |
| 84 static _convertToDisjointSegments(ranges) { | 84 static _convertToDisjointSegments(ranges) { |
| 85 var result = []; | 85 var result = []; |
| 86 | 86 |
| 87 var stack = []; | 87 var stack = []; |
| 88 for (var entry of ranges) { | 88 for (var entry of ranges) { |
| 89 var top = stack.peekLast(); | 89 var top = stack.peekLast(); |
| 90 while (top && top.endOffset <= entry.startOffset) { | 90 while (top && top.endOffset <= entry.startOffset) { |
| 91 append(top.endOffset, top.count, stack.length); | 91 append(top.endOffset, top.count); |
| 92 stack.pop(); | 92 stack.pop(); |
| 93 top = stack.peekLast(); | 93 top = stack.peekLast(); |
| 94 } | 94 } |
| 95 append(entry.startOffset, top ? top.count : undefined, stack.length); | 95 append(entry.startOffset, top ? top.count : undefined); |
| 96 stack.push(entry); | 96 stack.push(entry); |
| 97 } | 97 } |
| 98 | 98 |
| 99 while (stack.length) { | 99 while (stack.length) { |
| 100 var depth = stack.length; | |
| 101 var top = stack.pop(); | 100 var top = stack.pop(); |
| 102 append(top.endOffset, top.count, depth); | 101 append(top.endOffset, top.count); |
| 103 } | 102 } |
| 104 | 103 |
| 105 /** | 104 /** |
| 106 * @param {number} end | 105 * @param {number} end |
| 107 * @param {number} count | 106 * @param {number} count |
| 108 * @param {number} depth | |
| 109 */ | 107 */ |
| 110 function append(end, count, depth) { | 108 function append(end, count) { |
| 111 var last = result.peekLast(); | 109 var last = result.peekLast(); |
| 112 if (last) { | 110 if (last) { |
| 113 if (last.end === end) | 111 if (last.end === end) |
| 114 return; | 112 return; |
| 115 if (last.count === count && last.depth === depth) { | 113 if (last.count === count) { |
| 116 last.end = end; | 114 last.end = end; |
| 117 return; | 115 return; |
| 118 } | 116 } |
| 119 } | 117 } |
| 120 result.push({end: end, count: count, depth: depth}); | 118 result.push({end: end, count: count}); |
| 121 } | 119 } |
| 122 | 120 |
| 123 return result; | 121 return result; |
| 124 } | 122 } |
| 125 | 123 |
| 126 async _stopCSSCoverage() { | 124 async _stopCSSCoverage() { |
| 127 if (!this._cssModel) | 125 if (!this._cssModel) |
| 128 return []; | 126 return []; |
| 129 | 127 |
| 130 var rawCoverageData = await this._cssModel.ruleListPromise(); | 128 var rawCoverageData = await this._cssModel.ruleListPromise(); |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 311 static _mergeCoverage(segmentsA, segmentsB) { | 309 static _mergeCoverage(segmentsA, segmentsB) { |
| 312 var result = []; | 310 var result = []; |
| 313 | 311 |
| 314 var indexA = 0; | 312 var indexA = 0; |
| 315 var indexB = 0; | 313 var indexB = 0; |
| 316 while (indexA < segmentsA.length && indexB < segmentsB.length) { | 314 while (indexA < segmentsA.length && indexB < segmentsB.length) { |
| 317 var a = segmentsA[indexA]; | 315 var a = segmentsA[indexA]; |
| 318 var b = segmentsB[indexB]; | 316 var b = segmentsB[indexB]; |
| 319 var count = | 317 var count = |
| 320 typeof a.count === 'number' || typeof b.count === 'number' ? (a.count
|| 0) + (b.count || 0) : undefined; | 318 typeof a.count === 'number' || typeof b.count === 'number' ? (a.count
|| 0) + (b.count || 0) : undefined; |
| 321 var depth = Math.max(a.depth, b.depth); | |
| 322 var end = Math.min(a.end, b.end); | 319 var end = Math.min(a.end, b.end); |
| 323 var last = result.peekLast(); | 320 var last = result.peekLast(); |
| 324 if (!last || last.count !== count || last.depth !== depth) | 321 if (!last || last.count !== count) |
| 325 result.push({end: end, count: count, depth: depth}); | 322 result.push({end: end, count: count}); |
| 326 else | 323 else |
| 327 last.end = end; | 324 last.end = end; |
| 328 if (a.end <= b.end) | 325 if (a.end <= b.end) |
| 329 indexA++; | 326 indexA++; |
| 330 if (a.end >= b.end) | 327 if (a.end >= b.end) |
| 331 indexB++; | 328 indexB++; |
| 332 } | 329 } |
| 333 | 330 |
| 334 for (; indexA < segmentsA.length; indexA++) | 331 for (; indexA < segmentsA.length; indexA++) |
| 335 result.push(segmentsA[indexA]); | 332 result.push(segmentsA[indexA]); |
| 336 for (; indexB < segmentsB.length; indexB++) | 333 for (; indexB < segmentsB.length; indexB++) |
| 337 result.push(segmentsB[indexB]); | 334 result.push(segmentsB[indexB]); |
| 338 return result; | 335 return result; |
| 339 } | 336 } |
| 340 | 337 |
| 341 /** | 338 /** |
| 342 * @return {!Promise<!Array<!{range: !Common.TextRange, count: number}>>} | 339 * @return {!Promise<!Array<!{range: !Common.TextRange, count: number}>>} |
| 343 */ | 340 */ |
| 344 async buildTextRanges() { | 341 async buildTextRanges() { |
| 345 var contents = await this._contentProvider.requestContent(); | 342 var contents = await this._contentProvider.requestContent(); |
| 346 if (!contents) | 343 if (!contents) |
| 347 return []; | 344 return []; |
| 348 var text = new Common.Text(contents); | 345 var text = new Common.Text(contents); |
| 349 var lastOffset = 0; | 346 var lastOffset = 0; |
| 350 var rangesByDepth = []; | 347 var result = []; |
| 351 for (var segment of this._segments) { | 348 for (var segment of this._segments) { |
| 352 if (typeof segment.count !== 'number') { | 349 if (!segment.end) |
| 353 lastOffset = segment.end; | |
| 354 continue; | 350 continue; |
| 355 } | |
| 356 var startPosition = text.positionFromOffset(lastOffset); | 351 var startPosition = text.positionFromOffset(lastOffset); |
| 357 var endPosition = text.positionFromOffset(segment.end); | 352 var endPosition = text.positionFromOffset(segment.end); |
| 358 if (!startPosition.lineNumber) | 353 if (!startPosition.lineNumber) |
| 359 startPosition.columnNumber += this._columnOffset; | 354 startPosition.columnNumber += this._columnOffset; |
| 360 startPosition.lineNumber += this._lineOffset; | 355 startPosition.lineNumber += this._lineOffset; |
| 361 if (!endPosition.lineNumber) | 356 if (!endPosition.lineNumber) |
| 362 endPosition.columnNumber += this._columnOffset; | 357 endPosition.columnNumber += this._columnOffset; |
| 363 endPosition.lineNumber += this._lineOffset; | 358 endPosition.lineNumber += this._lineOffset; |
| 364 | 359 var range = new Common.TextRange( |
| 365 var ranges = rangesByDepth[segment.depth - 1]; // depth === 0 => count ==
= undefined | 360 startPosition.lineNumber, startPosition.columnNumber, endPosition.line
Number, endPosition.columnNumber); |
| 366 if (!ranges) { | 361 result.push({count: segment.count || 0, range: range}); |
| 367 ranges = []; | |
| 368 rangesByDepth[segment.depth - 1] = ranges; | |
| 369 } | |
| 370 ranges.push({ | |
| 371 count: segment.count, | |
| 372 range: new Common.TextRange( | |
| 373 startPosition.lineNumber, startPosition.columnNumber, endPosition.li
neNumber, endPosition.columnNumber) | |
| 374 }); | |
| 375 lastOffset = segment.end; | 362 lastOffset = segment.end; |
| 376 } | 363 } |
| 377 var result = []; | |
| 378 for (var ranges of rangesByDepth) { | |
| 379 for (var r of ranges) | |
| 380 result.push({count: r.count, range: r.range}); | |
| 381 } | |
| 382 return result; | 364 return result; |
| 383 } | 365 } |
| 384 | 366 |
| 385 _updateStats() { | 367 _updateStats() { |
| 386 this._usedSize = 0; | 368 this._usedSize = 0; |
| 387 this._unusedSize = 0; | 369 this._unusedSize = 0; |
| 388 | 370 |
| 389 var last = 0; | 371 var last = 0; |
| 390 for (var segment of this._segments) { | 372 for (var segment of this._segments) { |
| 391 if (typeof segment.count === 'number') { | 373 if (typeof segment.count === 'number') { |
| 392 if (segment.count) | 374 if (segment.count) |
| 393 this._usedSize += segment.end - last; | 375 this._usedSize += segment.end - last; |
| 394 else | 376 else |
| 395 this._unusedSize += segment.end - last; | 377 this._unusedSize += segment.end - last; |
| 396 } | 378 } |
| 397 last = segment.end; | 379 last = segment.end; |
| 398 } | 380 } |
| 399 } | 381 } |
| 400 }; | 382 }; |
| OLD | NEW |