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

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

Issue 2865573003: DevTools: support live coverage (Closed)
Patch Set: minor polish on corner cases Created 3 years, 7 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
OLDNEW
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 Coverage.CoverageListView = class extends UI.VBox { 5 Coverage.CoverageListView = class extends UI.VBox {
6 constructor() { 6 constructor() {
7 super(true); 7 super(true);
8 /** @type {!Map<!Coverage.URLCoverageInfo, !Coverage.CoverageListView.GridNo de>} */
9 this._nodeForCoverageInfo = new Map();
8 this.registerRequiredCSS('coverage/coverageListView.css'); 10 this.registerRequiredCSS('coverage/coverageListView.css');
9 var columns = [ 11 var columns = [
10 {id: 'url', title: Common.UIString('URL'), width: '300px', fixedWidth: fal se, sortable: true}, 12 {id: 'url', title: Common.UIString('URL'), width: '300px', fixedWidth: fal se, sortable: true},
11 {id: 'type', title: Common.UIString('Type'), width: '45px', fixedWidth: tr ue, sortable: true}, { 13 {id: 'type', title: Common.UIString('Type'), width: '45px', fixedWidth: tr ue, sortable: true}, {
12 id: 'size', 14 id: 'size',
13 title: Common.UIString('Total Bytes'), 15 title: Common.UIString('Total Bytes'),
14 width: '60px', 16 width: '60px',
15 fixedWidth: true, 17 fixedWidth: true,
16 sortable: true, 18 sortable: true,
17 align: DataGrid.DataGrid.Align.Right 19 align: DataGrid.DataGrid.Align.Right
(...skipping 17 matching lines...) Expand all
35 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi s._sortingChanged, this); 37 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi s._sortingChanged, this);
36 38
37 var dataGridWidget = this._dataGrid.asWidget(); 39 var dataGridWidget = this._dataGrid.asWidget();
38 dataGridWidget.show(this.contentElement); 40 dataGridWidget.show(this.contentElement);
39 } 41 }
40 42
41 /** 43 /**
42 * @param {!Array<!Coverage.URLCoverageInfo>} coverageInfo 44 * @param {!Array<!Coverage.URLCoverageInfo>} coverageInfo
43 */ 45 */
44 update(coverageInfo) { 46 update(coverageInfo) {
47 var hadUpdates = false;
45 var maxSize = coverageInfo.reduce((acc, entry) => Math.max(acc, entry.size() ), 0); 48 var maxSize = coverageInfo.reduce((acc, entry) => Math.max(acc, entry.size() ), 0);
46 var rootNode = this._dataGrid.rootNode(); 49 var rootNode = this._dataGrid.rootNode();
47 rootNode.removeChildren(); 50 for (var entry of coverageInfo) {
48 for (var entry of coverageInfo) 51 var node = this._nodeForCoverageInfo.get(entry);
49 rootNode.appendChild(new Coverage.CoverageListView.GridNode(entry, maxSize )); 52 if (node) {
50 this._sortingChanged(); 53 hadUpdates = node._refreshIfNeeded(maxSize) || hadUpdates;
54 continue;
55 }
56 hadUpdates = true;
57 node = new Coverage.CoverageListView.GridNode(entry, maxSize);
58 this._nodeForCoverageInfo.set(entry, node);
59 rootNode.appendChild(node);
60 }
61 if (hadUpdates)
62 this._sortingChanged();
63 }
64
65 reset() {
66 this._nodeForCoverageInfo.clear();
67 this._dataGrid.rootNode().removeChildren();
51 } 68 }
52 69
53 /** 70 /**
54 * @param {!Common.Event} event 71 * @param {!Common.Event} event
55 */ 72 */
56 _onOpenedNode(event) { 73 _onOpenedNode(event) {
57 var node = /** @type Coverage.CoverageListView.GridNode */ (event.data); 74 var node = /** @type Coverage.CoverageListView.GridNode */ (event.data);
58 this._revealSourceForNode(node); 75 this._revealSourceForNode(node);
59 } 76 }
60 77
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 /** 145 /**
129 * @param {string} fieldName 146 * @param {string} fieldName
130 * @param {!DataGrid.DataGridNode} a 147 * @param {!DataGrid.DataGridNode} a
131 * @param {!DataGrid.DataGridNode} b 148 * @param {!DataGrid.DataGridNode} b
132 * @return {number} 149 * @return {number}
133 */ 150 */
134 function compareNumericField(fieldName, a, b) { 151 function compareNumericField(fieldName, a, b) {
135 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a); 152 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a);
136 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b); 153 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b);
137 154
138 return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName]() ; 155 return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName]() || compareURL(a, b);
139 } 156 }
140 157
141 /** 158 /**
142 * @param {!DataGrid.DataGridNode} a 159 * @param {!DataGrid.DataGridNode} a
143 * @param {!DataGrid.DataGridNode} b 160 * @param {!DataGrid.DataGridNode} b
144 * @return {number} 161 * @return {number}
145 */ 162 */
146 function compareType(a, b) { 163 function compareType(a, b) {
147 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a); 164 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a);
148 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b); 165 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b);
149 var typeA = Coverage.CoverageListView._typeToString(nodeA._coverageInfo.ty pe()); 166 var typeA = Coverage.CoverageListView._typeToString(nodeA._coverageInfo.ty pe());
150 var typeB = Coverage.CoverageListView._typeToString(nodeB._coverageInfo.ty pe()); 167 var typeB = Coverage.CoverageListView._typeToString(nodeB._coverageInfo.ty pe());
151 return typeA.localeCompare(typeB); 168 return typeA.localeCompare(typeB) || compareURL(a, b);
152 } 169 }
153 } 170 }
154 171
155 /** 172 /**
156 * @param {!Coverage.CoverageType} type 173 * @param {!Coverage.CoverageType} type
157 */ 174 */
158 static _typeToString(type) { 175 static _typeToString(type) {
159 var types = []; 176 var types = [];
160 if (type & Coverage.CoverageType.CSS) 177 if (type & Coverage.CoverageType.CSS)
161 types.push(Common.UIString('CSS')); 178 types.push(Common.UIString('CSS'));
162 if (type & Coverage.CoverageType.JavaScript) 179 if (type & Coverage.CoverageType.JavaScript)
163 types.push(Common.UIString('JS')); 180 types.push(Common.UIString('JS'));
164 return types.join('+'); 181 return types.join('+');
165 } 182 }
166 }; 183 };
167 184
168 Coverage.CoverageListView.GridNode = class extends DataGrid.SortableDataGridNode { 185 Coverage.CoverageListView.GridNode = class extends DataGrid.SortableDataGridNode {
169 /** 186 /**
170 * @param {!Coverage.URLCoverageInfo} coverageInfo 187 * @param {!Coverage.URLCoverageInfo} coverageInfo
171 * @param {number} maxSize 188 * @param {number} maxSize
172 */ 189 */
173 constructor(coverageInfo, maxSize) { 190 constructor(coverageInfo, maxSize) {
174 super(); 191 super();
175 this._coverageInfo = coverageInfo; 192 this._coverageInfo = coverageInfo;
193 /** @type {number|undefined} */
194 this._lastUsedSize;
176 this._url = coverageInfo.url(); 195 this._url = coverageInfo.url();
177 this._displayURL = new Common.ParsedURL(this._url).displayName; 196 this._displayURL = new Common.ParsedURL(this._url).displayName;
178 this._maxSize = maxSize; 197 this._maxSize = maxSize;
179 } 198 }
180 199
181 /** 200 /**
201 * @param {number} maxSize
202 * @return {boolean}
203 */
204 _refreshIfNeeded(maxSize) {
205 if (this._lastUsedSize === this._coverageInfo.usedSize() && maxSize === this ._maxSize)
206 return false;
207 this._lastUsedSize = this._coverageInfo.usedSize();
208 this._maxSize = maxSize;
209 this.refresh();
210 return true;
211 }
212
213 /**
182 * @override 214 * @override
183 * @param {string} columnId 215 * @param {string} columnId
184 * @return {!Element} 216 * @return {!Element}
185 */ 217 */
186 createCell(columnId) { 218 createCell(columnId) {
187 var cell = this.createTD(columnId); 219 var cell = this.createTD(columnId);
188 switch (columnId) { 220 switch (columnId) {
189 case 'url': 221 case 'url':
190 cell.title = this._url; 222 cell.title = this._url;
191 var outer = cell.createChild('div', 'url-outer'); 223 var outer = cell.createChild('div', 'url-outer');
(...skipping 19 matching lines...) Expand all
211 case 'bars': 243 case 'bars':
212 var barContainer = cell.createChild('div', 'bar-container'); 244 var barContainer = cell.createChild('div', 'bar-container');
213 var unusedSizeBar = barContainer.createChild('div', 'bar bar-unused-size '); 245 var unusedSizeBar = barContainer.createChild('div', 'bar bar-unused-size ');
214 unusedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.unusedSiz e() / this._maxSize) + '%'; 246 unusedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.unusedSiz e() / this._maxSize) + '%';
215 var usedSizeBar = barContainer.createChild('div', 'bar bar-used-size'); 247 var usedSizeBar = barContainer.createChild('div', 'bar bar-used-size');
216 usedSizeBar.style.width = Math.floor(100 * this._coverageInfo.usedSize() / this._maxSize) + '%'; 248 usedSizeBar.style.width = Math.floor(100 * this._coverageInfo.usedSize() / this._maxSize) + '%';
217 } 249 }
218 return cell; 250 return cell;
219 } 251 }
220 }; 252 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698