Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2016 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 {{range: !Common.TextRange, wasUsed: boolean}} */ | 5 /** @typedef {{range: !Common.TextRange, wasUsed: boolean}} */ |
| 6 Coverage.RangeUsage; | 6 Coverage.RangeUsage; |
| 7 | 7 |
| 8 /** @typedef {{styleSheetHeader: !SDK.CSSStyleSheetHeader, ranges: !Array<!Cover age.RangeUsage>}} */ | 8 /** @typedef {{styleSheetHeader: !SDK.CSSStyleSheetHeader, ranges: !Array<!Cover age.RangeUsage>}} */ |
| 9 Coverage.StyleSheetUsage; | 9 Coverage.StyleSheetUsage; |
| 10 | 10 |
| 11 /** @typedef {{url: string, size: (number|undefined), unusedSize: (number|undefi ned), usedSize: (number|undefined), | 11 /** @typedef {{ |
| 12 * ranges: !Array<!Coverage.RangeUsage>}} */ | 12 * url: string, |
| 13 * size: (number|undefined), | |
| 14 * unusedSize: (number|undefined), | |
| 15 * usedSize: (number|undefined), | |
| 16 * type: !Coverage.CoverageType, | |
| 17 * ranges: !Array<!Coverage.RangeUsage> | |
| 18 * }} | |
| 19 */ | |
| 13 Coverage.CoverageInfo; | 20 Coverage.CoverageInfo; |
| 14 | 21 |
| 22 /** | |
| 23 * @enum {number} | |
| 24 */ | |
| 25 Coverage.CoverageType = { | |
| 26 CSS: (1 << 0), | |
| 27 JavaScript: (1 << 1), | |
| 28 }; | |
| 29 | |
| 15 Coverage.CoverageView = class extends UI.VBox { | 30 Coverage.CoverageView = class extends UI.VBox { |
| 16 constructor() { | 31 constructor() { |
| 17 super(true); | 32 super(true); |
| 18 | 33 |
| 19 this.registerRequiredCSS('coverage/coverageView.css'); | 34 this.registerRequiredCSS('coverage/coverageView.css'); |
| 20 | 35 |
| 21 var toolbarContainer = this.contentElement.createChild('div', 'coverage-tool bar-container'); | 36 var toolbarContainer = this.contentElement.createChild('div', 'coverage-tool bar-container'); |
| 22 var topToolbar = new UI.Toolbar('coverage-toolbar', toolbarContainer); | 37 var topToolbar = new UI.Toolbar('coverage-toolbar', toolbarContainer); |
| 23 | 38 |
| 24 this._toggleRecordAction = | 39 this._toggleRecordAction = |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 105 coverageInfo.sort((a, b) => (a.url || '').localeCompare(b.url)); | 120 coverageInfo.sort((a, b) => (a.url || '').localeCompare(b.url)); |
| 106 var result = []; | 121 var result = []; |
| 107 for (var entry of coverageInfo) { | 122 for (var entry of coverageInfo) { |
| 108 if (!entry.url) | 123 if (!entry.url) |
| 109 continue; | 124 continue; |
| 110 if (result.length && result.peekLast().url === entry.url) { | 125 if (result.length && result.peekLast().url === entry.url) { |
| 111 var lastEntry = result.peekLast(); | 126 var lastEntry = result.peekLast(); |
| 112 lastEntry.size += entry.size; | 127 lastEntry.size += entry.size; |
| 113 lastEntry.usedSize += entry.usedSize; | 128 lastEntry.usedSize += entry.usedSize; |
| 114 lastEntry.unusedSize += entry.unusedSize; | 129 lastEntry.unusedSize += entry.unusedSize; |
| 130 lastEntry.type |= entry.type; | |
| 115 } else { | 131 } else { |
| 116 result.push(entry); | 132 result.push(entry); |
| 117 } | 133 } |
| 118 } | 134 } |
| 119 return result; | 135 return result; |
| 120 } | 136 } |
| 121 | 137 |
| 122 /** | 138 /** |
| 123 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} | 139 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} |
| 124 */ | 140 */ |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 146 var script = debuggerModel.scriptForId(entry.scriptId); | 162 var script = debuggerModel.scriptForId(entry.scriptId); |
| 147 if (!script) | 163 if (!script) |
| 148 continue; | 164 continue; |
| 149 for (var func of entry.functions) { | 165 for (var func of entry.functions) { |
| 150 for (var range of func.ranges) { | 166 for (var range of func.ranges) { |
| 151 var textRange = new Common.TextRange( | 167 var textRange = new Common.TextRange( |
| 152 range.startLineNumber, range.startColumnNumber, range.endLineNumbe r, range.endColumnNumber); | 168 range.startLineNumber, range.startColumnNumber, range.endLineNumbe r, range.endColumnNumber); |
| 153 ranges.push({range: textRange, wasUsed: !!range.count}); | 169 ranges.push({range: textRange, wasUsed: !!range.count}); |
| 154 } | 170 } |
| 155 } | 171 } |
| 156 promises.push(convertToCoverageInfo(script, ranges)); | 172 promises.push(Coverage.CoverageView._coverageInfoForText(script, script.li neOffset, script.columnOffset, ranges)); |
| 157 } | 173 } |
| 158 return Promise.all(promises); | 174 return Promise.all(promises); |
| 159 | |
| 160 /** | |
| 161 * @param {!SDK.Script} script | |
| 162 * @param {!Array<!Coverage.RangeUsage>} ranges | |
| 163 * @return {!Promise<!Coverage.CoverageInfo>} | |
| 164 */ | |
| 165 function convertToCoverageInfo(script, ranges) { | |
| 166 return script.requestContent().then( | |
| 167 content => Coverage.CoverageView._coverageInfoForText( | |
| 168 script.contentURL(), script.lineOffset, script.columnOffset, conte nt, ranges)); | |
| 169 } | |
| 170 } | 175 } |
| 171 | 176 |
| 172 /** | 177 /** |
| 173 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} | 178 * @return {!Promise<!Array<!Coverage.CoverageInfo>>} |
| 174 */ | 179 */ |
| 175 async _stopCSSCoverage() { | 180 async _stopCSSCoverage() { |
| 176 var mainTarget = SDK.targetManager.mainTarget(); | 181 var mainTarget = SDK.targetManager.mainTarget(); |
| 177 const cssModel = mainTarget && mainTarget.model(SDK.CSSModel); | 182 const cssModel = mainTarget && mainTarget.model(SDK.CSSModel); |
| 178 if (!cssModel) | 183 if (!cssModel) |
| 179 return Promise.resolve([]); | 184 return Promise.resolve([]); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 198 ranges = []; | 203 ranges = []; |
| 199 rulesByStyleSheet.set(styleSheetHeader, ranges); | 204 rulesByStyleSheet.set(styleSheetHeader, ranges); |
| 200 } | 205 } |
| 201 var textRange = new Common.TextRange( | 206 var textRange = new Common.TextRange( |
| 202 rule.range.startLine + styleSheetHeader.startLine, | 207 rule.range.startLine + styleSheetHeader.startLine, |
| 203 rule.range.startColumn + (rule.range.startLine ? 0 : styleSheetHeader. startColumn), | 208 rule.range.startColumn + (rule.range.startLine ? 0 : styleSheetHeader. startColumn), |
| 204 rule.range.endLine + styleSheetHeader.startLine, | 209 rule.range.endLine + styleSheetHeader.startLine, |
| 205 rule.range.endColumn + (rule.range.endLine ? 0 : styleSheetHeader.star tColumn)); | 210 rule.range.endColumn + (rule.range.endLine ? 0 : styleSheetHeader.star tColumn)); |
| 206 ranges.push({range: textRange, wasUsed: rule.wasUsed}); | 211 ranges.push({range: textRange, wasUsed: rule.wasUsed}); |
| 207 } | 212 } |
| 208 return Promise.all(Array.from(rulesByStyleSheet.entries(), entry => convertT oCoverageInfo(entry[0], entry[1]))); | 213 return Promise.all(Array.from( |
| 209 | 214 rulesByStyleSheet.entries(), entry => Coverage.CoverageView._coverageInf oForText( |
|
alph
2017/02/28 01:10:38
nit: ([header, ranges]) => Coverage.CoverageView._
| |
| 210 /** | 215 entry[0], entry[0].startLine, entry[0]. startColumn, entry[1]))); |
| 211 * @param {!SDK.CSSStyleSheetHeader} styleSheetHeader | |
| 212 * @param {!Array<!Coverage.RangeUsage>} ranges | |
| 213 * @return {!Promise<!Coverage.CoverageInfo>} | |
| 214 */ | |
| 215 function convertToCoverageInfo(styleSheetHeader, ranges) { | |
| 216 return styleSheetHeader.requestContent().then( | |
| 217 content => Coverage.CoverageView._coverageInfoForText( | |
| 218 styleSheetHeader.sourceURL, styleSheetHeader.startLine, styleSheet Header.startColumn, content, ranges)); | |
| 219 } | |
| 220 } | 216 } |
| 221 | 217 |
| 222 /** | 218 /** |
| 223 * @param {string} url | 219 * @param {!Common.ContentProvider} contentProvider |
| 224 * @param {number} startLine | 220 * @param {number} startLine |
| 225 * @param {number} startColumn | 221 * @param {number} startColumn |
| 226 * @param {?string} content | |
| 227 * @param {!Array<!Coverage.RangeUsage>} ranges | 222 * @param {!Array<!Coverage.RangeUsage>} ranges |
| 228 * @return {!Coverage.CoverageInfo} | 223 * @return {!Promise<!Coverage.CoverageInfo>} |
| 229 */ | 224 */ |
| 230 static _coverageInfoForText(url, startLine, startColumn, content, ranges) { | 225 static async _coverageInfoForText(contentProvider, startLine, startColumn, ran ges) { |
| 231 var coverageInfo = { | 226 var url = contentProvider.contentURL(); |
| 232 url: url, | 227 var coverageType; |
| 233 ranges: ranges, | 228 if (contentProvider.contentType().isScript()) |
| 234 }; | 229 coverageType = Coverage.CoverageType.JavaScript; |
| 230 else if (contentProvider.contentType().isStyleSheet()) | |
| 231 coverageType = Coverage.CoverageType.CSS; | |
| 232 else | |
| 233 console.assert(false, `Unexpected resource type ${contentProvider.contentT ype().name} for ${url}`); | |
| 234 | |
| 235 var coverageInfo = {url: url, ranges: ranges, type: coverageType}; | |
| 236 var content = await contentProvider.requestContent(); | |
| 235 if (!content) | 237 if (!content) |
| 236 return coverageInfo; | 238 return coverageInfo; |
| 237 | 239 |
| 238 var text = new Common.Text(content); | 240 var text = new Common.Text(content); |
| 239 var offsetRanges = ranges.map(r => { | 241 var offsetRanges = ranges.map(r => { |
| 240 var range = r.range.relativeTo(startLine, startColumn); | 242 var range = r.range.relativeTo(startLine, startColumn); |
| 241 return { | 243 return { |
| 242 start: text.offsetFromPosition(range.startLine, range.startColumn), | 244 start: text.offsetFromPosition(range.startLine, range.startColumn), |
| 243 end: text.offsetFromPosition(range.endLine, range.endColumn), | 245 end: text.offsetFromPosition(range.endLine, range.endColumn), |
| 244 wasUsed: r.wasUsed | 246 wasUsed: r.wasUsed |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 356 */ | 358 */ |
| 357 handleAction(context, actionId) { | 359 handleAction(context, actionId) { |
| 358 var coverageViewId = 'coverage'; | 360 var coverageViewId = 'coverage'; |
| 359 UI.viewManager.showView(coverageViewId) | 361 UI.viewManager.showView(coverageViewId) |
| 360 .then(() => UI.viewManager.view(coverageViewId).widget()) | 362 .then(() => UI.viewManager.view(coverageViewId).widget()) |
| 361 .then(widget => /** @type !Coverage.CoverageView} */ (widget)._toggleRec ording()); | 363 .then(widget => /** @type !Coverage.CoverageView} */ (widget)._toggleRec ording()); |
| 362 | 364 |
| 363 return true; | 365 return true; |
| 364 } | 366 } |
| 365 }; | 367 }; |
| OLD | NEW |