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

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

Issue 2735133004: DevTools coverage: get script/stylesheet size directly, do not request content (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 unified diff | Download patch
OLDNEW
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 {{ 8 /** @typedef {{
9 * contentProvider: !Common.ContentProvider, 9 * contentProvider: !Common.ContentProvider,
10 * size: (number|undefined), 10 * size: number,
11 * unusedSize: (number|undefined), 11 * unusedSize: number,
12 * usedSize: (number|undefined), 12 * usedSize: number,
13 * type: !Coverage.CoverageType, 13 * type: !Coverage.CoverageType,
14 * lineOffset: number, 14 * lineOffset: number,
15 * columnOffset: number, 15 * columnOffset: number,
16 * ranges: !Array<!Coverage.RangeUseCount> 16 * ranges: !Array<!Coverage.RangeUseCount>
17 * }} 17 * }}
18 */ 18 */
19 Coverage.CoverageInfo; 19 Coverage.CoverageInfo;
20 20
21 /** 21 /**
22 * @enum {number} 22 * @enum {number}
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 var coveragePromise = this._cpuProfilerModel.takePreciseCoverage(); 92 var coveragePromise = this._cpuProfilerModel.takePreciseCoverage();
93 this._cpuProfilerModel.stopPreciseCoverage(); 93 this._cpuProfilerModel.stopPreciseCoverage();
94 var rawCoverageData = await coveragePromise; 94 var rawCoverageData = await coveragePromise;
95 return Coverage.CoverageModel._processJSCoverage( 95 return Coverage.CoverageModel._processJSCoverage(
96 /** @type !SDK.DebuggerModel */ (SDK.DebuggerModel.fromTarget(this.targe t())), rawCoverageData); 96 /** @type !SDK.DebuggerModel */ (SDK.DebuggerModel.fromTarget(this.targe t())), rawCoverageData);
97 } 97 }
98 98
99 /** 99 /**
100 * @param {!SDK.DebuggerModel} debuggerModel 100 * @param {!SDK.DebuggerModel} debuggerModel
101 * @param {!Array<!Protocol.Profiler.ScriptCoverage>} scriptsCoverage 101 * @param {!Array<!Protocol.Profiler.ScriptCoverage>} scriptsCoverage
102 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} 102 * @return {!Array<!Coverage.CoverageInfo>}
103 */ 103 */
104 static async _processJSCoverage(debuggerModel, scriptsCoverage) { 104 static _processJSCoverage(debuggerModel, scriptsCoverage) {
105 var promises = []; 105 var result = [];
106 for (var entry of scriptsCoverage) { 106 for (var entry of scriptsCoverage) {
107 var script = debuggerModel.scriptForId(entry.scriptId); 107 var script = debuggerModel.scriptForId(entry.scriptId);
108 if (!script) 108 if (!script)
109 continue; 109 continue;
110 var ranges = []; 110 var ranges = [];
111 for (var func of entry.functions) { 111 for (var func of entry.functions) {
112 for (var range of func.ranges) 112 for (var range of func.ranges)
113 ranges.push({startOffset: range.startOffset, endOffset: range.endOffse t, count: range.count}); 113 ranges.push({startOffset: range.startOffset, endOffset: range.endOffse t, count: range.count});
114 } 114 }
115 promises.push( 115 result.push(Coverage.CoverageModel._buildCoverageInfo(
116 Coverage.CoverageModel._coverageInfoForText(script, script.lineOffset, script.columnOffset, ranges)); 116 script, script.contentLength, script.lineOffset, script.columnOffset, ranges));
117 } 117 }
118 return Promise.all(promises); 118 return result;
119 } 119 }
120 120
121 /** 121 /**
122 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} 122 * @return {!Promise<!Array<!Coverage.CoverageInfo>>}
123 */ 123 */
124 async _stopCSSCoverage() { 124 async _stopCSSCoverage() {
125 if (!this._cssModel) 125 if (!this._cssModel)
126 return []; 126 return [];
127 127
128 var rawCoverageData = await this._cssModel.ruleListPromise(); 128 var rawCoverageData = await this._cssModel.ruleListPromise();
129 return Coverage.CoverageModel._processCSSCoverage( 129 return Coverage.CoverageModel._processCSSCoverage(
130 /** @type !SDK.CSSModel */ (this._cssModel), rawCoverageData); 130 /** @type !SDK.CSSModel */ (this._cssModel), rawCoverageData);
131 } 131 }
132 132
133 /** 133 /**
134 * @param {!SDK.CSSModel} cssModel 134 * @param {!SDK.CSSModel} cssModel
135 * @param {!Array<!Protocol.CSS.RuleUsage>} ruleUsageList 135 * @param {!Array<!Protocol.CSS.RuleUsage>} ruleUsageList
136 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} 136 * @return {!Array<!Coverage.CoverageInfo>}
137 */ 137 */
138 static async _processCSSCoverage(cssModel, ruleUsageList) { 138 static _processCSSCoverage(cssModel, ruleUsageList) {
139 /** @type {!Map<?SDK.CSSStyleSheetHeader, !Array<!Coverage.RangeUseCount>>} */ 139 /** @type {!Map<?SDK.CSSStyleSheetHeader, !Array<!Coverage.RangeUseCount>>} */
140 var rulesByStyleSheet = new Map(); 140 var rulesByStyleSheet = new Map();
141 for (var rule of ruleUsageList) { 141 for (var rule of ruleUsageList) {
142 var styleSheetHeader = cssModel.styleSheetHeaderForId(rule.styleSheetId); 142 var styleSheetHeader = cssModel.styleSheetHeaderForId(rule.styleSheetId);
143 var ranges = rulesByStyleSheet.get(styleSheetHeader); 143 var ranges = rulesByStyleSheet.get(styleSheetHeader);
144 if (!ranges) { 144 if (!ranges) {
145 ranges = []; 145 ranges = [];
146 rulesByStyleSheet.set(styleSheetHeader, ranges); 146 rulesByStyleSheet.set(styleSheetHeader, ranges);
147 } 147 }
148 ranges.push({startOffset: rule.startOffset, endOffset: rule.endOffset, cou nt: Number(rule.used)}); 148 ranges.push({startOffset: rule.startOffset, endOffset: rule.endOffset, cou nt: Number(rule.used)});
149 } 149 }
150 return Promise.all(Array.from( 150 return Array.from(
151 rulesByStyleSheet.entries(), 151 rulesByStyleSheet.entries(),
152 entry => 152 entry => Coverage.CoverageModel._buildCoverageInfo(
153 Coverage.CoverageModel._coverageInfoForText(entry[0], entry[0].start Line, entry[0].startColumn, entry[1]))); 153 entry[0], entry[0].contentLength, entry[0].startLine, entry[0].start Column, entry[1]));
154 } 154 }
155 155
156 /** 156 /**
157 * @param {!Common.ContentProvider} contentProvider 157 * @param {!Common.ContentProvider} contentProvider
158 * @param {number} contentLength
158 * @param {number} startLine 159 * @param {number} startLine
159 * @param {number} startColumn 160 * @param {number} startColumn
160 * @param {!Array<!Coverage.RangeUseCount>} ranges 161 * @param {!Array<!Coverage.RangeUseCount>} ranges
161 * @return {!Promise<?Coverage.CoverageInfo>} 162 * @return {!Coverage.CoverageInfo}
162 */ 163 */
163 static async _coverageInfoForText(contentProvider, startLine, startColumn, ran ges) { 164 static _buildCoverageInfo(contentProvider, contentLength, startLine, startColu mn, ranges) {
165 /** @type Coverage.CoverageType */
164 var coverageType; 166 var coverageType;
165 var url = contentProvider.contentURL(); 167 var url = contentProvider.contentURL();
166 if (contentProvider.contentType().isScript()) 168 if (contentProvider.contentType().isScript())
167 coverageType = Coverage.CoverageType.JavaScript; 169 coverageType = Coverage.CoverageType.JavaScript;
168 else if (contentProvider.contentType().isStyleSheet()) 170 else if (contentProvider.contentType().isStyleSheet())
169 coverageType = Coverage.CoverageType.CSS; 171 coverageType = Coverage.CoverageType.CSS;
170 else 172 else
171 console.assert(false, `Unexpected resource type ${contentProvider.contentT ype().name} for ${url}`); 173 console.assert(false, `Unexpected resource type ${contentProvider.contentT ype().name} for ${url}`);
172 174
173 var stack = []; 175 var stack = [];
(...skipping 16 matching lines...) Expand all
190 192
191 var usedSize = 0; 193 var usedSize = 0;
192 var unusedSize = 0; 194 var unusedSize = 0;
193 for (var entry of ranges) { 195 for (var entry of ranges) {
194 if (entry.count) 196 if (entry.count)
195 usedSize += entry.ownSize; 197 usedSize += entry.ownSize;
196 else 198 else
197 unusedSize += entry.ownSize; 199 unusedSize += entry.ownSize;
198 } 200 }
199 201
200 // FIXME: get rid of this when we get the size upfront.
201 var content = await contentProvider.requestContent();
202 if (typeof content !== 'string')
203 return null;
204
205 var coverageInfo = { 202 var coverageInfo = {
206 contentProvider: contentProvider, 203 contentProvider: contentProvider,
207 ranges: ranges, 204 ranges: ranges,
208 type: coverageType, 205 type: coverageType,
209 size: content.length, 206 size: contentLength,
210 usedSize: usedSize, 207 usedSize: usedSize,
211 unusedSize: unusedSize, 208 unusedSize: unusedSize,
212 lineOffset: startLine, 209 lineOffset: startLine,
213 columnOffset: startColumn 210 columnOffset: startColumn
214 }; 211 };
215 return coverageInfo; 212 return coverageInfo;
216 } 213 }
217 }; 214 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698