55
66import 'vs/css!./media/extensionEditor' ;
77import { localize } from 'vs/nls' ;
8- import { createCancelablePromise } from 'vs/base/common/async' ;
8+ import { CancelablePromise , createCancelablePromise } from 'vs/base/common/async' ;
99import * as arrays from 'vs/base/common/arrays' ;
1010import { OS } from 'vs/base/common/platform' ;
1111import { Event , Emitter } from 'vs/base/common/event' ;
@@ -223,6 +223,7 @@ export class ExtensionEditor extends EditorPane {
223223 this . extensionEditorWidget = this . _register ( new class extends Disposable implements IExtensionEditorWidget {
224224 private gallery : IGalleryExtension | undefined = undefined ;
225225 private extension : IExtension | undefined = undefined ;
226+ private updatePromise : CancelablePromise < void > | undefined ;
226227 constructor ( ) {
227228 super ( ) ;
228229 this . _register ( that . extensionsWorkbenchService . onChange ( e => {
@@ -238,7 +239,8 @@ export class ExtensionEditor extends EditorPane {
238239 this . extension = extension ;
239240 this . gallery = gallery ;
240241 if ( that . template ) {
241- that . updateTemplate ( this . extension , this . gallery , that . template , ! ! preserveFocus ) ;
242+ this . updatePromise ?. cancel ( ) ;
243+ this . updatePromise = createCancelablePromise ( token => that . updateTemplate ( this . extension ! , this . gallery , that . template ! , ! ! preserveFocus , token ) ) ;
242244 }
243245 }
244246 } ( ) ) ;
@@ -408,7 +410,7 @@ export class ExtensionEditor extends EditorPane {
408410 }
409411 }
410412
411- private async updateTemplate ( extension : IExtension , gallery : IGalleryExtension | undefined , template : IExtensionEditorTemplate , preserveFocus : boolean ) : Promise < void > {
413+ private async updateTemplate ( extension : IExtension , gallery : IGalleryExtension | undefined , template : IExtensionEditorTemplate , preserveFocus : boolean , token : CancellationToken ) : Promise < void > {
412414 this . activeElement = null ;
413415 this . editorLoadComplete = false ;
414416
@@ -419,9 +421,9 @@ export class ExtensionEditor extends EditorPane {
419421
420422 this . transientDisposables . clear ( ) ;
421423
422- this . extensionReadme = new Cache ( ( ) => createCancelablePromise ( token => extension . getReadme ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ) ;
423- this . extensionChangelog = new Cache ( ( ) => createCancelablePromise ( token => extension . getChangelog ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ) ;
424- this . extensionManifest = new Cache ( ( ) => createCancelablePromise ( token => extension . getManifest ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ) ;
424+ this . extensionReadme = new Cache ( ( ) => extension . getReadme ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ;
425+ this . extensionChangelog = new Cache ( ( ) => extension . getChangelog ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ;
426+ this . extensionManifest = new Cache ( ( ) => extension . getManifest ( ! ! this . showPreReleaseVersionContextKey ?. get ( ) , token ) ) ;
425427
426428 const remoteBadge = this . instantiationService . createInstance ( RemoteBadgeWidget , template . iconContainer , true ) ;
427429 this . transientDisposables . add ( addDisposableListener ( template . icon , 'error' , ( ) => template . icon . src = extension . iconUrlFallback , { once : true } ) ) ;
@@ -474,6 +476,15 @@ export class ExtensionEditor extends EditorPane {
474476 } ) ) ;
475477 }
476478
479+ const [ colorThemes , fileIconThemes , productIconThemes ] = await Promise . all ( [
480+ this . workbenchThemeService . getColorThemes ( ) ,
481+ this . workbenchThemeService . getFileIconThemes ( ) ,
482+ this . workbenchThemeService . getProductIconThemes ( ) ,
483+ ] ) ;
484+ if ( token . isCancellationRequested ) {
485+ return ;
486+ }
487+
477488 const widgets = [
478489 remoteBadge ,
479490 this . instantiationService . createInstance ( InstallCountWidget , template . installCount , false ) ,
@@ -485,9 +496,9 @@ export class ExtensionEditor extends EditorPane {
485496 reloadAction ,
486497 this . instantiationService . createInstance ( ExtensionStatusLabelAction ) ,
487498 this . instantiationService . createInstance ( UpdateAction ) ,
488- this . instantiationService . createInstance ( SetColorThemeAction , await this . workbenchThemeService . getColorThemes ( ) ) ,
489- this . instantiationService . createInstance ( SetFileIconThemeAction , await this . workbenchThemeService . getFileIconThemes ( ) ) ,
490- this . instantiationService . createInstance ( SetProductIconThemeAction , await this . workbenchThemeService . getProductIconThemes ( ) ) ,
499+ this . instantiationService . createInstance ( SetColorThemeAction , colorThemes ) ,
500+ this . instantiationService . createInstance ( SetFileIconThemeAction , fileIconThemes ) ,
501+ this . instantiationService . createInstance ( SetProductIconThemeAction , productIconThemes ) ,
491502
492503 this . instantiationService . createInstance ( EnableDropDownAction ) ,
493504 this . instantiationService . createInstance ( DisableDropDownAction ) ,
@@ -535,6 +546,10 @@ export class ExtensionEditor extends EditorPane {
535546 }
536547
537548 const manifest = await this . extensionManifest . get ( ) . promise ;
549+ if ( token . isCancellationRequested ) {
550+ return ;
551+ }
552+
538553 if ( manifest ) {
539554 combinedInstallAction . manifest = manifest ;
540555 }
0 commit comments