Skip to content

Commit ade80ca

Browse files
authored
refresh extension view on profile change (microsoft#153302)
* refresh extension view on profile change * fix tests
1 parent e3da634 commit ade80ca

File tree

4 files changed

+32
-2
lines changed

4 files changed

+32
-2
lines changed

src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
473473
this.searchBuiltInExtensionsContextKey = SearchBuiltInExtensionsContext.bindTo(contextKeyService);
474474
this.recommendedExtensionsContextKey = RecommendedExtensionsContext.bindTo(contextKeyService);
475475
this._register(this.paneCompositeService.onDidPaneCompositeOpen(e => { if (e.viewContainerLocation === ViewContainerLocation.Sidebar) { this.onViewletOpen(e.composite); } }, this));
476+
this._register(extensionsWorkbenchService.onReset(() => this.refresh()));
476477
this.searchViewletState = this.getMemento(StorageScope.WORKSPACE, StorageTarget.USER);
477478
}
478479

src/vs/workbench/contrib/extensions/browser/extensionsWorkbenchService.ts

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -416,8 +416,11 @@ class Extensions extends Disposable {
416416
extension.deprecationInfo = extensionsControlManifest.deprecated ? extensionsControlManifest.deprecated[extension.identifier.id.toLowerCase()] : undefined;
417417
}
418418

419-
private readonly _onChange: Emitter<{ extension: Extension; operation?: InstallOperation } | undefined> = this._register(new Emitter<{ extension: Extension; operation?: InstallOperation } | undefined>());
420-
get onChange(): Event<{ extension: Extension; operation?: InstallOperation } | undefined> { return this._onChange.event; }
419+
private readonly _onChange = this._register(new Emitter<{ extension: Extension; operation?: InstallOperation } | undefined>());
420+
get onChange() { return this._onChange.event; }
421+
422+
private readonly _onReset = this._register(new Emitter<void>());
423+
get onReset() { return this._onReset.event; }
421424

422425
private installing: Extension[] = [];
423426
private uninstalling: Extension[] = [];
@@ -435,6 +438,7 @@ class Extensions extends Disposable {
435438
this._register(server.extensionManagementService.onDidInstallExtensions(e => this.onDidInstallExtensions(e)));
436439
this._register(server.extensionManagementService.onUninstallExtension(e => this.onUninstallExtension(e.identifier)));
437440
this._register(server.extensionManagementService.onDidUninstallExtension(e => this.onDidUninstallExtension(e)));
441+
this._register(server.extensionManagementService.onDidChangeProfileExtensions(e => this.onDidChangeProfileExtensions(e.added, e.removed)));
438442
this._register(extensionEnablementService.onEnablementChanged(e => this.onEnablementChanged(e)));
439443
}
440444

@@ -554,6 +558,23 @@ class Extensions extends Disposable {
554558
}
555559
}
556560

561+
private async onDidChangeProfileExtensions(added: ILocalExtension[], removed: ILocalExtension[]): Promise<void> {
562+
const extensionsControlManifest = await this.server.extensionManagementService.getExtensionsControlManifest();
563+
for (const addedExtension of added) {
564+
if (this.installed.find(e => areSameExtensions(e.identifier, addedExtension.identifier))) {
565+
const extension = this.instantiationService.createInstance(Extension, this.stateProvider, this.server, addedExtension, undefined);
566+
this.installed.push(extension);
567+
Extensions.updateExtensionFromControlManifest(extension, extensionsControlManifest);
568+
}
569+
}
570+
571+
if (removed.length) {
572+
this.installed = this.installed.filter(e => !removed.some(removedExtension => areSameExtensions(e.identifier, removedExtension.identifier)));
573+
}
574+
575+
this._onReset.fire();
576+
}
577+
557578
private async onDidInstallExtensions(results: readonly InstallExtensionResult[]): Promise<void> {
558579
for (const event of results) {
559580
const { local, source } = event;
@@ -660,6 +681,9 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
660681
private readonly _onChange: Emitter<IExtension | undefined> = new Emitter<IExtension | undefined>();
661682
get onChange(): Event<IExtension | undefined> { return this._onChange.event; }
662683

684+
private readonly _onReset = new Emitter<void>();
685+
get onReset() { return this._onReset.event; }
686+
663687
readonly preferPreReleases = this.productService.quality !== 'stable';
664688

665689
private installing: IExtension[] = [];
@@ -696,14 +720,17 @@ export class ExtensionsWorkbenchService extends Disposable implements IExtension
696720
if (extensionManagementServerService.localExtensionManagementServer) {
697721
this.localExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.localExtensionManagementServer, ext => this.getExtensionState(ext)));
698722
this._register(this.localExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined)));
723+
this._register(this.localExtensions.onReset(e => { this._onChange.fire(undefined); this._onReset.fire(); }));
699724
}
700725
if (extensionManagementServerService.remoteExtensionManagementServer) {
701726
this.remoteExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.remoteExtensionManagementServer, ext => this.getExtensionState(ext)));
702727
this._register(this.remoteExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined)));
728+
this._register(this.remoteExtensions.onReset(e => { this._onChange.fire(undefined); this._onReset.fire(); }));
703729
}
704730
if (extensionManagementServerService.webExtensionManagementServer) {
705731
this.webExtensions = this._register(instantiationService.createInstance(Extensions, extensionManagementServerService.webExtensionManagementServer, ext => this.getExtensionState(ext)));
706732
this._register(this.webExtensions.onChange(e => this._onChange.fire(e ? e.extension : undefined)));
733+
this._register(this.webExtensions.onReset(e => { this._onChange.fire(undefined); this._onReset.fire(); }));
707734
}
708735

709736
this.updatesCheckDelayer = new ThrottledDelayer<void>(ExtensionsWorkbenchService.UpdatesCheckInterval);

src/vs/workbench/contrib/extensions/common/extensions.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ export const IExtensionsWorkbenchService = createDecorator<IExtensionsWorkbenchS
9191
export interface IExtensionsWorkbenchService {
9292
readonly _serviceBrand: undefined;
9393
readonly onChange: Event<IExtension | undefined>;
94+
readonly onReset: Event<void>;
9495
readonly preferPreReleases: boolean;
9596
readonly local: IExtension[];
9697
readonly installed: IExtension[];

src/vs/workbench/services/extensionManagement/test/browser/extensionEnablementService.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ export class TestExtensionEnablementService extends ExtensionEnablementService {
6464
onDidInstallExtensions: new Emitter<readonly InstallExtensionResult[]>().event,
6565
onUninstallExtension: new Emitter<UninstallExtensionEvent>().event,
6666
onDidUninstallExtension: new Emitter<DidUninstallExtensionEvent>().event,
67+
onDidChangeProfileExtensions: new Emitter<DidChangeProfileExtensionsEvent>().event,
6768
},
6869
}, null, null));
6970
const extensionManagementService = instantiationService.createInstance(ExtensionManagementService);

0 commit comments

Comments
 (0)