@@ -266,7 +266,7 @@ export class TimelineTreeView extends
266266 this . dataGrid . addEventListener ( DataGrid . DataGrid . Events . SORTING_CHANGED , this . sortingChanged , this ) ;
267267 this . dataGrid . element . addEventListener ( 'mousemove' , this . onMouseMove . bind ( this ) , true ) ;
268268 this . dataGrid . element . addEventListener (
269- 'mouseleave' , ( ) => this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , null ) ) ;
269+ 'mouseleave' , ( ) => this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , { node : null } ) ) ;
270270 this . dataGrid . addEventListener ( DataGrid . DataGrid . Events . OPENED_NODE , this . onGridNodeOpened , this ) ;
271271 this . dataGrid . setResizeMethod ( DataGrid . DataGrid . ResizeMethod . LAST ) ;
272272 this . dataGrid . setRowContextMenuCallback ( this . onContextMenu . bind ( this ) ) ;
@@ -585,7 +585,11 @@ export class TimelineTreeView extends
585585 }
586586
587587 onHover ( node : Trace . Extras . TraceTree . Node | null ) : void {
588- this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , node ) ;
588+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , { node} ) ;
589+ }
590+
591+ onClick ( node : Trace . Extras . TraceTree . Node | null ) : void {
592+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_CLICKED , { node} ) ;
589593 }
590594
591595 override wasShown ( ) : void {
@@ -603,13 +607,14 @@ export class TimelineTreeView extends
603607 */
604608 #onDataGridSelectionChange( event : Common . EventTarget . EventTargetEvent < DataGrid . DataGrid . DataGridNode < GridNode > > ) :
605609 void {
606- this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_CLICKED , ( event . data as GridNode ) . profileNode ) ;
610+ this . onClick ( ( event . data as GridNode ) . profileNode ) ;
607611 this . onHover ( ( event . data as GridNode ) . profileNode ) ;
608612 }
609613
610614 onGridNodeOpened ( ) : void {
611615 const gridNode = this . dataGrid . selectedNode as TreeGridNode ;
612- this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , gridNode . profileNode ) ;
616+ // Use tree's hover method in case of unique hover experiences (like ThirdPartyTree).
617+ this . onHover ( gridNode . profileNode ) ;
613618 this . updateDetailsForSelection ( ) ;
614619 }
615620
@@ -689,9 +694,9 @@ export namespace TimelineTreeView {
689694 }
690695
691696 export interface EventTypes {
692- [ Events . TREE_ROW_HOVERED ] : Trace . Extras . TraceTree . Node | null ;
697+ [ Events . TREE_ROW_HOVERED ] : { node : Trace . Extras . TraceTree . Node | null , events ?: Trace . Types . Events . Event [ ] } ;
693698 [ Events . BOTTOM_UP_BUTTON_CLICKED ] : Trace . Extras . TraceTree . Node | null ;
694- [ Events . TREE_ROW_CLICKED ] : Trace . Extras . TraceTree . Node | null ;
699+ [ Events . TREE_ROW_CLICKED ] : { node : Trace . Extras . TraceTree . Node | null , events ?: Trace . Types . Events . Event [ ] } ;
695700 }
696701}
697702
@@ -866,7 +871,7 @@ export class GridNode extends DataGrid.SortableDataGrid.SortableDataGridNode<Gri
866871 #bottomUpButtonClicked( ) : void {
867872 // We should also trigger an event to "unhover" the 3P tree row. Since this isn't
868873 // triggered when clicking the bottom up button.
869- this . treeView . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , null ) ;
874+ this . treeView . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , { node : null } ) ;
870875 this . treeView . dispatchEventToListeners ( TimelineTreeView . Events . BOTTOM_UP_BUTTON_CLICKED , this . profileNode ) ;
871876 }
872877}
@@ -1147,6 +1152,37 @@ export class AggregatedTimelineTreeView extends TimelineTreeView {
11471152
11481153 private static readonly extensionInternalPrefix = 'extensions::' ;
11491154 private static readonly v8NativePrefix = 'native ' ;
1155+
1156+ override onHover ( node : Trace . Extras . TraceTree . Node | null ) : void {
1157+ if ( node !== null && this . groupBySetting . get ( ) === AggregatedTimelineTreeView . GroupBy . ThirdParties ) {
1158+ const events = this . #getThirdPartyEventsForNode( node ) ;
1159+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , { node, events} ) ;
1160+ return ;
1161+ }
1162+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_HOVERED , { node} ) ;
1163+ }
1164+
1165+ override onClick ( node : Trace . Extras . TraceTree . Node | null ) : void {
1166+ if ( node !== null && this . groupBySetting . get ( ) === AggregatedTimelineTreeView . GroupBy . ThirdParties ) {
1167+ const events = this . #getThirdPartyEventsForNode( node ) ;
1168+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_CLICKED , { node, events} ) ;
1169+ return ;
1170+ }
1171+ this . dispatchEventToListeners ( TimelineTreeView . Events . TREE_ROW_CLICKED , { node} ) ;
1172+ }
1173+
1174+ #getThirdPartyEventsForNode( node : Trace . Extras . TraceTree . Node ) : Trace . Types . Events . Event [ ] | undefined {
1175+ if ( ! node . event ) {
1176+ return ;
1177+ }
1178+ const entity = this . entityMapper ( ) ?. entityForEvent ( node . event ) ;
1179+ // Should be [unattributed]. Just use the node's events.
1180+ if ( ! entity ) {
1181+ return node . events ;
1182+ }
1183+ const events = this . entityMapper ( ) ?. eventsForEntity ( entity ) ;
1184+ return events ;
1185+ }
11501186}
11511187export namespace AggregatedTimelineTreeView {
11521188 export enum GroupBy {
0 commit comments