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

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

Issue 2784993002: DevTools: coverage polish, part 2 (Closed)
Patch Set: Created 3 years, 8 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 | « no previous file | third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css » ('j') | 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) 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 this.registerRequiredCSS('coverage/coverageListView.css'); 8 this.registerRequiredCSS('coverage/coverageListView.css');
9 var columns = [ 9 var columns = [
10 {id: 'url', title: Common.UIString('URL'), width: '300px', fixedWidth: fal se, sortable: true}, 10 {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}, { 11 {id: 'type', title: Common.UIString('Type'), width: '45px', fixedWidth: tr ue, sortable: true}, {
12 id: 'size', 12 id: 'size',
13 title: Common.UIString('Total Bytes'), 13 title: Common.UIString('Total Bytes'),
14 width: '60px', 14 width: '60px',
15 fixedWidth: true, 15 fixedWidth: true,
16 sortable: true, 16 sortable: true,
17 align: DataGrid.DataGrid.Align.Right 17 align: DataGrid.DataGrid.Align.Right
18 }, 18 },
19 { 19 {
20 id: 'unusedSize', 20 id: 'unusedSize',
21 title: Common.UIString('Unused Bytes'), 21 title: Common.UIString('Unused Bytes'),
22 width: '60px', 22 width: '60px',
23 fixedWidth: true, 23 fixedWidth: true,
24 sortable: true, 24 sortable: true,
25 align: DataGrid.DataGrid.Align.Right, 25 align: DataGrid.DataGrid.Align.Right,
26 sort: DataGrid.DataGrid.Order.Descending 26 sort: DataGrid.DataGrid.Order.Descending
27 }, 27 },
28 {id: 'bars', title: '', width: '500px', fixedWidth: false, sortable: false } 28 {id: 'bars', title: '', width: '500px', fixedWidth: false, sortable: true}
29 ]; 29 ];
30 this._dataGrid = new DataGrid.SortableDataGrid(columns); 30 this._dataGrid = new DataGrid.SortableDataGrid(columns);
31 this._dataGrid.setResizeMethod(DataGrid.DataGrid.ResizeMethod.Last); 31 this._dataGrid.setResizeMethod(DataGrid.DataGrid.ResizeMethod.Last);
32 this._dataGrid.element.classList.add('flex-auto'); 32 this._dataGrid.element.classList.add('flex-auto');
33 this._dataGrid.element.addEventListener('dblclick', this._onDoubleClick.bind (this), false);
34 this._dataGrid.element.addEventListener('keydown', this._onKeyDown.bind(this ), false); 33 this._dataGrid.element.addEventListener('keydown', this._onKeyDown.bind(this ), false);
34 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.OpenedNode, this._o nOpenedNode, this);
35 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi s._sortingChanged, this); 35 this._dataGrid.addEventListener(DataGrid.DataGrid.Events.SortingChanged, thi s._sortingChanged, this);
36 36
37 var dataGridWidget = this._dataGrid.asWidget(); 37 var dataGridWidget = this._dataGrid.asWidget();
38 dataGridWidget.show(this.contentElement); 38 dataGridWidget.show(this.contentElement);
39 } 39 }
40 40
41 /** 41 /**
42 * @param {!Array<!Coverage.URLCoverageInfo>} coverageInfo 42 * @param {!Array<!Coverage.URLCoverageInfo>} coverageInfo
43 */ 43 */
44 update(coverageInfo) { 44 update(coverageInfo) {
45 var maxSize = coverageInfo.reduce((acc, entry) => Math.max(acc, entry.size() ), 0); 45 var maxSize = coverageInfo.reduce((acc, entry) => Math.max(acc, entry.size() ), 0);
46 var rootNode = this._dataGrid.rootNode(); 46 var rootNode = this._dataGrid.rootNode();
47 rootNode.removeChildren(); 47 rootNode.removeChildren();
48 for (var entry of coverageInfo) 48 for (var entry of coverageInfo)
49 rootNode.appendChild(new Coverage.CoverageListView.GridNode(entry, maxSize )); 49 rootNode.appendChild(new Coverage.CoverageListView.GridNode(entry, maxSize ));
50 this._sortingChanged(); 50 this._sortingChanged();
51 } 51 }
52 52
53 /** 53 /**
54 * @param {!Event} event 54 * @param {!Common.Event} event
55 */ 55 */
56 _onDoubleClick(event) { 56 _onOpenedNode(event) {
57 if (!event.target || !(event.target instanceof Node)) 57 var node = /** @type Coverage.CoverageListView.GridNode */ (event.data);
58 return; 58 this._revealSourceForNode(node);
59 event.consume(true);
60 this._revealSourceForNode(this._dataGrid.dataGridNodeFromNode(event.target)) ;
61 } 59 }
62 60
63 /** 61 /**
64 * @param {!Event} event 62 * @param {!Event} event
65 */ 63 */
66 _onKeyDown(event) { 64 _onKeyDown(event) {
67 if (!isEnterKey(event)) 65 if (!isEnterKey(event))
68 return; 66 return;
69 event.consume(true); 67 event.consume(true);
70 this._revealSourceForNode(this._dataGrid.selectedNode); 68 this._revealSourceForNode(this._dataGrid.selectedNode);
(...skipping 15 matching lines...) Expand all
86 _sortingChanged() { 84 _sortingChanged() {
87 var columnId = this._dataGrid.sortColumnId(); 85 var columnId = this._dataGrid.sortColumnId();
88 if (!columnId) 86 if (!columnId)
89 return; 87 return;
90 var sortFunction; 88 var sortFunction;
91 switch (columnId) { 89 switch (columnId) {
92 case 'url': 90 case 'url':
93 sortFunction = compareURL; 91 sortFunction = compareURL;
94 break; 92 break;
95 case 'type': 93 case 'type':
96 sortFunction = compareNumericField.bind(null, 'type'); 94 sortFunction = compareType;
97 break; 95 break;
98 case 'size': 96 case 'size':
99 sortFunction = compareNumericField.bind(null, 'size'); 97 sortFunction = compareNumericField.bind(null, 'size');
100 break; 98 break;
99 case 'bars':
101 case 'unusedSize': 100 case 'unusedSize':
102 sortFunction = compareNumericField.bind(null, 'unusedSize'); 101 sortFunction = compareNumericField.bind(null, 'unusedSize');
103 break; 102 break;
104 default: 103 default:
105 console.assert(false, 'Unknown sort field: ' + columnId); 104 console.assert(false, 'Unknown sort field: ' + columnId);
106 return; 105 return;
107 } 106 }
108 107
109 this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending( )); 108 this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending( ));
110 109
(...skipping 14 matching lines...) Expand all
125 * @param {!DataGrid.DataGridNode} a 124 * @param {!DataGrid.DataGridNode} a
126 * @param {!DataGrid.DataGridNode} b 125 * @param {!DataGrid.DataGridNode} b
127 * @return {number} 126 * @return {number}
128 */ 127 */
129 function compareNumericField(fieldName, a, b) { 128 function compareNumericField(fieldName, a, b) {
130 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a); 129 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a);
131 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b); 130 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b);
132 131
133 return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName]() ; 132 return nodeA._coverageInfo[fieldName]() - nodeB._coverageInfo[fieldName]() ;
134 } 133 }
134
135 /**
136 * @param {!DataGrid.DataGridNode} a
137 * @param {!DataGrid.DataGridNode} b
138 * @return {number}
139 */
140 function compareType(a, b) {
141 var nodeA = /** @type {!Coverage.CoverageListView.GridNode} */ (a);
142 var nodeB = /** @type {!Coverage.CoverageListView.GridNode} */ (b);
143 var typeA = Coverage.CoverageListView._typeToString(nodeA._coverageInfo.ty pe());
144 var typeB = Coverage.CoverageListView._typeToString(nodeB._coverageInfo.ty pe());
145 return typeA.localeCompare(typeB);
146 }
135 } 147 }
136 148
137 /** 149 /**
138 * @param {!Coverage.CoverageType} type 150 * @param {!Coverage.CoverageType} type
139 */ 151 */
140 static _typeToString(type) { 152 static _typeToString(type) {
141 var types = []; 153 var types = [];
142 if (type & Coverage.CoverageType.CSS) 154 if (type & Coverage.CoverageType.CSS)
143 types.push(Common.UIString('CSS')); 155 types.push(Common.UIString('CSS'));
144 if (type & Coverage.CoverageType.JavaScript) 156 if (type & Coverage.CoverageType.JavaScript)
(...skipping 29 matching lines...) Expand all
174 var prefix = outer.createChild('div', 'url-prefix'); 186 var prefix = outer.createChild('div', 'url-prefix');
175 var suffix = outer.createChild('div', 'url-suffix'); 187 var suffix = outer.createChild('div', 'url-suffix');
176 var splitURL = /^(.*)(\/[^/]*)$/.exec(this._url); 188 var splitURL = /^(.*)(\/[^/]*)$/.exec(this._url);
177 prefix.textContent = splitURL ? splitURL[1] : this._url; 189 prefix.textContent = splitURL ? splitURL[1] : this._url;
178 suffix.textContent = splitURL ? splitURL[2] : ''; 190 suffix.textContent = splitURL ? splitURL[2] : '';
179 break; 191 break;
180 case 'type': 192 case 'type':
181 cell.textContent = Coverage.CoverageListView._typeToString(this._coverag eInfo.type()); 193 cell.textContent = Coverage.CoverageListView._typeToString(this._coverag eInfo.type());
182 break; 194 break;
183 case 'size': 195 case 'size':
184 cell.classList.add('numeric-column');
185 cell.textContent = Number.withThousandsSeparator(this._coverageInfo.size () || 0); 196 cell.textContent = Number.withThousandsSeparator(this._coverageInfo.size () || 0);
186 break; 197 break;
187 case 'unusedSize': 198 case 'unusedSize':
188 cell.classList.add('numeric-column'); 199 var unusedSize = this._coverageInfo.unusedSize() || 0;
189 cell.textContent = Number.withThousandsSeparator(this._coverageInfo.unus edSize() || 0); 200 var unusedSizeSpan = cell.createChild('span');
190 if (this._coverageInfo.size()) 201 var unusedPercentsSpan = cell.createChild('span', 'percent-value');
191 cell.title = Math.round(100 * this._coverageInfo.unusedSize() / this._ coverageInfo.size()) + '%'; 202 unusedSizeSpan.textContent = Number.withThousandsSeparator(unusedSize);
203 unusedPercentsSpan.textContent = Common.UIString('%.1f\u2009%%', unusedS ize / this._coverageInfo.size() * 100);
192 break; 204 break;
193 case 'bars': 205 case 'bars':
194 var barContainer = cell.createChild('div', 'bar-container'); 206 var barContainer = cell.createChild('div', 'bar-container');
195 var unusedSizeBar = barContainer.createChild('div', 'bar bar-unused-size '); 207 var unusedSizeBar = barContainer.createChild('div', 'bar bar-unused-size ');
196 unusedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.unusedSiz e() / this._maxSize) + '%'; 208 unusedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.unusedSiz e() / this._maxSize) + '%';
197 var usedSizeBar = barContainer.createChild('div', 'bar bar-used-size'); 209 var usedSizeBar = barContainer.createChild('div', 'bar bar-used-size');
198 usedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.usedSize() / this._maxSize) + '%'; 210 usedSizeBar.style.width = Math.ceil(100 * this._coverageInfo.usedSize() / this._maxSize) + '%';
199 } 211 }
200 return cell; 212 return cell;
201 } 213 }
202 }; 214 };
OLDNEW
« no previous file with comments | « no previous file | third_party/WebKit/Source/devtools/front_end/coverage/coverageListView.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698