@@ -235,6 +235,10 @@ export const TimelineFollowActiveEditorContext = new RawContextKey<boolean>('tim
235
235
export const TimelineExcludeSources = new RawContextKey < string > ( 'timelineExcludeSources' , '[]' , true ) ;
236
236
export const TimelineViewFocusedContext = new RawContextKey < boolean > ( 'timelineFocused' , true ) ;
237
237
238
+ interface IPendingRequest extends IDisposable {
239
+ readonly request : TimelineRequest ;
240
+ }
241
+
238
242
export class TimelinePane extends ViewPane {
239
243
static readonly TITLE : ILocalizedString = localize2 ( 'timeline' , "Timeline" ) ;
240
244
@@ -250,7 +254,7 @@ export class TimelinePane extends ViewPane {
250
254
private timelineExcludeSourcesContext : IContextKey < string > ;
251
255
252
256
private excludedSources : Set < string > ;
253
- private pendingRequests = new Map < string , TimelineRequest > ( ) ;
257
+ private pendingRequests = new Map < string , IPendingRequest > ( ) ;
254
258
private timelinesBySource = new Map < string , TimelineAggregate > ( ) ;
255
259
256
260
private uri : URI | undefined ;
@@ -495,8 +499,9 @@ export class TimelinePane extends ViewPane {
495
499
this . timelinesBySource . clear ( ) ;
496
500
497
501
if ( cancelPending ) {
498
- for ( const { tokenSource } of this . pendingRequests . values ( ) ) {
499
- tokenSource . dispose ( true ) ;
502
+ for ( const pendingRequest of this . pendingRequests . values ( ) ) {
503
+ pendingRequest . request . tokenSource . cancel ( ) ;
504
+ pendingRequest . dispose ( ) ;
500
505
}
501
506
502
507
this . pendingRequests . clear ( ) ;
@@ -588,34 +593,38 @@ export class TimelinePane extends ViewPane {
588
593
options = { cursor : reset ? undefined : timeline ?. cursor , limit : this . pageSize } ;
589
594
}
590
595
591
- let request = this . pendingRequests . get ( source ) ;
592
- if ( request !== undefined ) {
593
- options . cursor = request . options . cursor ;
596
+ const pendingRequest = this . pendingRequests . get ( source ) ;
597
+ if ( pendingRequest !== undefined ) {
598
+ options . cursor = pendingRequest . request . options . cursor ;
594
599
595
600
// TODO@eamodio deal with concurrent requests better
596
601
if ( typeof options . limit === 'number' ) {
597
- if ( typeof request . options . limit === 'number' ) {
598
- options . limit += request . options . limit ;
602
+ if ( typeof pendingRequest . request . options . limit === 'number' ) {
603
+ options . limit += pendingRequest . request . options . limit ;
599
604
} else {
600
- options . limit = request . options . limit ;
605
+ options . limit = pendingRequest . request . options . limit ;
601
606
}
602
607
}
603
608
}
604
- request ?. tokenSource . dispose ( true ) ;
609
+ pendingRequest ?. request ?. tokenSource . cancel ( ) ;
610
+ pendingRequest ?. dispose ( ) ;
611
+
605
612
options . cacheResults = true ;
606
613
options . resetCache = reset ;
607
- request = this . timelineService . getTimeline (
608
- source , uri , options , new CancellationTokenSource ( )
609
- ) ;
614
+ const tokenSource = new CancellationTokenSource ( ) ;
615
+ const newRequest = this . timelineService . getTimeline ( source , uri , options , tokenSource ) ;
610
616
611
- if ( request === undefined ) {
617
+ if ( newRequest === undefined ) {
618
+ tokenSource . dispose ( ) ;
612
619
return false ;
613
620
}
614
621
615
- this . pendingRequests . set ( source , request ) ;
616
- request . tokenSource . token . onCancellationRequested ( ( ) => this . pendingRequests . delete ( source ) ) ;
622
+ const disposables = new DisposableStore ( ) ;
623
+ this . pendingRequests . set ( source , { request : newRequest , dispose : ( ) => disposables . dispose ( ) } ) ;
624
+ disposables . add ( tokenSource ) ;
625
+ disposables . add ( tokenSource . token . onCancellationRequested ( ( ) => this . pendingRequests . delete ( source ) ) ) ;
617
626
618
- this . handleRequest ( request ) ;
627
+ this . handleRequest ( newRequest ) ;
619
628
620
629
return true ;
621
630
}
@@ -641,6 +650,7 @@ export class TimelinePane extends ViewPane {
641
650
response = await this . progressService . withProgress ( { location : this . id } , ( ) => request . result ) ;
642
651
}
643
652
finally {
653
+ this . pendingRequests . get ( request . source ) ?. dispose ( ) ;
644
654
this . pendingRequests . delete ( request . source ) ;
645
655
}
646
656
@@ -920,11 +930,11 @@ export class TimelinePane extends ViewPane {
920
930
container . appendChild ( this . $tree ) ;
921
931
922
932
this . treeRenderer = this . instantiationService . createInstance ( TimelineTreeRenderer , this . commands ) ;
923
- this . treeRenderer . onDidScrollToEnd ( item => {
933
+ this . _register ( this . treeRenderer . onDidScrollToEnd ( item => {
924
934
if ( this . pageOnScroll ) {
925
935
this . loadMore ( item ) ;
926
936
}
927
- } ) ;
937
+ } ) ) ;
928
938
929
939
this . tree = this . instantiationService . createInstance ( WorkbenchObjectTree < TreeElement , FuzzyScore > , 'TimelinePane' ,
930
940
this . $tree , new TimelineListVirtualDelegate ( ) , [ this . treeRenderer ] , {
0 commit comments