| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 * @unrestricted | 5 * @unrestricted |
| 6 */ | 6 */ |
| 7 WebInspector.TimelineTreeView = class extends WebInspector.VBox { | 7 Timeline.TimelineTreeView = class extends UI.VBox { |
| 8 constructor() { | 8 constructor() { |
| 9 super(); | 9 super(); |
| 10 this.element.classList.add('timeline-tree-view'); | 10 this.element.classList.add('timeline-tree-view'); |
| 11 } | 11 } |
| 12 | 12 |
| 13 /** | 13 /** |
| 14 * @param {!WebInspector.TracingModel.Event} event | 14 * @param {!SDK.TracingModel.Event} event |
| 15 * @return {string} | 15 * @return {string} |
| 16 */ | 16 */ |
| 17 static eventNameForSorting(event) { | 17 static eventNameForSorting(event) { |
| 18 if (event.name === WebInspector.TimelineModel.RecordType.JSFrame) { | 18 if (event.name === TimelineModel.TimelineModel.RecordType.JSFrame) { |
| 19 var data = event.args['data']; | 19 var data = event.args['data']; |
| 20 return data['functionName'] + '@' + (data['scriptId'] || data['url'] || ''
); | 20 return data['functionName'] + '@' + (data['scriptId'] || data['url'] || ''
); |
| 21 } | 21 } |
| 22 return event.name + ':@' + WebInspector.TimelineProfileTree.eventURL(event); | 22 return event.name + ':@' + TimelineModel.TimelineProfileTree.eventURL(event)
; |
| 23 } | 23 } |
| 24 | 24 |
| 25 /** | 25 /** |
| 26 * @param {!WebInspector.TimelineModel} model | 26 * @param {!TimelineModel.TimelineModel} model |
| 27 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 27 * @param {!Array<!TimelineModel.TimelineModel.Filter>} filters |
| 28 */ | 28 */ |
| 29 _init(model, filters) { | 29 _init(model, filters) { |
| 30 this._model = model; | 30 this._model = model; |
| 31 this._linkifier = new WebInspector.Linkifier(); | 31 this._linkifier = new Components.Linkifier(); |
| 32 | 32 |
| 33 this._filters = filters.slice(); | 33 this._filters = filters.slice(); |
| 34 | 34 |
| 35 var columns = /** @type {!Array<!WebInspector.DataGrid.ColumnDescriptor>} */
([]); | 35 var columns = /** @type {!Array<!UI.DataGrid.ColumnDescriptor>} */ ([]); |
| 36 this._populateColumns(columns); | 36 this._populateColumns(columns); |
| 37 | 37 |
| 38 var mainView = new WebInspector.VBox(); | 38 var mainView = new UI.VBox(); |
| 39 this._populateToolbar(mainView.element); | 39 this._populateToolbar(mainView.element); |
| 40 this._dataGrid = new WebInspector.SortableDataGrid(columns); | 40 this._dataGrid = new UI.SortableDataGrid(columns); |
| 41 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SortingChanged,
this._sortingChanged, this); | 41 this._dataGrid.addEventListener(UI.DataGrid.Events.SortingChanged, this._sor
tingChanged, this); |
| 42 this._dataGrid.element.addEventListener('mousemove', this._onMouseMove.bind(
this), true); | 42 this._dataGrid.element.addEventListener('mousemove', this._onMouseMove.bind(
this), true); |
| 43 this._dataGrid.setResizeMethod(WebInspector.DataGrid.ResizeMethod.Last); | 43 this._dataGrid.setResizeMethod(UI.DataGrid.ResizeMethod.Last); |
| 44 this._dataGrid.asWidget().show(mainView.element); | 44 this._dataGrid.asWidget().show(mainView.element); |
| 45 | 45 |
| 46 this._splitWidget = new WebInspector.SplitWidget(true, true, 'timelineTreeVi
ewDetailsSplitWidget'); | 46 this._splitWidget = new UI.SplitWidget(true, true, 'timelineTreeViewDetailsS
plitWidget'); |
| 47 this._splitWidget.show(this.element); | 47 this._splitWidget.show(this.element); |
| 48 this._splitWidget.setMainWidget(mainView); | 48 this._splitWidget.setMainWidget(mainView); |
| 49 | 49 |
| 50 this._detailsView = new WebInspector.VBox(); | 50 this._detailsView = new UI.VBox(); |
| 51 this._detailsView.element.classList.add('timeline-details-view', 'timeline-d
etails-view-body'); | 51 this._detailsView.element.classList.add('timeline-details-view', 'timeline-d
etails-view-body'); |
| 52 this._splitWidget.setSidebarWidget(this._detailsView); | 52 this._splitWidget.setSidebarWidget(this._detailsView); |
| 53 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, t
his._updateDetailsForSelection, this); | 53 this._dataGrid.addEventListener(UI.DataGrid.Events.SelectedNode, this._updat
eDetailsForSelection, this); |
| 54 | 54 |
| 55 /** @type {?WebInspector.TimelineProfileTree.Node|undefined} */ | 55 /** @type {?TimelineModel.TimelineProfileTree.Node|undefined} */ |
| 56 this._lastSelectedNode; | 56 this._lastSelectedNode; |
| 57 } | 57 } |
| 58 | 58 |
| 59 /** | 59 /** |
| 60 * @param {!WebInspector.TimelineSelection} selection | 60 * @param {!Timeline.TimelineSelection} selection |
| 61 */ | 61 */ |
| 62 updateContents(selection) { | 62 updateContents(selection) { |
| 63 this.setRange(selection.startTime(), selection.endTime()); | 63 this.setRange(selection.startTime(), selection.endTime()); |
| 64 } | 64 } |
| 65 | 65 |
| 66 /** | 66 /** |
| 67 * @param {number} startTime | 67 * @param {number} startTime |
| 68 * @param {number} endTime | 68 * @param {number} endTime |
| 69 */ | 69 */ |
| 70 setRange(startTime, endTime) { | 70 setRange(startTime, endTime) { |
| 71 this._startTime = startTime; | 71 this._startTime = startTime; |
| 72 this._endTime = endTime; | 72 this._endTime = endTime; |
| 73 this._refreshTree(); | 73 this._refreshTree(); |
| 74 } | 74 } |
| 75 | 75 |
| 76 /** | 76 /** |
| 77 * @return {boolean} | 77 * @return {boolean} |
| 78 */ | 78 */ |
| 79 _exposePercentages() { | 79 _exposePercentages() { |
| 80 return false; | 80 return false; |
| 81 } | 81 } |
| 82 | 82 |
| 83 /** | 83 /** |
| 84 * @param {!Element} parent | 84 * @param {!Element} parent |
| 85 */ | 85 */ |
| 86 _populateToolbar(parent) { | 86 _populateToolbar(parent) { |
| 87 } | 87 } |
| 88 | 88 |
| 89 /** | 89 /** |
| 90 * @param {?WebInspector.TimelineProfileTree.Node} node | 90 * @param {?TimelineModel.TimelineProfileTree.Node} node |
| 91 */ | 91 */ |
| 92 _onHover(node) { | 92 _onHover(node) { |
| 93 } | 93 } |
| 94 | 94 |
| 95 /** | 95 /** |
| 96 * @param {!WebInspector.TracingModel.Event} event | 96 * @param {!SDK.TracingModel.Event} event |
| 97 * @return {?Element} | 97 * @return {?Element} |
| 98 */ | 98 */ |
| 99 _linkifyLocation(event) { | 99 _linkifyLocation(event) { |
| 100 var target = this._model.targetByEvent(event); | 100 var target = this._model.targetByEvent(event); |
| 101 if (!target) | 101 if (!target) |
| 102 return null; | 102 return null; |
| 103 var frame = WebInspector.TimelineProfileTree.eventStackFrame(event); | 103 var frame = TimelineModel.TimelineProfileTree.eventStackFrame(event); |
| 104 if (!frame) | 104 if (!frame) |
| 105 return null; | 105 return null; |
| 106 return this._linkifier.maybeLinkifyConsoleCallFrame(target, frame); | 106 return this._linkifier.maybeLinkifyConsoleCallFrame(target, frame); |
| 107 } | 107 } |
| 108 | 108 |
| 109 /** | 109 /** |
| 110 * @param {!WebInspector.TimelineProfileTree.Node} treeNode | 110 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode |
| 111 * @param {boolean} suppressSelectedEvent | 111 * @param {boolean} suppressSelectedEvent |
| 112 */ | 112 */ |
| 113 selectProfileNode(treeNode, suppressSelectedEvent) { | 113 selectProfileNode(treeNode, suppressSelectedEvent) { |
| 114 var pathToRoot = []; | 114 var pathToRoot = []; |
| 115 for (var node = treeNode; node; node = node.parent) | 115 for (var node = treeNode; node; node = node.parent) |
| 116 pathToRoot.push(node); | 116 pathToRoot.push(node); |
| 117 for (var i = pathToRoot.length - 1; i > 0; --i) { | 117 for (var i = pathToRoot.length - 1; i > 0; --i) { |
| 118 var gridNode = this._dataGridNodeForTreeNode(pathToRoot[i]); | 118 var gridNode = this._dataGridNodeForTreeNode(pathToRoot[i]); |
| 119 if (gridNode && gridNode.dataGrid) | 119 if (gridNode && gridNode.dataGrid) |
| 120 gridNode.expand(); | 120 gridNode.expand(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 134 return; | 134 return; |
| 135 var maxSelfTime = 0; | 135 var maxSelfTime = 0; |
| 136 var maxTotalTime = 0; | 136 var maxTotalTime = 0; |
| 137 for (var child of tree.children.values()) { | 137 for (var child of tree.children.values()) { |
| 138 maxSelfTime = Math.max(maxSelfTime, child.selfTime); | 138 maxSelfTime = Math.max(maxSelfTime, child.selfTime); |
| 139 maxTotalTime = Math.max(maxTotalTime, child.totalTime); | 139 maxTotalTime = Math.max(maxTotalTime, child.totalTime); |
| 140 } | 140 } |
| 141 for (var child of tree.children.values()) { | 141 for (var child of tree.children.values()) { |
| 142 // Exclude the idle time off the total calculation. | 142 // Exclude the idle time off the total calculation. |
| 143 var gridNode = | 143 var gridNode = |
| 144 new WebInspector.TimelineTreeView.TreeGridNode(child, tree.totalTime,
maxSelfTime, maxTotalTime, this); | 144 new Timeline.TimelineTreeView.TreeGridNode(child, tree.totalTime, maxS
elfTime, maxTotalTime, this); |
| 145 this._dataGrid.insertChild(gridNode); | 145 this._dataGrid.insertChild(gridNode); |
| 146 } | 146 } |
| 147 this._sortingChanged(); | 147 this._sortingChanged(); |
| 148 this._updateDetailsForSelection(); | 148 this._updateDetailsForSelection(); |
| 149 } | 149 } |
| 150 | 150 |
| 151 /** | 151 /** |
| 152 * @return {!WebInspector.TimelineProfileTree.Node} | 152 * @return {!TimelineModel.TimelineProfileTree.Node} |
| 153 */ | 153 */ |
| 154 _buildTree() { | 154 _buildTree() { |
| 155 throw new Error('Not Implemented'); | 155 throw new Error('Not Implemented'); |
| 156 } | 156 } |
| 157 | 157 |
| 158 /** | 158 /** |
| 159 * @param {function(!WebInspector.TracingModel.Event):(string|symbol)=} eventI
dCallback | 159 * @param {function(!SDK.TracingModel.Event):(string|symbol)=} eventIdCallback |
| 160 * @return {!WebInspector.TimelineProfileTree.Node} | 160 * @return {!TimelineModel.TimelineProfileTree.Node} |
| 161 */ | 161 */ |
| 162 _buildTopDownTree(eventIdCallback) { | 162 _buildTopDownTree(eventIdCallback) { |
| 163 return WebInspector.TimelineProfileTree.buildTopDown( | 163 return TimelineModel.TimelineProfileTree.buildTopDown( |
| 164 this._model.mainThreadEvents(), this._filters, this._startTime, this._en
dTime, eventIdCallback); | 164 this._model.mainThreadEvents(), this._filters, this._startTime, this._en
dTime, eventIdCallback); |
| 165 } | 165 } |
| 166 | 166 |
| 167 /** | 167 /** |
| 168 * @param {!Array<!WebInspector.DataGrid.ColumnDescriptor>} columns | 168 * @param {!Array<!UI.DataGrid.ColumnDescriptor>} columns |
| 169 */ | 169 */ |
| 170 _populateColumns(columns) { | 170 _populateColumns(columns) { |
| 171 columns.push( | 171 columns.push( |
| 172 {id: 'self', title: WebInspector.UIString('Self Time'), width: '110px',
fixedWidth: true, sortable: true}); | 172 {id: 'self', title: Common.UIString('Self Time'), width: '110px', fixedW
idth: true, sortable: true}); |
| 173 columns.push( | 173 columns.push( |
| 174 {id: 'total', title: WebInspector.UIString('Total Time'), width: '110px'
, fixedWidth: true, sortable: true}); | 174 {id: 'total', title: Common.UIString('Total Time'), width: '110px', fixe
dWidth: true, sortable: true}); |
| 175 columns.push({id: 'activity', title: WebInspector.UIString('Activity'), disc
losure: true, sortable: true}); | 175 columns.push({id: 'activity', title: Common.UIString('Activity'), disclosure
: true, sortable: true}); |
| 176 } | 176 } |
| 177 | 177 |
| 178 _sortingChanged() { | 178 _sortingChanged() { |
| 179 var columnId = this._dataGrid.sortColumnId(); | 179 var columnId = this._dataGrid.sortColumnId(); |
| 180 if (!columnId) | 180 if (!columnId) |
| 181 return; | 181 return; |
| 182 var sortFunction; | 182 var sortFunction; |
| 183 switch (columnId) { | 183 switch (columnId) { |
| 184 case 'startTime': | 184 case 'startTime': |
| 185 sortFunction = compareStartTime; | 185 sortFunction = compareStartTime; |
| 186 break; | 186 break; |
| 187 case 'self': | 187 case 'self': |
| 188 sortFunction = compareNumericField.bind(null, 'selfTime'); | 188 sortFunction = compareNumericField.bind(null, 'selfTime'); |
| 189 break; | 189 break; |
| 190 case 'total': | 190 case 'total': |
| 191 sortFunction = compareNumericField.bind(null, 'totalTime'); | 191 sortFunction = compareNumericField.bind(null, 'totalTime'); |
| 192 break; | 192 break; |
| 193 case 'activity': | 193 case 'activity': |
| 194 sortFunction = compareName; | 194 sortFunction = compareName; |
| 195 break; | 195 break; |
| 196 default: | 196 default: |
| 197 console.assert(false, 'Unknown sort field: ' + columnId); | 197 console.assert(false, 'Unknown sort field: ' + columnId); |
| 198 return; | 198 return; |
| 199 } | 199 } |
| 200 this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending(
)); | 200 this._dataGrid.sortNodes(sortFunction, !this._dataGrid.isSortOrderAscending(
)); |
| 201 | 201 |
| 202 /** | 202 /** |
| 203 * @param {string} field | 203 * @param {string} field |
| 204 * @param {!WebInspector.DataGridNode} a | 204 * @param {!UI.DataGridNode} a |
| 205 * @param {!WebInspector.DataGridNode} b | 205 * @param {!UI.DataGridNode} b |
| 206 * @return {number} | 206 * @return {number} |
| 207 */ | 207 */ |
| 208 function compareNumericField(field, a, b) { | 208 function compareNumericField(field, a, b) { |
| 209 var nodeA = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (a)
; | 209 var nodeA = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (a); |
| 210 var nodeB = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (b)
; | 210 var nodeB = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (b); |
| 211 return nodeA._profileNode[field] - nodeB._profileNode[field]; | 211 return nodeA._profileNode[field] - nodeB._profileNode[field]; |
| 212 } | 212 } |
| 213 | 213 |
| 214 /** | 214 /** |
| 215 * @param {!WebInspector.DataGridNode} a | 215 * @param {!UI.DataGridNode} a |
| 216 * @param {!WebInspector.DataGridNode} b | 216 * @param {!UI.DataGridNode} b |
| 217 * @return {number} | 217 * @return {number} |
| 218 */ | 218 */ |
| 219 function compareStartTime(a, b) { | 219 function compareStartTime(a, b) { |
| 220 var nodeA = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (a)
; | 220 var nodeA = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (a); |
| 221 var nodeB = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (b)
; | 221 var nodeB = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (b); |
| 222 return nodeA._profileNode.event.startTime - nodeB._profileNode.event.start
Time; | 222 return nodeA._profileNode.event.startTime - nodeB._profileNode.event.start
Time; |
| 223 } | 223 } |
| 224 | 224 |
| 225 /** | 225 /** |
| 226 * @param {!WebInspector.DataGridNode} a | 226 * @param {!UI.DataGridNode} a |
| 227 * @param {!WebInspector.DataGridNode} b | 227 * @param {!UI.DataGridNode} b |
| 228 * @return {number} | 228 * @return {number} |
| 229 */ | 229 */ |
| 230 function compareName(a, b) { | 230 function compareName(a, b) { |
| 231 var nodeA = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (a)
; | 231 var nodeA = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (a); |
| 232 var nodeB = /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (b)
; | 232 var nodeB = /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (b); |
| 233 var nameA = WebInspector.TimelineTreeView.eventNameForSorting(nodeA._profi
leNode.event); | 233 var nameA = Timeline.TimelineTreeView.eventNameForSorting(nodeA._profileNo
de.event); |
| 234 var nameB = WebInspector.TimelineTreeView.eventNameForSorting(nodeB._profi
leNode.event); | 234 var nameB = Timeline.TimelineTreeView.eventNameForSorting(nodeB._profileNo
de.event); |
| 235 return nameA.localeCompare(nameB); | 235 return nameA.localeCompare(nameB); |
| 236 } | 236 } |
| 237 } | 237 } |
| 238 | 238 |
| 239 _updateDetailsForSelection() { | 239 _updateDetailsForSelection() { |
| 240 var selectedNode = this._dataGrid.selectedNode ? | 240 var selectedNode = this._dataGrid.selectedNode ? |
| 241 /** @type {!WebInspector.TimelineTreeView.TreeGridNode} */ (this._dataGr
id.selectedNode)._profileNode : | 241 /** @type {!Timeline.TimelineTreeView.TreeGridNode} */ (this._dataGrid.s
electedNode)._profileNode : |
| 242 null; | 242 null; |
| 243 if (selectedNode === this._lastSelectedNode) | 243 if (selectedNode === this._lastSelectedNode) |
| 244 return; | 244 return; |
| 245 this._lastSelectedNode = selectedNode; | 245 this._lastSelectedNode = selectedNode; |
| 246 this._detailsView.detachChildWidgets(); | 246 this._detailsView.detachChildWidgets(); |
| 247 this._detailsView.element.removeChildren(); | 247 this._detailsView.element.removeChildren(); |
| 248 if (!selectedNode || !this._showDetailsForNode(selectedNode)) { | 248 if (!selectedNode || !this._showDetailsForNode(selectedNode)) { |
| 249 var banner = this._detailsView.element.createChild('div', 'full-widget-dim
med-banner'); | 249 var banner = this._detailsView.element.createChild('div', 'full-widget-dim
med-banner'); |
| 250 banner.createTextChild(WebInspector.UIString('Select item for details.')); | 250 banner.createTextChild(Common.UIString('Select item for details.')); |
| 251 } | 251 } |
| 252 } | 252 } |
| 253 | 253 |
| 254 /** | 254 /** |
| 255 * @param {!WebInspector.TimelineProfileTree.Node} node | 255 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 256 * @return {boolean} | 256 * @return {boolean} |
| 257 */ | 257 */ |
| 258 _showDetailsForNode(node) { | 258 _showDetailsForNode(node) { |
| 259 return false; | 259 return false; |
| 260 } | 260 } |
| 261 | 261 |
| 262 /** | 262 /** |
| 263 * @param {!Event} event | 263 * @param {!Event} event |
| 264 */ | 264 */ |
| 265 _onMouseMove(event) { | 265 _onMouseMove(event) { |
| 266 var gridNode = event.target && (event.target instanceof Node) ? | 266 var gridNode = event.target && (event.target instanceof Node) ? |
| 267 /** @type {?WebInspector.TimelineTreeView.TreeGridNode} */ ( | 267 /** @type {?Timeline.TimelineTreeView.TreeGridNode} */ ( |
| 268 this._dataGrid.dataGridNodeFromNode(/** @type {!Node} */ (event.targ
et))) : | 268 this._dataGrid.dataGridNodeFromNode(/** @type {!Node} */ (event.targ
et))) : |
| 269 null; | 269 null; |
| 270 var profileNode = gridNode && gridNode._profileNode; | 270 var profileNode = gridNode && gridNode._profileNode; |
| 271 if (profileNode === this._lastHoveredProfileNode) | 271 if (profileNode === this._lastHoveredProfileNode) |
| 272 return; | 272 return; |
| 273 this._lastHoveredProfileNode = profileNode; | 273 this._lastHoveredProfileNode = profileNode; |
| 274 this._onHover(profileNode); | 274 this._onHover(profileNode); |
| 275 } | 275 } |
| 276 | 276 |
| 277 /** | 277 /** |
| 278 * @param {!WebInspector.TimelineProfileTree.Node} treeNode | 278 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode |
| 279 * @return {?WebInspector.TimelineTreeView.GridNode} | 279 * @return {?Timeline.TimelineTreeView.GridNode} |
| 280 */ | 280 */ |
| 281 _dataGridNodeForTreeNode(treeNode) { | 281 _dataGridNodeForTreeNode(treeNode) { |
| 282 return treeNode[WebInspector.TimelineTreeView.TreeGridNode._gridNodeSymbol]
|| null; | 282 return treeNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] || n
ull; |
| 283 } | 283 } |
| 284 }; | 284 }; |
| 285 | 285 |
| 286 | 286 |
| 287 /** | 287 /** |
| 288 * @unrestricted | 288 * @unrestricted |
| 289 */ | 289 */ |
| 290 WebInspector.TimelineTreeView.GridNode = class extends WebInspector.SortableData
GridNode { | 290 Timeline.TimelineTreeView.GridNode = class extends UI.SortableDataGridNode { |
| 291 /** | 291 /** |
| 292 * @param {!WebInspector.TimelineProfileTree.Node} profileNode | 292 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode |
| 293 * @param {number} grandTotalTime | 293 * @param {number} grandTotalTime |
| 294 * @param {number} maxSelfTime | 294 * @param {number} maxSelfTime |
| 295 * @param {number} maxTotalTime | 295 * @param {number} maxTotalTime |
| 296 * @param {!WebInspector.TimelineTreeView} treeView | 296 * @param {!Timeline.TimelineTreeView} treeView |
| 297 */ | 297 */ |
| 298 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView)
{ | 298 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView)
{ |
| 299 super(null, false); | 299 super(null, false); |
| 300 | 300 |
| 301 this._populated = false; | 301 this._populated = false; |
| 302 this._profileNode = profileNode; | 302 this._profileNode = profileNode; |
| 303 this._treeView = treeView; | 303 this._treeView = treeView; |
| 304 this._grandTotalTime = grandTotalTime; | 304 this._grandTotalTime = grandTotalTime; |
| 305 this._maxSelfTime = maxSelfTime; | 305 this._maxSelfTime = maxSelfTime; |
| 306 this._maxTotalTime = maxTotalTime; | 306 this._maxTotalTime = maxTotalTime; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 321 * @param {string} columnId | 321 * @param {string} columnId |
| 322 * @return {!Element} | 322 * @return {!Element} |
| 323 */ | 323 */ |
| 324 _createNameCell(columnId) { | 324 _createNameCell(columnId) { |
| 325 const cell = this.createTD(columnId); | 325 const cell = this.createTD(columnId); |
| 326 const container = cell.createChild('div', 'name-container'); | 326 const container = cell.createChild('div', 'name-container'); |
| 327 const icon = container.createChild('div', 'activity-icon'); | 327 const icon = container.createChild('div', 'activity-icon'); |
| 328 const name = container.createChild('div', 'activity-name'); | 328 const name = container.createChild('div', 'activity-name'); |
| 329 const event = this._profileNode.event; | 329 const event = this._profileNode.event; |
| 330 if (this._profileNode.isGroupNode()) { | 330 if (this._profileNode.isGroupNode()) { |
| 331 const treeView = /** @type {!WebInspector.AggregatedTimelineTreeView} */ (
this._treeView); | 331 const treeView = /** @type {!Timeline.AggregatedTimelineTreeView} */ (this
._treeView); |
| 332 const info = treeView._displayInfoForGroupNode(this._profileNode); | 332 const info = treeView._displayInfoForGroupNode(this._profileNode); |
| 333 name.textContent = info.name; | 333 name.textContent = info.name; |
| 334 icon.style.backgroundColor = info.color; | 334 icon.style.backgroundColor = info.color; |
| 335 } else if (event) { | 335 } else if (event) { |
| 336 const data = event.args['data']; | 336 const data = event.args['data']; |
| 337 const deoptReason = data && data['deoptReason']; | 337 const deoptReason = data && data['deoptReason']; |
| 338 if (deoptReason) { | 338 if (deoptReason) { |
| 339 container.createChild('div', 'activity-warning').title = | 339 container.createChild('div', 'activity-warning').title = |
| 340 WebInspector.UIString('Not optimized: %s', deoptReason); | 340 Common.UIString('Not optimized: %s', deoptReason); |
| 341 } | 341 } |
| 342 name.textContent = WebInspector.TimelineUIUtils.eventTitle(event); | 342 name.textContent = Timeline.TimelineUIUtils.eventTitle(event); |
| 343 const link = this._treeView._linkifyLocation(event); | 343 const link = this._treeView._linkifyLocation(event); |
| 344 if (link) | 344 if (link) |
| 345 container.createChild('div', 'activity-link').appendChild(link); | 345 container.createChild('div', 'activity-link').appendChild(link); |
| 346 icon.style.backgroundColor = WebInspector.TimelineUIUtils.eventColor(event
); | 346 icon.style.backgroundColor = Timeline.TimelineUIUtils.eventColor(event); |
| 347 } | 347 } |
| 348 return cell; | 348 return cell; |
| 349 } | 349 } |
| 350 | 350 |
| 351 /** | 351 /** |
| 352 * @param {string} columnId | 352 * @param {string} columnId |
| 353 * @return {?Element} | 353 * @return {?Element} |
| 354 */ | 354 */ |
| 355 _createValueCell(columnId) { | 355 _createValueCell(columnId) { |
| 356 if (columnId !== 'self' && columnId !== 'total' && columnId !== 'startTime') | 356 if (columnId !== 'self' && columnId !== 'total' && columnId !== 'startTime') |
| (...skipping 15 matching lines...) Expand all Loading... |
| 372 value = this._profileNode.totalTime; | 372 value = this._profileNode.totalTime; |
| 373 maxTime = this._maxTotalTime; | 373 maxTime = this._maxTotalTime; |
| 374 showPercents = true; | 374 showPercents = true; |
| 375 break; | 375 break; |
| 376 default: | 376 default: |
| 377 return null; | 377 return null; |
| 378 } | 378 } |
| 379 var cell = this.createTD(columnId); | 379 var cell = this.createTD(columnId); |
| 380 cell.className = 'numeric-column'; | 380 cell.className = 'numeric-column'; |
| 381 var textDiv = cell.createChild('div'); | 381 var textDiv = cell.createChild('div'); |
| 382 textDiv.createChild('span').textContent = WebInspector.UIString('%.1f\u2009m
s', value); | 382 textDiv.createChild('span').textContent = Common.UIString('%.1f\u2009ms', va
lue); |
| 383 | 383 |
| 384 if (showPercents && this._treeView._exposePercentages()) | 384 if (showPercents && this._treeView._exposePercentages()) |
| 385 textDiv.createChild('span', 'percent-column').textContent = | 385 textDiv.createChild('span', 'percent-column').textContent = |
| 386 WebInspector.UIString('%.1f\u2009%%', value / this._grandTotalTime * 1
00); | 386 Common.UIString('%.1f\u2009%%', value / this._grandTotalTime * 100); |
| 387 if (maxTime) { | 387 if (maxTime) { |
| 388 textDiv.classList.add('background-percent-bar'); | 388 textDiv.classList.add('background-percent-bar'); |
| 389 cell.createChild('div', 'background-bar-container').createChild('div', 'ba
ckground-bar').style.width = | 389 cell.createChild('div', 'background-bar-container').createChild('div', 'ba
ckground-bar').style.width = |
| 390 (value * 100 / maxTime).toFixed(1) + '%'; | 390 (value * 100 / maxTime).toFixed(1) + '%'; |
| 391 } | 391 } |
| 392 return cell; | 392 return cell; |
| 393 } | 393 } |
| 394 }; | 394 }; |
| 395 | 395 |
| 396 /** | 396 /** |
| 397 * @unrestricted | 397 * @unrestricted |
| 398 */ | 398 */ |
| 399 WebInspector.TimelineTreeView.TreeGridNode = class extends WebInspector.Timeline
TreeView.GridNode { | 399 Timeline.TimelineTreeView.TreeGridNode = class extends Timeline.TimelineTreeView
.GridNode { |
| 400 /** | 400 /** |
| 401 * @param {!WebInspector.TimelineProfileTree.Node} profileNode | 401 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode |
| 402 * @param {number} grandTotalTime | 402 * @param {number} grandTotalTime |
| 403 * @param {number} maxSelfTime | 403 * @param {number} maxSelfTime |
| 404 * @param {number} maxTotalTime | 404 * @param {number} maxTotalTime |
| 405 * @param {!WebInspector.TimelineTreeView} treeView | 405 * @param {!Timeline.TimelineTreeView} treeView |
| 406 */ | 406 */ |
| 407 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView)
{ | 407 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView)
{ |
| 408 super(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView); | 408 super(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView); |
| 409 this.hasChildren = this._profileNode.children ? this._profileNode.children.s
ize > 0 : false; | 409 this.hasChildren = this._profileNode.children ? this._profileNode.children.s
ize > 0 : false; |
| 410 profileNode[WebInspector.TimelineTreeView.TreeGridNode._gridNodeSymbol] = th
is; | 410 profileNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] = this; |
| 411 } | 411 } |
| 412 | 412 |
| 413 /** | 413 /** |
| 414 * @override | 414 * @override |
| 415 */ | 415 */ |
| 416 populate() { | 416 populate() { |
| 417 if (this._populated) | 417 if (this._populated) |
| 418 return; | 418 return; |
| 419 this._populated = true; | 419 this._populated = true; |
| 420 if (!this._profileNode.children) | 420 if (!this._profileNode.children) |
| 421 return; | 421 return; |
| 422 for (var node of this._profileNode.children.values()) { | 422 for (var node of this._profileNode.children.values()) { |
| 423 var gridNode = new WebInspector.TimelineTreeView.TreeGridNode( | 423 var gridNode = new Timeline.TimelineTreeView.TreeGridNode( |
| 424 node, this._grandTotalTime, this._maxSelfTime, this._maxTotalTime, thi
s._treeView); | 424 node, this._grandTotalTime, this._maxSelfTime, this._maxTotalTime, thi
s._treeView); |
| 425 this.insertChildOrdered(gridNode); | 425 this.insertChildOrdered(gridNode); |
| 426 } | 426 } |
| 427 } | 427 } |
| 428 }; | 428 }; |
| 429 | 429 |
| 430 WebInspector.TimelineTreeView.TreeGridNode._gridNodeSymbol = Symbol('treeGridNod
e'); | 430 Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol = Symbol('treeGridNode'); |
| 431 | 431 |
| 432 /** | 432 /** |
| 433 * @unrestricted | 433 * @unrestricted |
| 434 */ | 434 */ |
| 435 WebInspector.AggregatedTimelineTreeView = class extends WebInspector.TimelineTre
eView { | 435 Timeline.AggregatedTimelineTreeView = class extends Timeline.TimelineTreeView { |
| 436 /** | 436 /** |
| 437 * @param {!WebInspector.TimelineModel} model | 437 * @param {!TimelineModel.TimelineModel} model |
| 438 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 438 * @param {!Array<!TimelineModel.TimelineModel.Filter>} filters |
| 439 */ | 439 */ |
| 440 constructor(model, filters) { | 440 constructor(model, filters) { |
| 441 super(); | 441 super(); |
| 442 this._groupBySetting = | 442 this._groupBySetting = |
| 443 WebInspector.settings.createSetting('timelineTreeGroupBy', WebInspector.
AggregatedTimelineTreeView.GroupBy.Category); | 443 Common.settings.createSetting('timelineTreeGroupBy', Timeline.Aggregated
TimelineTreeView.GroupBy.Category); |
| 444 this._init(model, filters); | 444 this._init(model, filters); |
| 445 var nonessentialEvents = [ | 445 var nonessentialEvents = [ |
| 446 WebInspector.TimelineModel.RecordType.EventDispatch, WebInspector.Timeline
Model.RecordType.FunctionCall, | 446 TimelineModel.TimelineModel.RecordType.EventDispatch, TimelineModel.Timeli
neModel.RecordType.FunctionCall, |
| 447 WebInspector.TimelineModel.RecordType.TimerFire | 447 TimelineModel.TimelineModel.RecordType.TimerFire |
| 448 ]; | 448 ]; |
| 449 this._filters.push(new WebInspector.ExclusiveNameFilter(nonessentialEvents))
; | 449 this._filters.push(new TimelineModel.ExclusiveNameFilter(nonessentialEvents)
); |
| 450 this._stackView = new WebInspector.TimelineStackView(this); | 450 this._stackView = new Timeline.TimelineStackView(this); |
| 451 this._stackView.addEventListener( | 451 this._stackView.addEventListener( |
| 452 WebInspector.TimelineStackView.Events.SelectionChanged, this._onStackVie
wSelectionChanged, this); | 452 Timeline.TimelineStackView.Events.SelectionChanged, this._onStackViewSel
ectionChanged, this); |
| 453 } | 453 } |
| 454 | 454 |
| 455 /** | 455 /** |
| 456 * @override | 456 * @override |
| 457 * @param {!WebInspector.TimelineSelection} selection | 457 * @param {!Timeline.TimelineSelection} selection |
| 458 */ | 458 */ |
| 459 updateContents(selection) { | 459 updateContents(selection) { |
| 460 this._updateExtensionResolver(); | 460 this._updateExtensionResolver(); |
| 461 super.updateContents(selection); | 461 super.updateContents(selection); |
| 462 var rootNode = this._dataGrid.rootNode(); | 462 var rootNode = this._dataGrid.rootNode(); |
| 463 if (rootNode.children.length) | 463 if (rootNode.children.length) |
| 464 rootNode.children[0].revealAndSelect(); | 464 rootNode.children[0].revealAndSelect(); |
| 465 } | 465 } |
| 466 | 466 |
| 467 _updateExtensionResolver() { | 467 _updateExtensionResolver() { |
| 468 this._executionContextNamesByOrigin = new Map(); | 468 this._executionContextNamesByOrigin = new Map(); |
| 469 for (var target of WebInspector.targetManager.targets()) { | 469 for (var target of SDK.targetManager.targets()) { |
| 470 for (var context of target.runtimeModel.executionContexts()) | 470 for (var context of target.runtimeModel.executionContexts()) |
| 471 this._executionContextNamesByOrigin.set(context.origin, context.name); | 471 this._executionContextNamesByOrigin.set(context.origin, context.name); |
| 472 } | 472 } |
| 473 } | 473 } |
| 474 | 474 |
| 475 /** | 475 /** |
| 476 * @param {!WebInspector.TimelineProfileTree.Node} node | 476 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 477 * @return {!{name: string, color: string}} | 477 * @return {!{name: string, color: string}} |
| 478 */ | 478 */ |
| 479 _displayInfoForGroupNode(node) { | 479 _displayInfoForGroupNode(node) { |
| 480 var categories = WebInspector.TimelineUIUtils.categories(); | 480 var categories = Timeline.TimelineUIUtils.categories(); |
| 481 var color = node.id ? WebInspector.TimelineUIUtils.eventColor(node.event) :
categories['other'].color; | 481 var color = node.id ? Timeline.TimelineUIUtils.eventColor(node.event) : cate
gories['other'].color; |
| 482 | 482 |
| 483 switch (this._groupBySetting.get()) { | 483 switch (this._groupBySetting.get()) { |
| 484 case WebInspector.AggregatedTimelineTreeView.GroupBy.Category: | 484 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: |
| 485 var category = categories[node.id] || categories['other']; | 485 var category = categories[node.id] || categories['other']; |
| 486 return {name: category.title, color: category.color}; | 486 return {name: category.title, color: category.color}; |
| 487 | 487 |
| 488 case WebInspector.AggregatedTimelineTreeView.GroupBy.Domain: | 488 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: |
| 489 case WebInspector.AggregatedTimelineTreeView.GroupBy.Subdomain: | 489 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: |
| 490 var name = node.id; | 490 var name = node.id; |
| 491 if (WebInspector.AggregatedTimelineTreeView._isExtensionInternalURL(name
)) | 491 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) |
| 492 name = WebInspector.UIString('[Chrome extensions overhead]'); | 492 name = Common.UIString('[Chrome extensions overhead]'); |
| 493 else if (name.startsWith('chrome-extension')) | 493 else if (name.startsWith('chrome-extension')) |
| 494 name = this._executionContextNamesByOrigin.get(name) || name; | 494 name = this._executionContextNamesByOrigin.get(name) || name; |
| 495 return {name: name || WebInspector.UIString('unattributed'), color: colo
r}; | 495 return {name: name || Common.UIString('unattributed'), color: color}; |
| 496 | 496 |
| 497 case WebInspector.AggregatedTimelineTreeView.GroupBy.EventName: | 497 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: |
| 498 var name = node.event.name === WebInspector.TimelineModel.RecordType.JSF
rame ? | 498 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS
Frame ? |
| 499 WebInspector.UIString('JavaScript') : | 499 Common.UIString('JavaScript') : |
| 500 WebInspector.TimelineUIUtils.eventTitle(node.event); | 500 Timeline.TimelineUIUtils.eventTitle(node.event); |
| 501 return { | 501 return { |
| 502 name: name, | 502 name: name, |
| 503 color: node.event.name === WebInspector.TimelineModel.RecordType.JSFra
me ? | 503 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr
ame ? |
| 504 WebInspector.TimelineUIUtils.eventStyle(node.event).category.color
: | 504 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : |
| 505 color | 505 color |
| 506 }; | 506 }; |
| 507 | 507 |
| 508 case WebInspector.AggregatedTimelineTreeView.GroupBy.URL: | 508 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: |
| 509 break; | 509 break; |
| 510 case WebInspector.AggregatedTimelineTreeView.GroupBy.Frame: | 510 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: |
| 511 var frame = this._model.pageFrameById(node.id); | 511 var frame = this._model.pageFrameById(node.id); |
| 512 var frameName = frame ? WebInspector.TimelineUIUtils.displayNameForFrame
(frame, 80) : WebInspector.UIString('Page'); | 512 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra
me, 80) : Common.UIString('Page'); |
| 513 return { | 513 return { |
| 514 name: frameName, | 514 name: frameName, |
| 515 color: color | 515 color: color |
| 516 }; | 516 }; |
| 517 break; | 517 break; |
| 518 | 518 |
| 519 default: | 519 default: |
| 520 console.assert(false, 'Unexpected aggregation type'); | 520 console.assert(false, 'Unexpected aggregation type'); |
| 521 } | 521 } |
| 522 return {name: node.id || WebInspector.UIString('unattributed'), color: color
}; | 522 return {name: node.id || Common.UIString('unattributed'), color: color}; |
| 523 } | 523 } |
| 524 | 524 |
| 525 /** | 525 /** |
| 526 * @override | 526 * @override |
| 527 * @param {!Element} parent | 527 * @param {!Element} parent |
| 528 */ | 528 */ |
| 529 _populateToolbar(parent) { | 529 _populateToolbar(parent) { |
| 530 var panelToolbar = new WebInspector.Toolbar('', parent); | 530 var panelToolbar = new UI.Toolbar('', parent); |
| 531 this._groupByCombobox = new WebInspector.ToolbarComboBox(this._onGroupByChan
ged.bind(this)); | 531 this._groupByCombobox = new UI.ToolbarComboBox(this._onGroupByChanged.bind(t
his)); |
| 532 /** | 532 /** |
| 533 * @param {string} name | 533 * @param {string} name |
| 534 * @param {string} id | 534 * @param {string} id |
| 535 * @this {WebInspector.TimelineTreeView} | 535 * @this {Timeline.TimelineTreeView} |
| 536 */ | 536 */ |
| 537 function addGroupingOption(name, id) { | 537 function addGroupingOption(name, id) { |
| 538 var option = this._groupByCombobox.createOption(name, '', id); | 538 var option = this._groupByCombobox.createOption(name, '', id); |
| 539 this._groupByCombobox.addOption(option); | 539 this._groupByCombobox.addOption(option); |
| 540 if (id === this._groupBySetting.get()) | 540 if (id === this._groupBySetting.get()) |
| 541 this._groupByCombobox.select(option); | 541 this._groupByCombobox.select(option); |
| 542 } | 542 } |
| 543 const groupBy = WebInspector.AggregatedTimelineTreeView.GroupBy; | 543 const groupBy = Timeline.AggregatedTimelineTreeView.GroupBy; |
| 544 addGroupingOption.call(this, WebInspector.UIString('No Grouping'), groupBy.N
one); | 544 addGroupingOption.call(this, Common.UIString('No Grouping'), groupBy.None); |
| 545 addGroupingOption.call(this, WebInspector.UIString('Group by Activity'), gro
upBy.EventName); | 545 addGroupingOption.call(this, Common.UIString('Group by Activity'), groupBy.E
ventName); |
| 546 addGroupingOption.call(this, WebInspector.UIString('Group by Category'), gro
upBy.Category); | 546 addGroupingOption.call(this, Common.UIString('Group by Category'), groupBy.C
ategory); |
| 547 addGroupingOption.call(this, WebInspector.UIString('Group by Domain'), group
By.Domain); | 547 addGroupingOption.call(this, Common.UIString('Group by Domain'), groupBy.Dom
ain); |
| 548 addGroupingOption.call(this, WebInspector.UIString('Group by Subdomain'), gr
oupBy.Subdomain); | 548 addGroupingOption.call(this, Common.UIString('Group by Subdomain'), groupBy.
Subdomain); |
| 549 addGroupingOption.call(this, WebInspector.UIString('Group by URL'), groupBy.
URL); | 549 addGroupingOption.call(this, Common.UIString('Group by URL'), groupBy.URL); |
| 550 addGroupingOption.call(this, WebInspector.UIString('Group by Frame'), groupB
y.Frame); | 550 addGroupingOption.call(this, Common.UIString('Group by Frame'), groupBy.Fram
e); |
| 551 panelToolbar.appendToolbarItem(this._groupByCombobox); | 551 panelToolbar.appendToolbarItem(this._groupByCombobox); |
| 552 } | 552 } |
| 553 | 553 |
| 554 /** | 554 /** |
| 555 * @param {!WebInspector.TimelineProfileTree.Node} treeNode | 555 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode |
| 556 * @return {!Array<!WebInspector.TimelineProfileTree.Node>} | 556 * @return {!Array<!TimelineModel.TimelineProfileTree.Node>} |
| 557 */ | 557 */ |
| 558 _buildHeaviestStack(treeNode) { | 558 _buildHeaviestStack(treeNode) { |
| 559 console.assert(!!treeNode.parent, 'Attempt to build stack for tree root'); | 559 console.assert(!!treeNode.parent, 'Attempt to build stack for tree root'); |
| 560 var result = []; | 560 var result = []; |
| 561 // Do not add root to the stack, as it's the tree itself. | 561 // Do not add root to the stack, as it's the tree itself. |
| 562 for (var node = treeNode; node && node.parent; node = node.parent) | 562 for (var node = treeNode; node && node.parent; node = node.parent) |
| 563 result.push(node); | 563 result.push(node); |
| 564 result = result.reverse(); | 564 result = result.reverse(); |
| 565 for (node = treeNode; node && node.children && node.children.size;) { | 565 for (node = treeNode; node && node.children && node.children.size;) { |
| 566 var children = Array.from(node.children.values()); | 566 var children = Array.from(node.children.values()); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 584 } | 584 } |
| 585 | 585 |
| 586 _onStackViewSelectionChanged() { | 586 _onStackViewSelectionChanged() { |
| 587 var treeNode = this._stackView.selectedTreeNode(); | 587 var treeNode = this._stackView.selectedTreeNode(); |
| 588 if (treeNode) | 588 if (treeNode) |
| 589 this.selectProfileNode(treeNode, true); | 589 this.selectProfileNode(treeNode, true); |
| 590 } | 590 } |
| 591 | 591 |
| 592 /** | 592 /** |
| 593 * @override | 593 * @override |
| 594 * @param {!WebInspector.TimelineProfileTree.Node} node | 594 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 595 * @return {boolean} | 595 * @return {boolean} |
| 596 */ | 596 */ |
| 597 _showDetailsForNode(node) { | 597 _showDetailsForNode(node) { |
| 598 var stack = this._buildHeaviestStack(node); | 598 var stack = this._buildHeaviestStack(node); |
| 599 this._stackView.setStack(stack, node); | 599 this._stackView.setStack(stack, node); |
| 600 this._stackView.show(this._detailsView.element); | 600 this._stackView.show(this._detailsView.element); |
| 601 return true; | 601 return true; |
| 602 } | 602 } |
| 603 | 603 |
| 604 /** | 604 /** |
| 605 * @param {!WebInspector.AggregatedTimelineTreeView.GroupBy} groupBy | 605 * @param {!Timeline.AggregatedTimelineTreeView.GroupBy} groupBy |
| 606 * @return {function(!WebInspector.TracingModel.Event):string} | 606 * @return {function(!SDK.TracingModel.Event):string} |
| 607 */ | 607 */ |
| 608 _groupingFunction(groupBy) { | 608 _groupingFunction(groupBy) { |
| 609 /** | 609 /** |
| 610 * @param {!WebInspector.TracingModel.Event} event | 610 * @param {!SDK.TracingModel.Event} event |
| 611 * @return {string} | 611 * @return {string} |
| 612 */ | 612 */ |
| 613 function groupByURL(event) { | 613 function groupByURL(event) { |
| 614 return WebInspector.TimelineProfileTree.eventURL(event) || ''; | 614 return TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 615 } | 615 } |
| 616 | 616 |
| 617 /** | 617 /** |
| 618 * @param {boolean} groupSubdomains | 618 * @param {boolean} groupSubdomains |
| 619 * @param {!WebInspector.TracingModel.Event} event | 619 * @param {!SDK.TracingModel.Event} event |
| 620 * @return {string} | 620 * @return {string} |
| 621 */ | 621 */ |
| 622 function groupByDomain(groupSubdomains, event) { | 622 function groupByDomain(groupSubdomains, event) { |
| 623 var url = WebInspector.TimelineProfileTree.eventURL(event) || ''; | 623 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 624 if (WebInspector.AggregatedTimelineTreeView._isExtensionInternalURL(url)) | 624 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) |
| 625 return WebInspector.AggregatedTimelineTreeView._extensionInternalPrefix; | 625 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; |
| 626 var parsedURL = url.asParsedURL(); | 626 var parsedURL = url.asParsedURL(); |
| 627 if (!parsedURL) | 627 if (!parsedURL) |
| 628 return ''; | 628 return ''; |
| 629 if (parsedURL.scheme === 'chrome-extension') | 629 if (parsedURL.scheme === 'chrome-extension') |
| 630 return parsedURL.scheme + '://' + parsedURL.host; | 630 return parsedURL.scheme + '://' + parsedURL.host; |
| 631 if (!groupSubdomains) | 631 if (!groupSubdomains) |
| 632 return parsedURL.host; | 632 return parsedURL.host; |
| 633 if (/^[.0-9]+$/.test(parsedURL.host)) | 633 if (/^[.0-9]+$/.test(parsedURL.host)) |
| 634 return parsedURL.host; | 634 return parsedURL.host; |
| 635 var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); | 635 var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); |
| 636 return domainMatch && domainMatch[0] || ''; | 636 return domainMatch && domainMatch[0] || ''; |
| 637 } | 637 } |
| 638 | 638 |
| 639 switch (groupBy) { | 639 switch (groupBy) { |
| 640 case WebInspector.AggregatedTimelineTreeView.GroupBy.None: | 640 case Timeline.AggregatedTimelineTreeView.GroupBy.None: |
| 641 return () => Symbol('uniqueGroupId'); | 641 return () => Symbol('uniqueGroupId'); |
| 642 case WebInspector.AggregatedTimelineTreeView.GroupBy.EventName: | 642 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: |
| 643 return event => WebInspector.TimelineUIUtils.eventStyle(event).title; | 643 return event => Timeline.TimelineUIUtils.eventStyle(event).title; |
| 644 case WebInspector.AggregatedTimelineTreeView.GroupBy.Category: | 644 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: |
| 645 return event => WebInspector.TimelineUIUtils.eventStyle(event).category.
name; | 645 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name
; |
| 646 case WebInspector.AggregatedTimelineTreeView.GroupBy.Subdomain: | 646 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: |
| 647 return groupByDomain.bind(null, false); | 647 return groupByDomain.bind(null, false); |
| 648 case WebInspector.AggregatedTimelineTreeView.GroupBy.Domain: | 648 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: |
| 649 return groupByDomain.bind(null, true); | 649 return groupByDomain.bind(null, true); |
| 650 case WebInspector.AggregatedTimelineTreeView.GroupBy.URL: | 650 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: |
| 651 return groupByURL; | 651 return groupByURL; |
| 652 case WebInspector.AggregatedTimelineTreeView.GroupBy.Frame: | 652 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: |
| 653 return event => WebInspector.TimelineData.forEvent(event).frameId; | 653 return event => TimelineModel.TimelineData.forEvent(event).frameId; |
| 654 default: | 654 default: |
| 655 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); | 655 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); |
| 656 return () => Symbol('uniqueGroupId'); | 656 return () => Symbol('uniqueGroupId'); |
| 657 } | 657 } |
| 658 } | 658 } |
| 659 | 659 |
| 660 /** | 660 /** |
| 661 * @param {string} url | 661 * @param {string} url |
| 662 * @return {boolean} | 662 * @return {boolean} |
| 663 */ | 663 */ |
| 664 static _isExtensionInternalURL(url) { | 664 static _isExtensionInternalURL(url) { |
| 665 return url.startsWith(WebInspector.AggregatedTimelineTreeView._extensionInte
rnalPrefix); | 665 return url.startsWith(Timeline.AggregatedTimelineTreeView._extensionInternal
Prefix); |
| 666 } | 666 } |
| 667 }; | 667 }; |
| 668 | 668 |
| 669 WebInspector.AggregatedTimelineTreeView._extensionInternalPrefix = 'extensions::
'; | 669 Timeline.AggregatedTimelineTreeView._extensionInternalPrefix = 'extensions::'; |
| 670 | 670 |
| 671 /** | 671 /** |
| 672 * @enum {string} | 672 * @enum {string} |
| 673 */ | 673 */ |
| 674 WebInspector.AggregatedTimelineTreeView.GroupBy = { | 674 Timeline.AggregatedTimelineTreeView.GroupBy = { |
| 675 None: 'None', | 675 None: 'None', |
| 676 EventName: 'EventName', | 676 EventName: 'EventName', |
| 677 Category: 'Category', | 677 Category: 'Category', |
| 678 Domain: 'Domain', | 678 Domain: 'Domain', |
| 679 Subdomain: 'Subdomain', | 679 Subdomain: 'Subdomain', |
| 680 URL: 'URL', | 680 URL: 'URL', |
| 681 Frame: 'Frame' | 681 Frame: 'Frame' |
| 682 }; | 682 }; |
| 683 | 683 |
| 684 /** | 684 /** |
| 685 * @unrestricted | 685 * @unrestricted |
| 686 */ | 686 */ |
| 687 WebInspector.CallTreeTimelineTreeView = class extends WebInspector.AggregatedTim
elineTreeView { | 687 Timeline.CallTreeTimelineTreeView = class extends Timeline.AggregatedTimelineTre
eView { |
| 688 /** | 688 /** |
| 689 * @param {!WebInspector.TimelineModel} model | 689 * @param {!TimelineModel.TimelineModel} model |
| 690 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 690 * @param {!Array<!TimelineModel.TimelineModel.Filter>} filters |
| 691 */ | 691 */ |
| 692 constructor(model, filters) { | 692 constructor(model, filters) { |
| 693 super(model, filters); | 693 super(model, filters); |
| 694 this._dataGrid.markColumnAsSortedBy('total', WebInspector.DataGrid.Order.Des
cending); | 694 this._dataGrid.markColumnAsSortedBy('total', UI.DataGrid.Order.Descending); |
| 695 } | 695 } |
| 696 | 696 |
| 697 /** | 697 /** |
| 698 * @override | 698 * @override |
| 699 * @return {!WebInspector.TimelineProfileTree.Node} | 699 * @return {!TimelineModel.TimelineProfileTree.Node} |
| 700 */ | 700 */ |
| 701 _buildTree() { | 701 _buildTree() { |
| 702 var grouping = this._groupBySetting.get(); | 702 var grouping = this._groupBySetting.get(); |
| 703 var topDown = this._buildTopDownTree(this._groupingFunction(grouping)); | 703 var topDown = this._buildTopDownTree(this._groupingFunction(grouping)); |
| 704 if (grouping === WebInspector.AggregatedTimelineTreeView.GroupBy.None) | 704 if (grouping === Timeline.AggregatedTimelineTreeView.GroupBy.None) |
| 705 return topDown; | 705 return topDown; |
| 706 return new WebInspector.TimelineAggregator().performGrouping(topDown); | 706 return new TimelineModel.TimelineAggregator().performGrouping(topDown); |
| 707 } | 707 } |
| 708 }; | 708 }; |
| 709 | 709 |
| 710 /** | 710 /** |
| 711 * @unrestricted | 711 * @unrestricted |
| 712 */ | 712 */ |
| 713 WebInspector.BottomUpTimelineTreeView = class extends WebInspector.AggregatedTim
elineTreeView { | 713 Timeline.BottomUpTimelineTreeView = class extends Timeline.AggregatedTimelineTre
eView { |
| 714 /** | 714 /** |
| 715 * @param {!WebInspector.TimelineModel} model | 715 * @param {!TimelineModel.TimelineModel} model |
| 716 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 716 * @param {!Array<!TimelineModel.TimelineModel.Filter>} filters |
| 717 */ | 717 */ |
| 718 constructor(model, filters) { | 718 constructor(model, filters) { |
| 719 super(model, filters); | 719 super(model, filters); |
| 720 this._dataGrid.markColumnAsSortedBy('self', WebInspector.DataGrid.Order.Desc
ending); | 720 this._dataGrid.markColumnAsSortedBy('self', UI.DataGrid.Order.Descending); |
| 721 } | 721 } |
| 722 | 722 |
| 723 /** | 723 /** |
| 724 * @override | 724 * @override |
| 725 * @return {!WebInspector.TimelineProfileTree.Node} | 725 * @return {!TimelineModel.TimelineProfileTree.Node} |
| 726 */ | 726 */ |
| 727 _buildTree() { | 727 _buildTree() { |
| 728 var topDown = this._buildTopDownTree(this._groupingFunction(this._groupBySet
ting.get())); | 728 var topDown = this._buildTopDownTree(this._groupingFunction(this._groupBySet
ting.get())); |
| 729 return WebInspector.TimelineProfileTree.buildBottomUp(topDown); | 729 return TimelineModel.TimelineProfileTree.buildBottomUp(topDown); |
| 730 } | 730 } |
| 731 }; | 731 }; |
| 732 | 732 |
| 733 /** | 733 /** |
| 734 * @unrestricted | 734 * @unrestricted |
| 735 */ | 735 */ |
| 736 WebInspector.EventsTimelineTreeView = class extends WebInspector.TimelineTreeVie
w { | 736 Timeline.EventsTimelineTreeView = class extends Timeline.TimelineTreeView { |
| 737 /** | 737 /** |
| 738 * @param {!WebInspector.TimelineModel} model | 738 * @param {!TimelineModel.TimelineModel} model |
| 739 * @param {!Array<!WebInspector.TimelineModel.Filter>} filters | 739 * @param {!Array<!TimelineModel.TimelineModel.Filter>} filters |
| 740 * @param {!WebInspector.TimelineModeViewDelegate} delegate | 740 * @param {!Timeline.TimelineModeViewDelegate} delegate |
| 741 */ | 741 */ |
| 742 constructor(model, filters, delegate) { | 742 constructor(model, filters, delegate) { |
| 743 super(); | 743 super(); |
| 744 this._filtersControl = new WebInspector.TimelineFilters(); | 744 this._filtersControl = new Timeline.TimelineFilters(); |
| 745 this._filtersControl.addEventListener( | 745 this._filtersControl.addEventListener( |
| 746 WebInspector.TimelineFilters.Events.FilterChanged, this._onFilterChanged
, this); | 746 Timeline.TimelineFilters.Events.FilterChanged, this._onFilterChanged, th
is); |
| 747 this._init(model, filters); | 747 this._init(model, filters); |
| 748 this._delegate = delegate; | 748 this._delegate = delegate; |
| 749 this._filters.push.apply(this._filters, this._filtersControl.filters()); | 749 this._filters.push.apply(this._filters, this._filtersControl.filters()); |
| 750 this._dataGrid.markColumnAsSortedBy('startTime', WebInspector.DataGrid.Order
.Ascending); | 750 this._dataGrid.markColumnAsSortedBy('startTime', UI.DataGrid.Order.Ascending
); |
| 751 } | 751 } |
| 752 | 752 |
| 753 /** | 753 /** |
| 754 * @override | 754 * @override |
| 755 * @param {!WebInspector.TimelineSelection} selection | 755 * @param {!Timeline.TimelineSelection} selection |
| 756 */ | 756 */ |
| 757 updateContents(selection) { | 757 updateContents(selection) { |
| 758 super.updateContents(selection); | 758 super.updateContents(selection); |
| 759 if (selection.type() === WebInspector.TimelineSelection.Type.TraceEvent) { | 759 if (selection.type() === Timeline.TimelineSelection.Type.TraceEvent) { |
| 760 var event = /** @type {!WebInspector.TracingModel.Event} */ (selection.obj
ect()); | 760 var event = /** @type {!SDK.TracingModel.Event} */ (selection.object()); |
| 761 this._selectEvent(event, true); | 761 this._selectEvent(event, true); |
| 762 } | 762 } |
| 763 } | 763 } |
| 764 | 764 |
| 765 /** | 765 /** |
| 766 * @override | 766 * @override |
| 767 * @return {!WebInspector.TimelineProfileTree.Node} | 767 * @return {!TimelineModel.TimelineProfileTree.Node} |
| 768 */ | 768 */ |
| 769 _buildTree() { | 769 _buildTree() { |
| 770 this._currentTree = this._buildTopDownTree(); | 770 this._currentTree = this._buildTopDownTree(); |
| 771 return this._currentTree; | 771 return this._currentTree; |
| 772 } | 772 } |
| 773 | 773 |
| 774 _onFilterChanged() { | 774 _onFilterChanged() { |
| 775 var selectedEvent = this._lastSelectedNode && this._lastSelectedNode.event; | 775 var selectedEvent = this._lastSelectedNode && this._lastSelectedNode.event; |
| 776 this._refreshTree(); | 776 this._refreshTree(); |
| 777 if (selectedEvent) | 777 if (selectedEvent) |
| 778 this._selectEvent(selectedEvent, false); | 778 this._selectEvent(selectedEvent, false); |
| 779 } | 779 } |
| 780 | 780 |
| 781 /** | 781 /** |
| 782 * @param {!WebInspector.TracingModel.Event} event | 782 * @param {!SDK.TracingModel.Event} event |
| 783 * @return {?WebInspector.TimelineProfileTree.Node} | 783 * @return {?TimelineModel.TimelineProfileTree.Node} |
| 784 */ | 784 */ |
| 785 _findNodeWithEvent(event) { | 785 _findNodeWithEvent(event) { |
| 786 var iterators = [this._currentTree.children.values()]; | 786 var iterators = [this._currentTree.children.values()]; |
| 787 | 787 |
| 788 while (iterators.length) { | 788 while (iterators.length) { |
| 789 var iterator = iterators.peekLast().next(); | 789 var iterator = iterators.peekLast().next(); |
| 790 if (iterator.done) { | 790 if (iterator.done) { |
| 791 iterators.pop(); | 791 iterators.pop(); |
| 792 continue; | 792 continue; |
| 793 } | 793 } |
| 794 var child = /** @type {!WebInspector.TimelineProfileTree.Node} */ (iterato
r.value); | 794 var child = /** @type {!TimelineModel.TimelineProfileTree.Node} */ (iterat
or.value); |
| 795 if (child.event === event) | 795 if (child.event === event) |
| 796 return child; | 796 return child; |
| 797 if (child.children) | 797 if (child.children) |
| 798 iterators.push(child.children.values()); | 798 iterators.push(child.children.values()); |
| 799 } | 799 } |
| 800 return null; | 800 return null; |
| 801 } | 801 } |
| 802 | 802 |
| 803 /** | 803 /** |
| 804 * @param {!WebInspector.TracingModel.Event} event | 804 * @param {!SDK.TracingModel.Event} event |
| 805 * @param {boolean=} expand | 805 * @param {boolean=} expand |
| 806 */ | 806 */ |
| 807 _selectEvent(event, expand) { | 807 _selectEvent(event, expand) { |
| 808 var node = this._findNodeWithEvent(event); | 808 var node = this._findNodeWithEvent(event); |
| 809 if (!node) | 809 if (!node) |
| 810 return; | 810 return; |
| 811 this.selectProfileNode(node, false); | 811 this.selectProfileNode(node, false); |
| 812 if (expand) | 812 if (expand) |
| 813 this._dataGridNodeForTreeNode(node).expand(); | 813 this._dataGridNodeForTreeNode(node).expand(); |
| 814 } | 814 } |
| 815 | 815 |
| 816 /** | 816 /** |
| 817 * @override | 817 * @override |
| 818 * @param {!Array<!WebInspector.DataGrid.ColumnDescriptor>} columns | 818 * @param {!Array<!UI.DataGrid.ColumnDescriptor>} columns |
| 819 */ | 819 */ |
| 820 _populateColumns(columns) { | 820 _populateColumns(columns) { |
| 821 columns.push({ | 821 columns.push({ |
| 822 id: 'startTime', | 822 id: 'startTime', |
| 823 title: WebInspector.UIString('Start Time'), | 823 title: Common.UIString('Start Time'), |
| 824 width: '110px', | 824 width: '110px', |
| 825 fixedWidth: true, | 825 fixedWidth: true, |
| 826 sortable: true | 826 sortable: true |
| 827 }); | 827 }); |
| 828 super._populateColumns(columns); | 828 super._populateColumns(columns); |
| 829 } | 829 } |
| 830 | 830 |
| 831 /** | 831 /** |
| 832 * @override | 832 * @override |
| 833 * @param {!Element} parent | 833 * @param {!Element} parent |
| 834 */ | 834 */ |
| 835 _populateToolbar(parent) { | 835 _populateToolbar(parent) { |
| 836 var filtersWidget = this._filtersControl.filtersWidget(); | 836 var filtersWidget = this._filtersControl.filtersWidget(); |
| 837 filtersWidget.forceShowFilterBar(); | 837 filtersWidget.forceShowFilterBar(); |
| 838 filtersWidget.show(parent); | 838 filtersWidget.show(parent); |
| 839 } | 839 } |
| 840 | 840 |
| 841 /** | 841 /** |
| 842 * @override | 842 * @override |
| 843 * @param {!WebInspector.TimelineProfileTree.Node} node | 843 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 844 * @return {boolean} | 844 * @return {boolean} |
| 845 */ | 845 */ |
| 846 _showDetailsForNode(node) { | 846 _showDetailsForNode(node) { |
| 847 var traceEvent = node.event; | 847 var traceEvent = node.event; |
| 848 if (!traceEvent) | 848 if (!traceEvent) |
| 849 return false; | 849 return false; |
| 850 WebInspector.TimelineUIUtils.buildTraceEventDetails( | 850 Timeline.TimelineUIUtils.buildTraceEventDetails( |
| 851 traceEvent, this._model, this._linkifier, false, showDetails.bind(this))
; | 851 traceEvent, this._model, this._linkifier, false, showDetails.bind(this))
; |
| 852 return true; | 852 return true; |
| 853 | 853 |
| 854 /** | 854 /** |
| 855 * @param {!DocumentFragment} fragment | 855 * @param {!DocumentFragment} fragment |
| 856 * @this {WebInspector.EventsTimelineTreeView} | 856 * @this {Timeline.EventsTimelineTreeView} |
| 857 */ | 857 */ |
| 858 function showDetails(fragment) { | 858 function showDetails(fragment) { |
| 859 this._detailsView.element.appendChild(fragment); | 859 this._detailsView.element.appendChild(fragment); |
| 860 } | 860 } |
| 861 } | 861 } |
| 862 | 862 |
| 863 /** | 863 /** |
| 864 * @override | 864 * @override |
| 865 * @param {?WebInspector.TimelineProfileTree.Node} node | 865 * @param {?TimelineModel.TimelineProfileTree.Node} node |
| 866 */ | 866 */ |
| 867 _onHover(node) { | 867 _onHover(node) { |
| 868 this._delegate.highlightEvent(node && node.event); | 868 this._delegate.highlightEvent(node && node.event); |
| 869 } | 869 } |
| 870 }; | 870 }; |
| 871 | 871 |
| 872 /** | 872 /** |
| 873 * @unrestricted | 873 * @unrestricted |
| 874 */ | 874 */ |
| 875 WebInspector.TimelineStackView = class extends WebInspector.VBox { | 875 Timeline.TimelineStackView = class extends UI.VBox { |
| 876 constructor(treeView) { | 876 constructor(treeView) { |
| 877 super(); | 877 super(); |
| 878 var header = this.element.createChild('div', 'timeline-stack-view-header'); | 878 var header = this.element.createChild('div', 'timeline-stack-view-header'); |
| 879 header.textContent = WebInspector.UIString('Heaviest stack'); | 879 header.textContent = Common.UIString('Heaviest stack'); |
| 880 this._treeView = treeView; | 880 this._treeView = treeView; |
| 881 var columns = /** @type {!Array<!WebInspector.DataGrid.ColumnDescriptor>} */
([ | 881 var columns = /** @type {!Array<!UI.DataGrid.ColumnDescriptor>} */ ([ |
| 882 {id: 'total', title: WebInspector.UIString('Total Time'), fixedWidth: true
, width: '110px'}, | 882 {id: 'total', title: Common.UIString('Total Time'), fixedWidth: true, widt
h: '110px'}, |
| 883 {id: 'activity', title: WebInspector.UIString('Activity')} | 883 {id: 'activity', title: Common.UIString('Activity')} |
| 884 ]); | 884 ]); |
| 885 this._dataGrid = new WebInspector.ViewportDataGrid(columns); | 885 this._dataGrid = new UI.ViewportDataGrid(columns); |
| 886 this._dataGrid.setResizeMethod(WebInspector.DataGrid.ResizeMethod.Last); | 886 this._dataGrid.setResizeMethod(UI.DataGrid.ResizeMethod.Last); |
| 887 this._dataGrid.addEventListener(WebInspector.DataGrid.Events.SelectedNode, t
his._onSelectionChanged, this); | 887 this._dataGrid.addEventListener(UI.DataGrid.Events.SelectedNode, this._onSel
ectionChanged, this); |
| 888 this._dataGrid.asWidget().show(this.element); | 888 this._dataGrid.asWidget().show(this.element); |
| 889 } | 889 } |
| 890 | 890 |
| 891 /** | 891 /** |
| 892 * @param {!Array<!WebInspector.TimelineProfileTree.Node>} stack | 892 * @param {!Array<!TimelineModel.TimelineProfileTree.Node>} stack |
| 893 * @param {!WebInspector.TimelineProfileTree.Node} selectedNode | 893 * @param {!TimelineModel.TimelineProfileTree.Node} selectedNode |
| 894 */ | 894 */ |
| 895 setStack(stack, selectedNode) { | 895 setStack(stack, selectedNode) { |
| 896 var rootNode = this._dataGrid.rootNode(); | 896 var rootNode = this._dataGrid.rootNode(); |
| 897 rootNode.removeChildren(); | 897 rootNode.removeChildren(); |
| 898 var nodeToReveal = null; | 898 var nodeToReveal = null; |
| 899 var totalTime = Math.max.apply(Math, stack.map(node => node.totalTime)); | 899 var totalTime = Math.max.apply(Math, stack.map(node => node.totalTime)); |
| 900 for (var node of stack) { | 900 for (var node of stack) { |
| 901 var gridNode = new WebInspector.TimelineTreeView.GridNode(node, totalTime,
totalTime, totalTime, this._treeView); | 901 var gridNode = new Timeline.TimelineTreeView.GridNode(node, totalTime, tot
alTime, totalTime, this._treeView); |
| 902 rootNode.appendChild(gridNode); | 902 rootNode.appendChild(gridNode); |
| 903 if (node === selectedNode) | 903 if (node === selectedNode) |
| 904 nodeToReveal = gridNode; | 904 nodeToReveal = gridNode; |
| 905 } | 905 } |
| 906 nodeToReveal.revealAndSelect(); | 906 nodeToReveal.revealAndSelect(); |
| 907 } | 907 } |
| 908 | 908 |
| 909 /** | 909 /** |
| 910 * @return {?WebInspector.TimelineProfileTree.Node} | 910 * @return {?TimelineModel.TimelineProfileTree.Node} |
| 911 */ | 911 */ |
| 912 selectedTreeNode() { | 912 selectedTreeNode() { |
| 913 var selectedNode = this._dataGrid.selectedNode; | 913 var selectedNode = this._dataGrid.selectedNode; |
| 914 return selectedNode && /** @type {!WebInspector.TimelineTreeView.GridNode} *
/ (selectedNode)._profileNode; | 914 return selectedNode && /** @type {!Timeline.TimelineTreeView.GridNode} */ (s
electedNode)._profileNode; |
| 915 } | 915 } |
| 916 | 916 |
| 917 _onSelectionChanged() { | 917 _onSelectionChanged() { |
| 918 this.dispatchEventToListeners(WebInspector.TimelineStackView.Events.Selectio
nChanged); | 918 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha
nged); |
| 919 } | 919 } |
| 920 }; | 920 }; |
| 921 | 921 |
| 922 /** @enum {symbol} */ | 922 /** @enum {symbol} */ |
| 923 WebInspector.TimelineStackView.Events = { | 923 Timeline.TimelineStackView.Events = { |
| 924 SelectionChanged: Symbol('SelectionChanged') | 924 SelectionChanged: Symbol('SelectionChanged') |
| 925 }; | 925 }; |
| OLD | NEW |