Chromium Code Reviews| 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 /** | 
| 5 * @unrestricted | 6 * @unrestricted | 
| 6 */ | 7 */ | 
| 7 Timeline.TimelineTreeView = class extends UI.VBox { | 8 Timeline.TimelineTreeView = class extends UI.VBox { | 
| 8 constructor() { | 9 constructor() { | 
| 9 super(); | 10 super(); | 
| 10 this.element.classList.add('timeline-tree-view'); | 11 this.element.classList.add('timeline-tree-view'); | 
| 11 } | 12 } | 
| 12 | 13 | 
| 13 /** | 14 /** | 
| 14 * @param {!SDK.TracingModel.Event} event | 15 * @param {!SDK.TracingModel.Event} event | 
| 15 * @return {string} | 16 * @return {string} | 
| 16 */ | 17 */ | 
| 17 static eventNameForSorting(event) { | 18 static eventNameForSorting(event) { | 
| 18 if (event.name === TimelineModel.TimelineModel.RecordType.JSFrame) { | 19 if (event.name === TimelineModel.TimelineModel.RecordType.JSFrame) { | 
| 19 var data = event.args['data']; | 20 var data = event.args['data']; | 
| 20 return data['functionName'] + '@' + (data['scriptId'] || data['url'] || '' ); | 21 return `${data['functionName']}@${data['scriptId'] || data['url'] || ''}`; | 
| 
 
caseq
2017/02/03 19:55:25
let's revert this
 
alph
2017/02/03 20:06:01
Done.
 
 | |
| 21 } | 22 } | 
| 22 return event.name + ':@' + TimelineModel.TimelineProfileTree.eventURL(event) ; | 23 return event.name + ':@' + TimelineModel.TimelineProfileTree.eventURL(event) ; | 
| 23 } | 24 } | 
| 24 | 25 | 
| 25 /** | 26 /** | 
| 26 * @protected | 27 * @protected | 
| 27 * @param {!TimelineModel.TimelineModel} model | 28 * @param {!TimelineModel.TimelineModel} model | 
| 28 * @param {!Array<!TimelineModel.TimelineModelFilter>} filters | 29 * @param {!Array<!TimelineModel.TimelineModelFilter>} filters | 
| 29 */ | 30 */ | 
| 30 init(model, filters) { | 31 init(model, filters) { | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 144 } | 145 } | 
| 145 } | 146 } | 
| 146 | 147 | 
| 147 /** | 148 /** | 
| 148 * @protected | 149 * @protected | 
| 149 */ | 150 */ | 
| 150 refreshTree() { | 151 refreshTree() { | 
| 151 this._linkifier.reset(); | 152 this._linkifier.reset(); | 
| 152 this._dataGrid.rootNode().removeChildren(); | 153 this._dataGrid.rootNode().removeChildren(); | 
| 153 var tree = this._buildTree(); | 154 var tree = this._buildTree(); | 
| 154 if (!tree.children) | 155 var children = tree.children(); | 
| 155 return; | |
| 156 var maxSelfTime = 0; | 156 var maxSelfTime = 0; | 
| 157 var maxTotalTime = 0; | 157 var maxTotalTime = 0; | 
| 158 for (var child of tree.children.values()) { | 158 for (var child of children.values()) { | 
| 159 maxSelfTime = Math.max(maxSelfTime, child.selfTime); | 159 maxSelfTime = Math.max(maxSelfTime, child.selfTime); | 
| 160 maxTotalTime = Math.max(maxTotalTime, child.totalTime); | 160 maxTotalTime = Math.max(maxTotalTime, child.totalTime); | 
| 161 } | 161 } | 
| 162 for (var child of tree.children.values()) { | 162 for (var child of children.values()) { | 
| 163 // Exclude the idle time off the total calculation. | 163 // Exclude the idle time off the total calculation. | 
| 164 var gridNode = new Timeline.TimelineTreeView.TreeGridNode(child, tree.tota lTime, maxSelfTime, maxTotalTime, this); | 164 var gridNode = new Timeline.TimelineTreeView.TreeGridNode(child, tree.tota lTime, maxSelfTime, maxTotalTime, this); | 
| 165 this._dataGrid.insertChild(gridNode); | 165 this._dataGrid.insertChild(gridNode); | 
| 166 } | 166 } | 
| 167 this._sortingChanged(); | 167 this._sortingChanged(); | 
| 168 this._updateDetailsForSelection(); | 168 this._updateDetailsForSelection(); | 
| 169 } | 169 } | 
| 170 | 170 | 
| 171 /** | 171 /** | 
| 172 * @return {!TimelineModel.TimelineProfileTree.Node} | 172 * @return {!TimelineModel.TimelineProfileTree.Node} | 
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 308 /** | 308 /** | 
| 309 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode | 309 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode | 
| 310 * @protected | 310 * @protected | 
| 311 * @return {?Timeline.TimelineTreeView.GridNode} | 311 * @return {?Timeline.TimelineTreeView.GridNode} | 
| 312 */ | 312 */ | 
| 313 dataGridNodeForTreeNode(treeNode) { | 313 dataGridNodeForTreeNode(treeNode) { | 
| 314 return treeNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] || n ull; | 314 return treeNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] || n ull; | 
| 315 } | 315 } | 
| 316 }; | 316 }; | 
| 317 | 317 | 
| 318 | |
| 319 /** | 318 /** | 
| 320 * @unrestricted | 319 * @unrestricted | 
| 321 */ | 320 */ | 
| 322 Timeline.TimelineTreeView.GridNode = class extends DataGrid.SortableDataGridNode { | 321 Timeline.TimelineTreeView.GridNode = class extends DataGrid.SortableDataGridNode { | 
| 323 /** | 322 /** | 
| 324 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode | 323 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode | 
| 325 * @param {number} grandTotalTime | 324 * @param {number} grandTotalTime | 
| 326 * @param {number} maxSelfTime | 325 * @param {number} maxSelfTime | 
| 327 * @param {number} maxTotalTime | 326 * @param {number} maxTotalTime | 
| 328 * @param {!Timeline.TimelineTreeView} treeView | 327 * @param {!Timeline.TimelineTreeView} treeView | 
| 329 */ | 328 */ | 
| 330 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView) { | 329 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView) { | 
| 331 super(null, false); | 330 super(null, false); | 
| 332 | |
| 333 this._populated = false; | 331 this._populated = false; | 
| 334 this._profileNode = profileNode; | 332 this._profileNode = profileNode; | 
| 335 this._treeView = treeView; | 333 this._treeView = treeView; | 
| 336 this._grandTotalTime = grandTotalTime; | 334 this._grandTotalTime = grandTotalTime; | 
| 337 this._maxSelfTime = maxSelfTime; | 335 this._maxSelfTime = maxSelfTime; | 
| 338 this._maxTotalTime = maxTotalTime; | 336 this._maxTotalTime = maxTotalTime; | 
| 339 } | 337 } | 
| 340 | 338 | 
| 341 /** | 339 /** | 
| 342 * @override | 340 * @override | 
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 431 Timeline.TimelineTreeView.TreeGridNode = class extends Timeline.TimelineTreeView .GridNode { | 429 Timeline.TimelineTreeView.TreeGridNode = class extends Timeline.TimelineTreeView .GridNode { | 
| 432 /** | 430 /** | 
| 433 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode | 431 * @param {!TimelineModel.TimelineProfileTree.Node} profileNode | 
| 434 * @param {number} grandTotalTime | 432 * @param {number} grandTotalTime | 
| 435 * @param {number} maxSelfTime | 433 * @param {number} maxSelfTime | 
| 436 * @param {number} maxTotalTime | 434 * @param {number} maxTotalTime | 
| 437 * @param {!Timeline.TimelineTreeView} treeView | 435 * @param {!Timeline.TimelineTreeView} treeView | 
| 438 */ | 436 */ | 
| 439 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView) { | 437 constructor(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView) { | 
| 440 super(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView); | 438 super(profileNode, grandTotalTime, maxSelfTime, maxTotalTime, treeView); | 
| 441 this.setHasChildren(this._profileNode.children ? this._profileNode.children. size > 0 : false); | 439 this.setHasChildren(this._profileNode.hasChildren()); | 
| 442 profileNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] = this; | 440 profileNode[Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol] = this; | 
| 443 } | 441 } | 
| 444 | 442 | 
| 445 /** | 443 /** | 
| 446 * @override | 444 * @override | 
| 447 */ | 445 */ | 
| 448 populate() { | 446 populate() { | 
| 449 if (this._populated) | 447 if (this._populated) | 
| 450 return; | 448 return; | 
| 451 this._populated = true; | 449 this._populated = true; | 
| 452 if (!this._profileNode.children) | 450 if (!this._profileNode.children) | 
| 453 return; | 451 return; | 
| 454 for (var node of this._profileNode.children.values()) { | 452 for (var node of this._profileNode.children().values()) { | 
| 455 var gridNode = new Timeline.TimelineTreeView.TreeGridNode( | 453 var gridNode = new Timeline.TimelineTreeView.TreeGridNode( | 
| 456 node, this._grandTotalTime, this._maxSelfTime, this._maxTotalTime, thi s._treeView); | 454 node, this._grandTotalTime, this._maxSelfTime, this._maxTotalTime, thi s._treeView); | 
| 457 this.insertChildOrdered(gridNode); | 455 this.insertChildOrdered(gridNode); | 
| 458 } | 456 } | 
| 459 } | 457 } | 
| 460 }; | 458 }; | 
| 461 | 459 | 
| 462 Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol = Symbol('treeGridNode'); | 460 Timeline.TimelineTreeView.TreeGridNode._gridNodeSymbol = Symbol('treeGridNode'); | 
| 463 | 461 | 
| 464 /** | 462 /** | 
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 503 this._executionContextNamesByOrigin.set(context.origin, context.name); | 501 this._executionContextNamesByOrigin.set(context.origin, context.name); | 
| 504 } | 502 } | 
| 505 } | 503 } | 
| 506 | 504 | 
| 507 /** | 505 /** | 
| 508 * @param {!TimelineModel.TimelineProfileTree.Node} node | 506 * @param {!TimelineModel.TimelineProfileTree.Node} node | 
| 509 * @return {!{name: string, color: string}} | 507 * @return {!{name: string, color: string}} | 
| 510 */ | 508 */ | 
| 511 _displayInfoForGroupNode(node) { | 509 _displayInfoForGroupNode(node) { | 
| 512 var categories = Timeline.TimelineUIUtils.categories(); | 510 var categories = Timeline.TimelineUIUtils.categories(); | 
| 513 var color = node.id ? Timeline.TimelineUIUtils.eventColor(node.event) : cate gories['other'].color; | 511 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr acingModel.Event} */ (node.event)) : | 
| 512 categories['other'].color; | |
| 514 | 513 | 
| 515 switch (this._groupBySetting.get()) { | 514 switch (this._groupBySetting.get()) { | 
| 516 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 515 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 
| 517 var category = categories[node.id] || categories['other']; | 516 var category = categories[node.id] || categories['other']; | 
| 518 return {name: category.title, color: category.color}; | 517 return {name: category.title, color: category.color}; | 
| 519 | 518 | 
| 520 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 519 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 
| 521 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 520 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 
| 522 var name = node.id; | 521 var name = node.id; | 
| 523 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | 522 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | 
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 587 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode | 586 * @param {!TimelineModel.TimelineProfileTree.Node} treeNode | 
| 588 * @return {!Array<!TimelineModel.TimelineProfileTree.Node>} | 587 * @return {!Array<!TimelineModel.TimelineProfileTree.Node>} | 
| 589 */ | 588 */ | 
| 590 _buildHeaviestStack(treeNode) { | 589 _buildHeaviestStack(treeNode) { | 
| 591 console.assert(!!treeNode.parent, 'Attempt to build stack for tree root'); | 590 console.assert(!!treeNode.parent, 'Attempt to build stack for tree root'); | 
| 592 var result = []; | 591 var result = []; | 
| 593 // Do not add root to the stack, as it's the tree itself. | 592 // Do not add root to the stack, as it's the tree itself. | 
| 594 for (var node = treeNode; node && node.parent; node = node.parent) | 593 for (var node = treeNode; node && node.parent; node = node.parent) | 
| 595 result.push(node); | 594 result.push(node); | 
| 596 result = result.reverse(); | 595 result = result.reverse(); | 
| 597 for (node = treeNode; node && node.children && node.children.size;) { | 596 for (node = treeNode; node && node.children() && node.children().size;) { | 
| 598 var children = Array.from(node.children.values()); | 597 var children = Array.from(node.children().values()); | 
| 599 node = children.reduce((a, b) => a.totalTime > b.totalTime ? a : b); | 598 node = children.reduce((a, b) => a.totalTime > b.totalTime ? a : b); | 
| 600 result.push(node); | 599 result.push(node); | 
| 601 } | 600 } | 
| 602 return result; | 601 return result; | 
| 603 } | 602 } | 
| 604 | 603 | 
| 605 /** | 604 /** | 
| 606 * @override | 605 * @override | 
| 607 * @return {boolean} | 606 * @return {boolean} | 
| 608 */ | 607 */ | 
| (...skipping 19 matching lines...) Expand all Loading... | |
| 628 */ | 627 */ | 
| 629 _showDetailsForNode(node) { | 628 _showDetailsForNode(node) { | 
| 630 var stack = this._buildHeaviestStack(node); | 629 var stack = this._buildHeaviestStack(node); | 
| 631 this._stackView.setStack(stack, node); | 630 this._stackView.setStack(stack, node); | 
| 632 this._stackView.show(this._detailsView.element); | 631 this._stackView.show(this._detailsView.element); | 
| 633 return true; | 632 return true; | 
| 634 } | 633 } | 
| 635 | 634 | 
| 636 /** | 635 /** | 
| 637 * @param {!Timeline.AggregatedTimelineTreeView.GroupBy} groupBy | 636 * @param {!Timeline.AggregatedTimelineTreeView.GroupBy} groupBy | 
| 638 * @return {function(!SDK.TracingModel.Event):string} | 637 * @return {function(!SDK.TracingModel.Event):(string|symbol)} | 
| 639 */ | 638 */ | 
| 640 _groupingFunction(groupBy) { | 639 _groupingFunction(groupBy) { | 
| 641 /** | 640 /** | 
| 642 * @param {!SDK.TracingModel.Event} event | 641 * @param {!SDK.TracingModel.Event} event | 
| 643 * @return {string} | 642 * @return {string} | 
| 644 */ | 643 */ | 
| 645 function groupByURL(event) { | 644 function groupByURL(event) { | 
| 646 return TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 645 return TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 
| 647 } | 646 } | 
| 648 | 647 | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 776 constructor(model, filters) { | 775 constructor(model, filters) { | 
| 777 super(model, filters); | 776 super(model, filters); | 
| 778 this._dataGrid.markColumnAsSortedBy('self', DataGrid.DataGrid.Order.Descendi ng); | 777 this._dataGrid.markColumnAsSortedBy('self', DataGrid.DataGrid.Order.Descendi ng); | 
| 779 } | 778 } | 
| 780 | 779 | 
| 781 /** | 780 /** | 
| 782 * @override | 781 * @override | 
| 783 * @return {!TimelineModel.TimelineProfileTree.Node} | 782 * @return {!TimelineModel.TimelineProfileTree.Node} | 
| 784 */ | 783 */ | 
| 785 _buildTree() { | 784 _buildTree() { | 
| 786 var topDown = this.buildTopDownTree(this._groupingFunction(this._groupBySett ing.get())); | 785 var tree = new TimelineModel.TimelineProfileTree( | 
| 787 return TimelineModel.TimelineProfileTree.buildBottomUp(topDown); | 786 this._model.mainThreadEvents(), this._filters, this._startTime, this._en dTime, | 
| 787 this._groupingFunction(this._groupBySetting.get())); | |
| 788 return tree.bottomUpTreeRoot(); | |
| 788 } | 789 } | 
| 789 }; | 790 }; | 
| 790 | 791 | 
| 791 /** | 792 /** | 
| 792 * @unrestricted | 793 * @unrestricted | 
| 793 */ | 794 */ | 
| 794 Timeline.TimelineStackView = class extends UI.VBox { | 795 Timeline.TimelineStackView = class extends UI.VBox { | 
| 795 constructor(treeView) { | 796 constructor(treeView) { | 
| 796 super(); | 797 super(); | 
| 797 var header = this.element.createChild('div', 'timeline-stack-view-header'); | 798 var header = this.element.createChild('div', 'timeline-stack-view-header'); | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 835 | 836 | 
| 836 _onSelectionChanged() { | 837 _onSelectionChanged() { | 
| 837 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); | 838 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); | 
| 838 } | 839 } | 
| 839 }; | 840 }; | 
| 840 | 841 | 
| 841 /** @enum {symbol} */ | 842 /** @enum {symbol} */ | 
| 842 Timeline.TimelineStackView.Events = { | 843 Timeline.TimelineStackView.Events = { | 
| 843 SelectionChanged: Symbol('SelectionChanged') | 844 SelectionChanged: Symbol('SelectionChanged') | 
| 844 }; | 845 }; | 
| OLD | NEW |