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(); | |
|
pfeldman
2017/05/23 19:19:27
You should reset it once it is no longer needed.
alph
2017/05/24 00:53:44
Done.
| |
| 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 |
| 649 * @param {!Timeline.TimelineSelection} selection | 655 * @param {!Timeline.TimelineSelection} selection |
| 650 */ | 656 */ |
| 651 updateContents(selection) { | 657 updateContents(selection) { |
| 652 this._updateExtensionResolver(); | 658 this._updateExtensionResolver(); |
| 653 super.updateContents(selection); | 659 super.updateContents(selection); |
| 654 var rootNode = this._dataGrid.rootNode(); | 660 var rootNode = this._dataGrid.rootNode(); |
| 655 if (rootNode.children.length) | 661 if (rootNode.children.length) |
| 656 rootNode.children[0].revealAndSelect(); | 662 rootNode.children[0].revealAndSelect(); |
| 657 } | 663 } |
| 658 | 664 |
| 659 _updateExtensionResolver() { | 665 _updateExtensionResolver() { |
| 660 this._executionContextNamesByOrigin = new Map(); | 666 this._executionContextNamesByOrigin = new Map(); |
| 661 for (var runtimeModel of SDK.targetManager.models(SDK.RuntimeModel)) { | 667 for (var runtimeModel of SDK.targetManager.models(SDK.RuntimeModel)) { |
| 662 for (var context of runtimeModel.executionContexts()) | 668 for (var context of runtimeModel.executionContexts()) |
| 663 this._executionContextNamesByOrigin.set(context.origin, context.name); | 669 this._executionContextNamesByOrigin.set(context.origin, context.name); |
| 664 } | 670 } |
| 665 } | 671 } |
| 666 | 672 |
| 667 /** | 673 /** |
| 674 * @param {string} name | |
| 675 * @return {string} | |
| 676 * @this {Timeline.AggregatedTimelineTreeView} | |
| 677 */ | |
| 678 _beautifyDomainName(name) { | |
| 679 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(name)) | |
| 680 name = Common.UIString('[Chrome extensions overhead]'); | |
| 681 else if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(name)) | |
| 682 name = Common.UIString('[V8 Runtime]'); | |
| 683 else if (name.startsWith('chrome-extension')) | |
| 684 name = this._executionContextNamesByOrigin.get(name) || name; | |
| 685 return name; | |
| 686 } | |
| 687 | |
| 688 /** | |
| 668 * @param {!TimelineModel.TimelineProfileTree.Node} node | 689 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 669 * @return {!{name: string, color: string}} | 690 * @return {!{name: string, color: string, icon: (!Element|undefined)}} |
| 670 */ | 691 */ |
| 671 _displayInfoForGroupNode(node) { | 692 _displayInfoForGroupNode(node) { |
| 672 var categories = Timeline.TimelineUIUtils.categories(); | 693 var categories = Timeline.TimelineUIUtils.categories(); |
| 673 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr acingModel.Event} */ (node.event)) : | 694 var color = node.id ? Timeline.TimelineUIUtils.eventColor(/** @type {!SDK.Tr acingModel.Event} */ (node.event)) : |
| 674 categories['other'].color; | 695 categories['other'].color; |
| 675 var unattributed = Common.UIString('[unattributed]'); | 696 var unattributed = Common.UIString('[unattributed]'); |
| 676 /** | 697 |
| 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()) { | 698 switch (this._groupBySetting.get()) { |
| 691 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: | 699 case Timeline.AggregatedTimelineTreeView.GroupBy.Category: |
| 692 var category = categories[node.id] || categories['other']; | 700 var category = categories[node.id] || categories['other']; |
| 693 return {name: category.title, color: category.color}; | 701 return {name: category.title, color: category.color}; |
| 694 | 702 |
| 695 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: | 703 case Timeline.AggregatedTimelineTreeView.GroupBy.Domain: |
| 696 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: | 704 case Timeline.AggregatedTimelineTreeView.GroupBy.Subdomain: |
| 697 var domainName = beautifyDomainName.call(this, node.id); | 705 var domainName = this._beautifyDomainName(node.id); |
| 698 if (domainName) { | 706 if (domainName) { |
| 699 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Ev ent} */ (node.event)); | 707 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Ev ent} */ (node.event)); |
| 700 if (productName) | 708 if (productName) |
| 701 domainName += ' \u2014 ' + productName; | 709 domainName += ' \u2014 ' + productName; |
| 702 } | 710 } |
| 703 return {name: domainName || unattributed, color: color}; | 711 return {name: domainName || unattributed, color: color}; |
| 704 | 712 |
| 705 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: | 713 case Timeline.AggregatedTimelineTreeView.GroupBy.EventName: |
| 706 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS Frame ? | 714 var name = node.event.name === TimelineModel.TimelineModel.RecordType.JS Frame ? |
| 707 Common.UIString('JavaScript') : | 715 Common.UIString('JavaScript') : |
| 708 Timeline.TimelineUIUtils.eventTitle(node.event); | 716 Timeline.TimelineUIUtils.eventTitle(node.event); |
| 709 return { | 717 return { |
| 710 name: name, | 718 name: name, |
| 711 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr ame ? | 719 color: node.event.name === TimelineModel.TimelineModel.RecordType.JSFr ame ? |
| 712 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : | 720 Timeline.TimelineUIUtils.eventStyle(node.event).category.color : |
| 713 color | 721 color |
| 714 }; | 722 }; |
| 715 | 723 |
| 716 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: | 724 case Timeline.AggregatedTimelineTreeView.GroupBy.Product: |
| 717 var productName = this._productByEvent(/** @type {!SDK.TracingModel.Even t} */ (node.event)); | 725 var event = /** @type {!SDK.TracingModel.Event} */ (node.event); |
| 718 color = productName ? ProductRegistry.BadgePool.colorForEntryName(produc tName) : '#eee'; | 726 var info = this._productAndBadgeByEvent(event); |
| 719 var name = productName || this._domainByEvent(true, /** @type {!SDK.Trac ingModel.Event} */ (node.event)) || ''; | 727 var name = info && info.name || unattributed; |
| 720 return {name: beautifyDomainName.call(this, name) || unattributed, color : color}; | 728 color = Timeline.TimelineUIUtils.eventColorByProduct( |
| 729 this._productRegistry, this._model.timelineModel(), this._colorByURL Cache, event); | |
| 730 return {name: name, color: color, icon: info && info.badge || undefined} ; | |
| 721 | 731 |
| 722 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: | 732 case Timeline.AggregatedTimelineTreeView.GroupBy.URL: |
| 723 break; | 733 break; |
| 724 | 734 |
| 725 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: | 735 case Timeline.AggregatedTimelineTreeView.GroupBy.Frame: |
| 726 var frame = this._model.timelineModel().pageFrameById(node.id); | 736 var frame = this._model.timelineModel().pageFrameById(node.id); |
| 727 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra me, 80) : Common.UIString('Page'); | 737 var frameName = frame ? Timeline.TimelineUIUtils.displayNameForFrame(fra me, 80) : Common.UIString('Page'); |
| 728 return {name: frameName, color: color}; | 738 return {name: frameName, color: color}; |
| 729 | 739 |
| 730 default: | 740 default: |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 811 return null; | 821 return null; |
| 812 case GroupBy.EventName: | 822 case GroupBy.EventName: |
| 813 return event => Timeline.TimelineUIUtils.eventStyle(event).title; | 823 return event => Timeline.TimelineUIUtils.eventStyle(event).title; |
| 814 case GroupBy.Category: | 824 case GroupBy.Category: |
| 815 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name ; | 825 return event => Timeline.TimelineUIUtils.eventStyle(event).category.name ; |
| 816 case GroupBy.Subdomain: | 826 case GroupBy.Subdomain: |
| 817 return this._domainByEvent.bind(this, false); | 827 return this._domainByEvent.bind(this, false); |
| 818 case GroupBy.Domain: | 828 case GroupBy.Domain: |
| 819 return this._domainByEvent.bind(this, true); | 829 return this._domainByEvent.bind(this, true); |
| 820 case GroupBy.Product: | 830 case GroupBy.Product: |
| 821 return event => this._productByEvent(event) || this._domainByEvent(true, event); | 831 return event => this._productByEvent(event) || this._domainByEvent(true, event) || ''; |
| 822 case GroupBy.URL: | 832 case GroupBy.URL: |
| 823 return event => TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 833 return event => TimelineModel.TimelineProfileTree.eventURL(event) || ''; |
| 824 case GroupBy.Frame: | 834 case GroupBy.Frame: |
| 825 return event => TimelineModel.TimelineData.forEvent(event).frameId; | 835 return event => TimelineModel.TimelineData.forEvent(event).frameId; |
| 826 default: | 836 default: |
| 827 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); | 837 console.assert(false, `Unexpected aggregation setting: ${groupBy}`); |
| 828 return null; | 838 return null; |
| 829 } | 839 } |
| 830 } | 840 } |
| 831 | 841 |
| 832 /** | 842 /** |
| 833 * @param {boolean} groupSubdomains | 843 * @param {boolean} groupSubdomains |
| 834 * @param {!SDK.TracingModel.Event} event | 844 * @param {!SDK.TracingModel.Event} event |
| 835 * @return {string} | 845 * @return {string} |
| 836 */ | 846 */ |
| 837 _domainByEvent(groupSubdomains, event) { | 847 _domainByEvent(groupSubdomains, event) { |
| 838 var url = TimelineModel.TimelineProfileTree.eventURL(event) || ''; | 848 var url = TimelineModel.TimelineProfileTree.eventURL(event); |
| 849 if (!url) | |
| 850 return ''; | |
| 839 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) | 851 if (Timeline.AggregatedTimelineTreeView._isExtensionInternalURL(url)) |
| 840 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; | 852 return Timeline.AggregatedTimelineTreeView._extensionInternalPrefix; |
| 841 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) | 853 if (Timeline.AggregatedTimelineTreeView._isV8NativeURL(url)) |
| 842 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; | 854 return Timeline.AggregatedTimelineTreeView._v8NativePrefix; |
| 843 var parsedURL = url.asParsedURL(); | 855 var parsedURL = url.asParsedURL(); |
| 844 if (!parsedURL) | 856 if (!parsedURL) |
| 845 return ''; | 857 return ''; |
| 846 if (parsedURL.scheme === 'chrome-extension') | 858 if (parsedURL.scheme === 'chrome-extension') |
| 847 return parsedURL.scheme + '://' + parsedURL.host; | 859 return parsedURL.scheme + '://' + parsedURL.host; |
| 848 if (!groupSubdomains) | 860 if (!groupSubdomains) |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 865 return this._productByURLCache.get(url); | 877 return this._productByURLCache.get(url); |
| 866 if (!this._productRegistry) | 878 if (!this._productRegistry) |
| 867 return ''; | 879 return ''; |
| 868 var parsedURL = url.asParsedURL(); | 880 var parsedURL = url.asParsedURL(); |
| 869 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; | 881 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || ''; |
| 870 this._productByURLCache.set(url, name); | 882 this._productByURLCache.set(url, name); |
| 871 return name; | 883 return name; |
| 872 } | 884 } |
| 873 | 885 |
| 874 /** | 886 /** |
| 887 * @param {!SDK.TracingModel.Event} event | |
| 888 * @return {?{name: string, badge: ?Element}} | |
| 889 */ | |
| 890 _productAndBadgeByEvent(event) { | |
| 891 var url = TimelineModel.TimelineProfileTree.eventURL(event); | |
| 892 if (!url || !this._productRegistry) | |
| 893 return null; | |
| 894 var parsedURL = url.asParsedURL(); | |
| 895 var name = parsedURL && this._productRegistry.nameForUrl(parsedURL) || this. _domainByEvent(true, event) || ''; | |
| 896 var icon = parsedURL && this._badgePool.badgeForURL(parsedURL, false, true); | |
| 897 return name ? {name: this._beautifyDomainName(name), badge: icon} : null; | |
|
pfeldman
2017/05/23 19:19:28
Why do you need name?
alph
2017/05/24 00:53:44
We show the name in the tree next to the badge or
| |
| 898 } | |
| 899 | |
| 900 /** | |
| 875 * @override | 901 * @override |
| 876 * @param {!UI.ContextMenu} contextMenu | 902 * @param {!UI.ContextMenu} contextMenu |
| 877 * @param {!TimelineModel.TimelineProfileTree.Node} node | 903 * @param {!TimelineModel.TimelineProfileTree.Node} node |
| 878 */ | 904 */ |
| 879 _appendContextMenuItems(contextMenu, node) { | 905 _appendContextMenuItems(contextMenu, node) { |
| 880 if (this._groupBySetting.get() !== Timeline.AggregatedTimelineTreeView.Group By.Frame) | 906 if (this._groupBySetting.get() !== Timeline.AggregatedTimelineTreeView.Group By.Frame) |
| 881 return; | 907 return; |
| 882 if (!node.isGroupNode()) | 908 if (!node.isGroupNode()) |
| 883 return; | 909 return; |
| 884 var frame = this._model.timelineModel().pageFrameById(node.id); | 910 var frame = this._model.timelineModel().pageFrameById(node.id); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1013 | 1039 |
| 1014 _onSelectionChanged() { | 1040 _onSelectionChanged() { |
| 1015 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); | 1041 this.dispatchEventToListeners(Timeline.TimelineStackView.Events.SelectionCha nged); |
| 1016 } | 1042 } |
| 1017 }; | 1043 }; |
| 1018 | 1044 |
| 1019 /** @enum {symbol} */ | 1045 /** @enum {symbol} */ |
| 1020 Timeline.TimelineStackView.Events = { | 1046 Timeline.TimelineStackView.Events = { |
| 1021 SelectionChanged: Symbol('SelectionChanged') | 1047 SelectionChanged: Symbol('SelectionChanged') |
| 1022 }; | 1048 }; |
| OLD | NEW |