| 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 |