Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(122)

Side by Side Diff: third_party/WebKit/Source/devtools/front_end/timeline/TimelineTreeView.js

Issue 2892333002: DevTools: Render third-party badges in timeline tree view (Closed)
Patch Set: . Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
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 };
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698