| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 }; |
| OLD | NEW |