| 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 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 } | 665 } |
| 666 | 666 |
| 667 /** | 667 /** |
| 668 * @param {!TimelineModel.TimelineProfileTree.Node} node | 668 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 669 * @return {!{name: string, color: string}} | 669 * @return {!{name: string, color: string}} |
| 670 */ | 670 */ |
| 671 _displayInfoForGroupNode(node) { | 671 _displayInfoForGroupNode(node) { |
| 672 var categories = Timeline.TimelineUIUtils.categories(); | 672 var categories = Timeline.TimelineUIUtils.categories(); |
| 673 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr
acingModel.Event} */ (node.event)) : | 673 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr
acingModel.Event} */ (node.event)) : |
| 674 categories['other'].color; | 674 categories['other'].color; |
| 675 | 675 var unattributed = Common.UIString('[unattributed]'); |
| 676 /** |
| 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 } |
| 676 switch (this._groupBySetting.get()) { | 690 switch (this._groupBySetting.get()) { |
| 677 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 691 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: |
| 678 var category = categories[node.id] || categories['other']; | 692 var category = categories[node.id] || categories['other']; |
| 679 return {name: category.title, color: category.color}; | 693 return {name: category.title, color: category.color}; |
| 680 | 694 |
| 681 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 695 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: |
| 682 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 696 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: |
| 683 var name = node.id; | 697 return {name: beautifyDomainName.call(this, node.id) || unattributed, co
lor: color}; |
| 684 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | |
| 685 name = Common.UIString('[Chrome extensions overhead]'); | |
| 686 else if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(name)) | |
| 687 name = Common.UIString('[V8 Runtime]'); | |
| 688 else if (name.startsWith('chrome-extension')) | |
| 689 name = this._executionContextNamesByOrigin.get(name) || name; | |
| 690 return {name: name || Common.UIString('unattributed'), color: color}; | |
| 691 | 698 |
| 692 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: | 699 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: |
| 693 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS
Frame ? | 700 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS
Frame ? |
| 694 Common.UIString('JavaScript') : | 701 Common.UIString('JavaScript') : |
| 695 Timeline.TimelineUIUtils.eventTitle(node.event); | 702 Timeline.TimelineUIUtils.eventTitle(node.event); |
| 696 return { | 703 return { |
| 697 name: name, | 704 name: name, |
| 698 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr
ame ? | 705 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr
ame ? |
| 699 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : | 706 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : |
| 700 color | 707 color |
| 701 }; | 708 }; |
| 702 | 709 |
| 703 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: | 710 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: |
| 704 var name = node.event ? this._productByEvent(node.event) : ''; | 711 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Even
t} */ (node.event)); |
| 705 return {name: name || Common.UIString('unattributed'), color: Timeline.T
imelineUIUtils.colorForId(name)}; | 712 color = productName ? Timeline.TimelineUIUtils.colorForId(productName) :
'#eee'; |
| 713 var name = productName || this._domainByEvent(true, /** @type {!SDK.Trac
ingModel.Event} */ (node.event)) || ''; |
| 714 return {name: beautifyDomainName.call(this, name) || unattributed, color
: color}; |
| 706 | 715 |
| 707 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: | 716 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: |
| 708 break; | 717 break; |
| 709 | 718 |
| 710 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: | 719 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: |
| 711 var frame = this._model.timelineModel().pageFrameById(node.id); | 720 var frame = this._model.timelineModel().pageFrameById(node.id); |
| 712 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra
me, 80) : Common.UIString('Page'); | 721 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra
me, 80) : Common.UIString('Page'); |
| 713 return {name: frameName, color: color}; | 722 return {name: frameName, color: color}; |
| 714 | 723 |
| 715 default: | 724 default: |
| 716 console.assert(false, 'Unexpected aggregation type'); | 725 console.assert(false, 'Unexpected aggregation type'); |
| 717 } | 726 } |
| 718 return {name: node.id || Common.UIString('unattributed'), color: color}; | 727 return {name: node.id || unattributed, color: color}; |
| 719 } | 728 } |
| 720 | 729 |
| 721 /** | 730 /** |
| 722 * @override | 731 * @override |
| 723 * @param {!UI.Toolbar} toolbar | 732 * @param {!UI.Toolbar} toolbar |
| 724 */ | 733 */ |
| 725 populateToolbar(toolbar) { | 734 populateToolbar(toolbar) { |
| 726 super.populateToolbar(toolbar); | 735 super.populateToolbar(toolbar); |
| 727 var groupBy = Timeline.AggregatedTimelineTreeView.GroupBy; | 736 var groupBy = Timeline.AggregatedTimelineTreeView.GroupBy; |
| 728 var options = [ | 737 var options = [ |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 783 this._stackView.setStack(stack, node); | 792 this._stackView.setStack(stack, node); |
| 784 this._stackView.show(this._detailsView.element); | 793 this._stackView.show(this._detailsView.element); |
| 785 return true; | 794 return true; |
| 786 } | 795 } |
| 787 | 796 |
| 788 /** | 797 /** |
| 789 * @param {!Timeline.AggregatedTimelineTreeView.GroupBy} groupBy | 798 * @param {!Timeline.AggregatedTimelineTreeView.GroupBy} groupBy |
| 790 * @return {?function(!SDK.TracingModel.Event):string} | 799 * @return {?function(!SDK.TracingModel.Event):string} |
| 791 */ | 800 */ |
| 792 _groupingFunction(groupBy) { | 801 _groupingFunction(groupBy) { |
| 793 /** | 802 var GroupBy = Timeline.AggregatedTimelineTreeView.GroupBy; |
| 794 * @param {!SDK.TracingModel.Event} event | |
| 795 * @return {string} | |
| 796 */ | |
| 797 function groupByURL(event) { | |
| 798 return TimelineModel.TimelineProfileTree.eventURL(event) || ''; | |
| 799 } | |
| 800 | |
| 801 /** | |
| 802 * @param {boolean} groupSubdomains | |
| 803 * @param {!SDK.TracingModel.Event} event | |
| 804 * @return {string} | |
| 805 */ | |
| 806 function groupByDomain(groupSubdomains, event) { | |
| 807 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; | |
| 808 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) | |
| 809 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; | |
| 810 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) | |
| 811 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; | |
| 812 var parsedURL = url.asParsedURL(); | |
| 813 if (!parsedURL) | |
| 814 return ''; | |
| 815 if (parsedURL.scheme === 'chrome-extension') | |
| 816 return parsedURL.scheme + '://' + parsedURL.host; | |
| 817 if (!groupSubdomains) | |
| 818 return parsedURL.host; | |
| 819 if (/^[.0-9]+$/.test(parsedURL.host)) | |
| 820 return parsedURL.host; | |
| 821 var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); | |
| 822 return domainMatch && domainMatch[0] || ''; | |
| 823 } | |
| 824 | |
| 825 switch (groupBy) { | 803 switch (groupBy) { |
| 826 case Timeline.AggregatedTimelineTreeView.GroupBy.None: | 804 case GroupBy.None: |
| 827 return null; | 805 return null; |
| 828 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: | 806 case GroupBy.EventName: |
| 829 return event => Timeline.TimelineUIUtils.eventStyle(event).title; | 807 return event => Timeline.TimelineUIUtils.eventStyle(event).title; |
| 830 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 808 case GroupBy.Category: |
| 831 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name
; | 809 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name
; |
| 832 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 810 case GroupBy.Subdomain: |
| 833 return groupByDomain.bind(null, false); | 811 return this._domainByEvent.bind(this, false); |
| 834 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 812 case GroupBy.Domain: |
| 835 return groupByDomain.bind(null, true); | 813 return this._domainByEvent.bind(this, true); |
| 836 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: | 814 case GroupBy.Product: |
| 837 return this._productByEvent.bind(this); | 815 return event => this._productByEvent(event) || this._domainByEvent(true,
event); |
| 838 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: | 816 case GroupBy.URL: |
| 839 return groupByURL; | 817 return event => TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 840 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: | 818 case GroupBy.Frame: |
| 841 return event => TimelineModel.TimelineData.forEvent(event).frameId; | 819 return event => TimelineModel.TimelineData.forEvent(event).frameId; |
| 842 default: | 820 default: |
| 843 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); | 821 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); |
| 844 return null; | 822 return null; |
| 845 } | 823 } |
| 846 } | 824 } |
| 847 | 825 |
| 848 /** | 826 /** |
| 827 * @param {boolean} groupSubdomains |
| 828 * @param {!SDK.TracingModel.Event} event |
| 829 * @return {string} |
| 830 */ |
| 831 _domainByEvent(groupSubdomains, event) { |
| 832 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 833 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) |
| 834 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; |
| 835 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) |
| 836 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; |
| 837 var parsedURL = url.asParsedURL(); |
| 838 if (!parsedURL) |
| 839 return ''; |
| 840 if (parsedURL.scheme === 'chrome-extension') |
| 841 return parsedURL.scheme + '://' + parsedURL.host; |
| 842 if (!groupSubdomains) |
| 843 return parsedURL.host; |
| 844 if (/^[.0-9]+$/.test(parsedURL.host)) |
| 845 return parsedURL.host; |
| 846 var domainMatch = /([^.]*\.)?[^.]*$/.exec(parsedURL.host); |
| 847 return domainMatch && domainMatch[0] || ''; |
| 848 } |
| 849 |
| 850 /** |
| 849 * @param {!SDK.TracingModel.Event} event | 851 * @param {!SDK.TracingModel.Event} event |
| 850 * @return {string} | 852 * @return {string} |
| 851 */ | 853 */ |
| 852 _productByEvent(event) { | 854 _productByEvent(event) { |
| 855 var url = TimelineModel.TimelineProfileTree.eventURL(event); |
| 856 if (!url) |
| 857 return ''; |
| 858 if (this._productByURLCache.has(url)) |
| 859 return this._productByURLCache.get(url); |
| 853 if (!this._productRegistry) | 860 if (!this._productRegistry) |
| 854 return ''; | 861 return ''; |
| 855 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; | |
| 856 var name = this._productByURLCache.get(url); | |
| 857 if (name) | |
| 858 return name; | |
| 859 var parsedURL = url.asParsedURL(); | 862 var parsedURL = url.asParsedURL(); |
| 860 name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; | 863 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; |
| 861 this._productByURLCache.set(url, name); | 864 this._productByURLCache.set(url, name); |
| 862 return name; | 865 return name; |
| 863 } | 866 } |
| 864 | 867 |
| 865 /** | 868 /** |
| 866 * @override | 869 * @override |
| 867 * @param {!UI.ContextMenu} contextMenu | 870 * @param {!UI.ContextMenu} contextMenu |
| 868 * @param {!TimelineModel.TimelineProfileTree.Node} node | 871 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 869 */ | 872 */ |
| 870 _appendContextMenuItems(contextMenu, node) { | 873 _appendContextMenuItems(contextMenu, node) { |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1004 | 1007 |
| 1005 _onSelectionChanged() { | 1008 _onSelectionChanged() { |
| 1006 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha
nged); | 1009 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha
nged); |
| 1007 } | 1010 } |
| 1008 }; | 1011 }; |
| 1009 | 1012 |
| 1010 /** @enum {symbol} */ | 1013 /** @enum {symbol} */ |
| 1011 Timeline.TimelineStackView.Events = { | 1014 Timeline.TimelineStackView.Events = { |
| 1012 SelectionChanged: Symbol('SelectionChanged') | 1015 SelectionChanged: Symbol('SelectionChanged') |
| 1013 }; | 1016 }; |
| OLD | NEW |