@@ -47,9 +47,25 @@ type DispatchProps = {
4747
4848type Props = ConnectedProps < { } , StateProps , DispatchProps > ;
4949
50+ type State = {
51+ // The scroll position of the FilterNavigatorBar, shared among
52+ // the call tree, the frame graph, and the stack chart.
53+ readonly filterScrollPos : number ;
54+ } ;
55+
5056const SMALL_SCREEN_WIDTH = 768 ;
5157
52- class ProfileViewerImpl extends PureComponent < Props > {
58+ class ProfileViewerImpl extends PureComponent < Props , State > {
59+ override state = {
60+ filterScrollPos : 0 ,
61+ } ;
62+
63+ _setFilterScrollPos = ( pos : number ) => {
64+ this . setState ( {
65+ filterScrollPos : pos ,
66+ } ) ;
67+ } ;
68+
5369 _onSelectTab = ( selectedTab : string ) => {
5470 const { changeSelectedTab } = this . props ;
5571 const tabSlug = toValidTabSlug ( selectedTab ) ;
@@ -75,6 +91,7 @@ class ProfileViewerImpl extends PureComponent<Props> {
7591
7692 override render ( ) {
7793 const { visibleTabs, selectedTab, isSidebarOpen } = this . props ;
94+ const { filterScrollPos } = this . state ;
7895 const hasSidebar = selectSidebar ( selectedTab ) !== null ;
7996 return (
8097 < div className = "Details" >
@@ -121,9 +138,24 @@ class ProfileViewerImpl extends PureComponent<Props> {
121138 >
122139 {
123140 {
124- calltree : < ProfileCallTreeView /> ,
125- 'flame-graph' : < FlameGraph /> ,
126- 'stack-chart' : < StackChart /> ,
141+ calltree : (
142+ < ProfileCallTreeView
143+ filterScrollPos = { filterScrollPos }
144+ setFilterScrollPos = { this . _setFilterScrollPos }
145+ />
146+ ) ,
147+ 'flame-graph' : (
148+ < FlameGraph
149+ filterScrollPos = { filterScrollPos }
150+ setFilterScrollPos = { this . _setFilterScrollPos }
151+ />
152+ ) ,
153+ 'stack-chart' : (
154+ < StackChart
155+ filterScrollPos = { filterScrollPos }
156+ setFilterScrollPos = { this . _setFilterScrollPos }
157+ />
158+ ) ,
127159 'marker-chart' : < MarkerChart /> ,
128160 'marker-table' : < MarkerTable /> ,
129161 'network-chart' : < NetworkChart /> ,
0 commit comments