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 |