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 {{ | 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 Loading... |
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 Loading... |
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 }; |
OLD | NEW |