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 /** |
| 6 * @unrestricted | 6 * @unrestricted |
| 7 * @implements {UI.Searchable} | 7 * @implements {UI.Searchable} |
| 8 */ | 8 */ |
| 9 Timeline.TimelineTreeView = class extends UI.VBox { | 9 Timeline.TimelineTreeView = class extends UI.VBox { |
| 10 constructor() { | 10 constructor() { |
| (...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 506 if (columnId === 'activity') | 506 if (columnId === 'activity') |
| 507 return this._createNameCell(columnId); | 507 return this._createNameCell(columnId); |
| 508 return this._createValueCell(columnId) || super.createCell(columnId); | 508 return this._createValueCell(columnId) || super.createCell(columnId); |
| 509 } | 509 } |
| 510 | 510 |
| 511 /** | 511 /** |
| 512 * @param {string} columnId | 512 * @param {string} columnId |
| 513 * @return {!Element} | 513 * @return {!Element} |
| 514 */ | 514 */ |
| 515 _createNameCell(columnId) { | 515 _createNameCell(columnId) { |
| 516 const cell = this.createTD(columnId); | 516 var cell = this.createTD(columnId); |
| 517 const container = cell.createChild('div', 'name-container'); | 517 var container = cell.createChild('div', 'name-container'); |
| 518 const icon = container.createChild('div', 'activity-icon'); | 518 var iconContainer = container.createChild('div', 'activity-icon-container'); |
| 519 const name = container.createChild('div', 'activity-name'); | 519 var icon = iconContainer.createChild('div', 'activity-icon'); |
| 520 const event = this._profileNode.event; | 520 var name = container.createChild('div', 'activity-name'); |
| 521 var event = this._profileNode.event; | |
| 521 if (this._profileNode.isGroupNode()) { | 522 if (this._profileNode.isGroupNode()) { |
| 522 const treeView = /** @type {!Timeline.AggregatedTimelineTreeView} */ (this ._treeView); | 523 var treeView = /** @type {!Timeline.AggregatedTimelineTreeView} */ (this._ treeView); |
| 523 const info = treeView._displayInfoForGroupNode(this._profileNode); | 524 var info = treeView._displayInfoForGroupNode(this._profileNode); |
| 524 name.textContent = info.name; | 525 name.textContent = info.name; |
| 525 icon.style.backgroundColor = info.color; | 526 icon.style.backgroundColor = info.color; |
| 527 if (info.icon) | |
| 528 iconContainer.insertBefore(info.icon, icon); | |
| 526 } else if (event) { | 529 } else if (event) { |
| 527 const data = event.args['data']; | 530 var data = event.args['data']; |
| 528 const deoptReason = data && data['deoptReason']; | 531 var deoptReason = data && data['deoptReason']; |
| 529 if (deoptReason) | 532 if (deoptReason) |
| 530 container.createChild('div', 'activity-warning').title = Common.UIString ('Not optimized: %s', deoptReason); | 533 container.createChild('div', 'activity-warning').title = Common.UIString ('Not optimized: %s', deoptReason); |
| 531 | 534 |
| 532 name.textContent = Timeline.TimelineUIUtils.eventTitle(event); | 535 name.textContent = Timeline.TimelineUIUtils.eventTitle(event); |
| 533 const link = this._treeView._linkifyLocation(event); | 536 var link = this._treeView._linkifyLocation(event); |
| 534 if (link) | 537 if (link) |
| 535 container.createChild('div', 'activity-link').appendChild(link); | 538 container.createChild('div', 'activity-link').appendChild(link); |
| 536 icon.style.backgroundColor = Timeline.TimelineUIUtils.eventColor(event); | 539 icon.style.backgroundColor = Timeline.TimelineUIUtils.eventColor(event); |
| 537 } | 540 } |
| 538 return cell; | 541 return cell; |
| 539 } | 542 } |
| 540 | 543 |
| 541 /** | 544 /** |
| 542 * @param {string} columnId | 545 * @param {string} columnId |
| 543 * @return {?Element} | 546 * @return {?Element} |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 */ | 632 */ |
| 630 constructor(filters) { | 633 constructor(filters) { |
| 631 super(); | 634 super(); |
| 632 this._groupBySetting = | 635 this._groupBySetting = |
| 633 Common.settings.createSetting('timelineTreeGroupBy', Timeline.Aggregated TimelineTreeView.GroupBy.None); | 636 Common.settings.createSetting('timelineTreeGroupBy', Timeline.Aggregated TimelineTreeView.GroupBy.None); |
| 634 this._groupBySetting.addChangeListener(this.refreshTree.bind(this)); | 637 this._groupBySetting.addChangeListener(this.refreshTree.bind(this)); |
| 635 this.init(filters); | 638 this.init(filters); |
| 636 this._stackView = new Timeline.TimelineStackView(this); | 639 this._stackView = new Timeline.TimelineStackView(this); |
| 637 this._stackView.addEventListener( | 640 this._stackView.addEventListener( |
| 638 Timeline.TimelineStackView.Events.SelectionChanged, this._onStackViewSel ectionChanged, this); | 641 Timeline.TimelineStackView.Events.SelectionChanged, this._onStackViewSel ectionChanged, this); |
| 642 this._badgePool = new ProductRegistry.BadgePool(false, true); | |
| 639 /** @type {!Map<string, string>} */ | 643 /** @type {!Map<string, string>} */ |
| 640 this._productByURLCache = new Map(); | 644 this._productByURLCache = new Map(); |
| 645 /** @type {!Map<string, string>} */ | |
| 646 this._colorByURLCache = new Map(); | |
| 641 ProductRegistry.instance().then(registry => { | 647 ProductRegistry.instance().then(registry => { |
| 642 this._productRegistry = registry; | 648 this._productRegistry = registry; |
| 643 this.refreshTree(); | 649 this.refreshTree(); |
| 644 }); | 650 }); |
| 645 } | 651 } |
| 646 | 652 |
| 647 /** | 653 /** |
| 648 * @override | 654 * @override |
| 655 */ | |
| 656 willHide() { | |
|
caseq
2017/05/24 01:36:25
Let's do it upon setModel() instead.
alph
2017/05/24 02:00:49
Done.
| |
| 657 this._badgePool.reset(); | |
| 658 } | |
| 659 | |
| 660 /** | |
| 661 * @override | |
| 649 * @param {!Timeline.TimelineSelection} selection | 662 * @param {!Timeline.TimelineSelection} selection |
| 650 */ | 663 */ |
| 651 updateContents(selection) { | 664 updateContents(selection) { |
| 652 this._updateExtensionResolver(); | 665 this._updateExtensionResolver(); |
| 653 super.updateContents(selection); | 666 super.updateContents(selection); |
| 654 var rootNode = this._dataGrid.rootNode(); | 667 var rootNode = this._dataGrid.rootNode(); |
| 655 if (rootNode.children.length) | 668 if (rootNode.children.length) |
| 656 rootNode.children[0].revealAndSelect(); | 669 rootNode.children[0].revealAndSelect(); |
| 657 } | 670 } |
| 658 | 671 |
| 659 _updateExtensionResolver() { | 672 _updateExtensionResolver() { |
| 660 this._executionContextNamesByOrigin = new Map(); | 673 this._executionContextNamesByOrigin = new Map(); |
| 661 for (var runtimeModel of SDK.targetManager.models(SDK.RuntimeModel)) { | 674 for (var runtimeModel of SDK.targetManager.models(SDK.RuntimeModel)) { |
| 662 for (var context of runtimeModel.executionContexts()) | 675 for (var context of runtimeModel.executionContexts()) |
| 663 this._executionContextNamesByOrigin.set(context.origin, context.name); | 676 this._executionContextNamesByOrigin.set(context.origin, context.name); |
| 664 } | 677 } |
| 665 } | 678 } |
| 666 | 679 |
| 667 /** | 680 /** |
| 681 * @param {string} name | |
| 682 * @return {string} | |
| 683 * @this {Timeline.AggregatedTimelineTreeView} | |
| 684 */ | |
| 685 _beautifyDomainName(name) { | |
| 686 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | |
| 687 name = Common.UIString('[Chrome extensions overhead]'); | |
| 688 else if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(name)) | |
| 689 name = Common.UIString('[V8 Runtime]'); | |
| 690 else if (name.startsWith('chrome-extension')) | |
| 691 name = this._executionContextNamesByOrigin.get(name) || name; | |
| 692 return name; | |
| 693 } | |
| 694 | |
| 695 /** | |
| 668 * @param {!TimelineModel.TimelineProfileTree.Node} node | 696 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 669 * @return {!{name: string, color: string}} | 697 * @return {!{name: string, color: string, icon: (!Element|undefined)}} |
| 670 */ | 698 */ |
| 671 _displayInfoForGroupNode(node) { | 699 _displayInfoForGroupNode(node) { |
| 672 var categories = Timeline.TimelineUIUtils.categories(); | 700 var categories = Timeline.TimelineUIUtils.categories(); |
| 673 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr acingModel.Event} */ (node.event)) : | 701 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr acingModel.Event} */ (node.event)) : |
| 674 categories['other'].color; | 702 categories['other'].color; |
| 675 var unattributed = Common.UIString('[unattributed]'); | 703 var unattributed = Common.UIString('[unattributed]'); |
| 676 /** | 704 |
| 677 * @param {string} name | |
| 678 * @return {string} | |
| 679 * @this {Timeline.AggregatedTimelineTreeView} | |
| 680 */ | |
| 681 function beautifyDomainName(name) { | |
| 682 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | |
| 683 name = Common.UIString('[Chrome extensions overhead]'); | |
| 684 else if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(name)) | |
| 685 name = Common.UIString('[V8 Runtime]'); | |
| 686 else if (name.startsWith('chrome-extension')) | |
| 687 name = this._executionContextNamesByOrigin.get(name) || name; | |
| 688 return name; | |
| 689 } | |
| 690 switch (this._groupBySetting.get()) { | 705 switch (this._groupBySetting.get()) { |
| 691 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 706 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: |
| 692 var category = categories[node.id] || categories['other']; | 707 var category = categories[node.id] || categories['other']; |
| 693 return {name: category.title, color: category.color}; | 708 return {name: category.title, color: category.color}; |
| 694 | 709 |
| 695 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 710 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: |
| 696 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 711 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: |
| 697 var domainName = beautifyDomainName.call(this, node.id); | 712 var domainName = this._beautifyDomainName(node.id); |
| 698 if (domainName) { | 713 if (domainName) { |
| 699 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Ev ent} */ (node.event)); | 714 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Ev ent} */ (node.event)); |
| 700 if (productName) | 715 if (productName) |
| 701 domainName += ' \u2014 ' + productName; | 716 domainName += ' \u2014 ' + productName; |
| 702 } | 717 } |
| 703 return {name: domainName || unattributed, color: color}; | 718 return {name: domainName || unattributed, color: color}; |
| 704 | 719 |
| 705 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: | 720 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: |
| 706 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS Frame ? | 721 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS Frame ? |
| 707 Common.UIString('JavaScript') : | 722 Common.UIString('JavaScript') : |
| 708 Timeline.TimelineUIUtils.eventTitle(node.event); | 723 Timeline.TimelineUIUtils.eventTitle(node.event); |
| 709 return { | 724 return { |
| 710 name: name, | 725 name: name, |
| 711 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr ame ? | 726 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr ame ? |
| 712 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : | 727 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : |
| 713 color | 728 color |
| 714 }; | 729 }; |
| 715 | 730 |
| 716 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: | 731 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: |
| 717 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Even t} */ (node.event)); | 732 var event = /** @type {!SDK.TracingModel.Event} */ (node.event); |
| 718 color = productName ? ProductRegistry.BadgePool.colorForEntryName(produc tName) : '#eee'; | 733 var info = this._productAndBadgeByEvent(event); |
| 719 var name = productName || this._domainByEvent(true, /** @type {!SDK.Trac ingModel.Event} */ (node.event)) || ''; | 734 var name = info && info.name || unattributed; |
| 720 return {name: beautifyDomainName.call(this, name) || unattributed, color : color}; | 735 color = Timeline.TimelineUIUtils.eventColorByProduct( |
| 736 this._productRegistry, this._model.timelineModel(), this._colorByURL Cache, event); | |
| 737 return {name: name, color: color, icon: info && info.badge || undefined} ; | |
| 721 | 738 |
| 722 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: | 739 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: |
| 723 break; | 740 break; |
| 724 | 741 |
| 725 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: | 742 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: |
| 726 var frame = this._model.timelineModel().pageFrameById(node.id); | 743 var frame = this._model.timelineModel().pageFrameById(node.id); |
| 727 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra me, 80) : Common.UIString('Page'); | 744 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra me, 80) : Common.UIString('Page'); |
| 728 return {name: frameName, color: color}; | 745 return {name: frameName, color: color}; |
| 729 | 746 |
| 730 default: | 747 default: |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 811 return null; | 828 return null; |
| 812 case GroupBy.EventName: | 829 case GroupBy.EventName: |
| 813 return event => Timeline.TimelineUIUtils.eventStyle(event).title; | 830 return event => Timeline.TimelineUIUtils.eventStyle(event).title; |
| 814 case GroupBy.Category: | 831 case GroupBy.Category: |
| 815 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name ; | 832 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name ; |
| 816 case GroupBy.Subdomain: | 833 case GroupBy.Subdomain: |
| 817 return this._domainByEvent.bind(this, false); | 834 return this._domainByEvent.bind(this, false); |
| 818 case GroupBy.Domain: | 835 case GroupBy.Domain: |
| 819 return this._domainByEvent.bind(this, true); | 836 return this._domainByEvent.bind(this, true); |
| 820 case GroupBy.Product: | 837 case GroupBy.Product: |
| 821 return event => this._productByEvent(event) || this._domainByEvent(true, event); | 838 return event => this._productByEvent(event) || this._domainByEvent(true, event) || ''; |
| 822 case GroupBy.URL: | 839 case GroupBy.URL: |
| 823 return event => TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 840 return event => TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 824 case GroupBy.Frame: | 841 case GroupBy.Frame: |
| 825 return event => TimelineModel.TimelineData.forEvent(event).frameId; | 842 return event => TimelineModel.TimelineData.forEvent(event).frameId; |
| 826 default: | 843 default: |
| 827 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); | 844 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); |
| 828 return null; | 845 return null; |
| 829 } | 846 } |
| 830 } | 847 } |
| 831 | 848 |
| 832 /** | 849 /** |
| 833 * @param {boolean} groupSubdomains | 850 * @param {boolean} groupSubdomains |
| 834 * @param {!SDK.TracingModel.Event} event | 851 * @param {!SDK.TracingModel.Event} event |
| 835 * @return {string} | 852 * @return {string} |
| 836 */ | 853 */ |
| 837 _domainByEvent(groupSubdomains, event) { | 854 _domainByEvent(groupSubdomains, event) { |
| 838 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 855 var url = TimelineModel.TimelineProfileTree.eventURL(event); |
| 856 if (!url) | |
| 857 return ''; | |
| 839 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) | 858 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) |
| 840 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; | 859 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; |
| 841 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) | 860 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) |
| 842 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; | 861 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; |
| 843 var parsedURL = url.asParsedURL(); | 862 var parsedURL = url.asParsedURL(); |
| 844 if (!parsedURL) | 863 if (!parsedURL) |
| 845 return ''; | 864 return ''; |
| 846 if (parsedURL.scheme === 'chrome-extension') | 865 if (parsedURL.scheme === 'chrome-extension') |
| 847 return parsedURL.scheme + '://' + parsedURL.host; | 866 return parsedURL.scheme + '://' + parsedURL.host; |
| 848 if (!groupSubdomains) | 867 if (!groupSubdomains) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 865 return this._productByURLCache.get(url); | 884 return this._productByURLCache.get(url); |
| 866 if (!this._productRegistry) | 885 if (!this._productRegistry) |
| 867 return ''; | 886 return ''; |
| 868 var parsedURL = url.asParsedURL(); | 887 var parsedURL = url.asParsedURL(); |
| 869 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; | 888 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; |
| 870 this._productByURLCache.set(url, name); | 889 this._productByURLCache.set(url, name); |
| 871 return name; | 890 return name; |
| 872 } | 891 } |
| 873 | 892 |
| 874 /** | 893 /** |
| 894 * @param {!SDK.TracingModel.Event} event | |
| 895 * @return {?{name: string, badge: ?Element}} | |
| 896 */ | |
| 897 _productAndBadgeByEvent(event) { | |
| 898 var url = TimelineModel.TimelineProfileTree.eventURL(event); | |
| 899 if (!url || !this._productRegistry) | |
| 900 return null; | |
| 901 var parsedURL = url.asParsedURL(); | |
| 902 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || this. _domainByEvent(true, event) || ''; | |
|
caseq
2017/05/24 01:36:25
if (!name) return null; here. Also, you can drop |
alph
2017/05/24 02:00:49
Done.
| |
| 903 var icon = parsedURL && this._badgePool.badgeForURL(parsedURL); | |
| 904 return name ? {name: this._beautifyDomainName(name), badge: icon} : null; | |
| 905 } | |
| 906 | |
| 907 /** | |
| 875 * @override | 908 * @override |
| 876 * @param {!UI.ContextMenu} contextMenu | 909 * @param {!UI.ContextMenu} contextMenu |
| 877 * @param {!TimelineModel.TimelineProfileTree.Node} node | 910 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 878 */ | 911 */ |
| 879 _appendContextMenuItems(contextMenu, node) { | 912 _appendContextMenuItems(contextMenu, node) { |
| 880 if (this._groupBySetting.get() !== Timeline.AggregatedTimelineTreeView.Group By.Frame) | 913 if (this._groupBySetting.get() !== Timeline.AggregatedTimelineTreeView.Group By.Frame) |
| 881 return; | 914 return; |
| 882 if (!node.isGroupNode()) | 915 if (!node.isGroupNode()) |
| 883 return; | 916 return; |
| 884 var frame = this._model.timelineModel().pageFrameById(node.id); | 917 var frame = this._model.timelineModel().pageFrameById(node.id); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1013 | 1046 |
| 1014 _onSelectionChanged() { | 1047 _onSelectionChanged() { |
| 1015 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); | 1048 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); |
| 1016 } | 1049 } |
| 1017 }; | 1050 }; |
| 1018 | 1051 |
| 1019 /** @enum {symbol} */ | 1052 /** @enum {symbol} */ |
| 1020 Timeline.TimelineStackView.Events = { | 1053 Timeline.TimelineStackView.Events = { |
| 1021 SelectionChanged: Symbol('SelectionChanged') | 1054 SelectionChanged: Symbol('SelectionChanged') |
| 1022 }; | 1055 }; |
| OLD | NEW |