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

Unified Diff: third_party/WebKit/Source/devtools/front_end/coverage/CoverageModel.js

Issue 2740223002: Coverage: convert coverage ranges to disjoint segments before further processing (Closed)
Patch Set: Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
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,

Powered by Google App Engine
This is Rietveld 408576698