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

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

Issue 2721563003: DevTools: add CSS/JS type indication to coverage view (Closed)
Patch Set: DevTools: add CSS/JS type indication to coverage view 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
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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 };
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/devtools/front_end/coverage/CoverageListView.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698