Index: third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js |
diff --git a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js |
index 3f9d743b0ef17de858bb3872b5c46d9973c88f76..f4882d08580960a9f6c6858deb2baacf46c7a741 100644 |
--- a/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js |
+++ b/third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js |
@@ -5,6 +5,9 @@ |
/** @typedef {{startOffset: number, endOffset: number, count: number}} */ |
Coverage.RangeUseCount; |
+/** @typedef {{end: number, count: (number|undefined), depth: number}} */ |
alph
2017/03/10 02:05:09
Wouldn't it be more convenient to have a start ins
|
+Coverage.CoverageSegment; |
+ |
/** @typedef {{ |
* contentProvider: !Common.ContentProvider, |
* size: number, |
@@ -13,7 +16,7 @@ Coverage.RangeUseCount; |
* type: !Coverage.CoverageType, |
* lineOffset: number, |
* columnOffset: number, |
- * ranges: !Array<!Coverage.RangeUseCount> |
+ * segments: !Array<!Coverage.CoverageSegment> |
* }} |
*/ |
Coverage.CoverageInfo; |
@@ -110,8 +113,9 @@ Coverage.CoverageModel = class extends SDK.SDKModel { |
var ranges = []; |
for (var func of entry.functions) { |
for (var range of func.ranges) |
alph
2017/03/10 02:05:08
slice it?
|
- ranges.push({startOffset: range.startOffset, endOffset: range.endOffset, count: range.count}); |
+ ranges.push(range); |
} |
+ ranges.sort((a, b) => a.startOffset - b.startOffset); |
result.push(Coverage.CoverageModel._buildCoverageInfo( |
script, script.contentLength, script.lineOffset, script.columnOffset, ranges)); |
} |
@@ -119,6 +123,47 @@ Coverage.CoverageModel = class extends SDK.SDKModel { |
} |
/** |
+ * @param {!Array<!Coverage.RangeUseCount>} ranges |
+ * @return {!Array<!Coverage.CoverageSegment>} |
+ */ |
+ static _convertToDisjointSegments(ranges) { |
+ var result = []; |
+ |
+ var stack = []; |
+ for (var entry of ranges) { |
+ var top = stack.peekLast(); |
+ while (top && top.endOffset <= entry.startOffset) { |
+ append(top.endOffset, top.count, stack.length); |
+ stack.pop(); |
+ top = stack.peekLast(); |
+ } |
+ append(entry.startOffset, top ? top.count : undefined, stack.length); |
+ stack.push(entry); |
+ } |
+ |
+ while (stack.length) { |
+ var depth = stack.length; |
+ var top = stack.pop(); |
+ append(top.endOffset, top.count, depth); |
+ } |
+ |
+ function append(end, count, depth) { |
alph
2017/03/10 02:05:08
annotate plz
|
+ var last = result.peekLast(); |
+ if (last) { |
+ if (last.end === end) |
+ return; |
+ if (last.count === count && last.depth === depth) { |
+ last.end = end; |
+ return; |
+ } |
+ } |
+ result.push({end: end, count: count, depth: depth}); |
+ } |
+ |
+ return result; |
+ } |
+ |
+ /** |
* @return {!Promise<!Array<!Coverage.CoverageInfo>>} |
*/ |
async _stopCSSCoverage() { |
@@ -172,36 +217,22 @@ Coverage.CoverageModel = class extends SDK.SDKModel { |
else |
console.assert(false, `Unexpected resource type ${contentProvider.contentType().name} for ${url}`); |
- var stack = []; |
- ranges.sort((a, b) => a.startOffset - b.startOffset); |
- for (var entry of ranges) { |
- while (stack.length && stack.peekLast().endOffset <= entry.startOffset) |
- stack.pop(); |
- |
- entry.ownSize = entry.endOffset - entry.startOffset; |
- var top = stack.peekLast(); |
- if (top) { |
- if (top.endOffset < entry.endOffset) { |
- console.assert( |
- false, `Overlapping coverage entries in ${url}: ${top.start}-${top.end} vs. ${entry.start}-${entry.end}`); |
- } |
- top.ownSize -= entry.ownSize; |
- } |
- stack.push(entry); |
- } |
- |
+ var segments = Coverage.CoverageModel._convertToDisjointSegments(ranges); |
var usedSize = 0; |
var unusedSize = 0; |
- for (var entry of ranges) { |
- if (entry.count) |
- usedSize += entry.ownSize; |
- else |
- unusedSize += entry.ownSize; |
+ var last = 0; |
+ for (var segment of segments) { |
+ if (typeof segment.count === 'number') { |
+ if (segment.count) |
+ usedSize += segment.end - last; |
+ else |
+ unusedSize += segment.end - last; |
+ } |
+ last = segment.end; |
} |
- |
var coverageInfo = { |
contentProvider: contentProvider, |
- ranges: ranges, |
+ segments: segments, |
type: coverageType, |
size: contentLength, |
usedSize: usedSize, |