Skip to content

Commit 82b4d9a

Browse files
committed
FIx #122448
1 parent ad59351 commit 82b4d9a

File tree

7 files changed

+368
-145
lines changed

7 files changed

+368
-145
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -2129,6 +2129,11 @@ export class SystemDisabledWarningAction extends ExtensionAction {
21292129
return;
21302130
}
21312131
}
2132+
if (this.extension.enablementState === EnablementState.DisabledByExtensionDependency) {
2133+
this.class = `${SystemDisabledWarningAction.WARNING_CLASS}`;
2134+
this.tooltip = localize('extension disabled because of dependency', "This extension has been disabled because it depends on an extension that is disabled.");
2135+
return;
2136+
}
21322137
if (this.extensionManagementServerService.localExtensionManagementServer && this.extensionManagementServerService.remoteExtensionManagementServer) {
21332138
if (isLanguagePackExtension(this.extension.local.manifest)) {
21342139
if (!this.extensionsWorkbenchService.installed.some(e => areSameExtensions(e.identifier, this.extension!.identifier) && e.server !== this.extension!.server)) {

src/vs/workbench/contrib/extensions/test/electron-browser/extensionsWorkbenchService.test.ts

+24-6
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,11 @@ suite('ExtensionsWorkbenchServiceTest', () => {
101101
}
102102
});
103103

104-
instantiationService.stub(IExtensionManagementServerService, <IExtensionManagementServerService>{
105-
localExtensionManagementServer: {
106-
extensionManagementService: instantiationService.get(IExtensionManagementService)
107-
}
108-
});
104+
instantiationService.stub(IExtensionManagementServerService, anExtensionManagementServerService({
105+
id: 'local',
106+
label: 'local',
107+
extensionManagementService: instantiationService.get(IExtensionManagementService)
108+
}, null, null));
109109

110110
instantiationService.stub(IWorkbenchExtensionEnablementService, new TestExtensionEnablementService(instantiationService));
111111

@@ -121,7 +121,7 @@ suite('ExtensionsWorkbenchServiceTest', () => {
121121
instantiationService.stubPromise(IExtensionManagementService, 'getInstalled', []);
122122
instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage());
123123
instantiationService.stubPromise(INotificationService, 'prompt', 0);
124-
await (<TestExtensionEnablementService>instantiationService.get(IWorkbenchExtensionEnablementService)).reset();
124+
(<TestExtensionEnablementService>instantiationService.get(IWorkbenchExtensionEnablementService)).reset();
125125
});
126126

127127
teardown(() => {
@@ -1449,6 +1449,24 @@ suite('ExtensionsWorkbenchServiceTest', () => {
14491449
});
14501450
}
14511451

1452+
function anExtensionManagementServerService(localExtensionManagementServer: IExtensionManagementServer | null, remoteExtensionManagementServer: IExtensionManagementServer | null, webExtensionManagementServer: IExtensionManagementServer | null): IExtensionManagementServerService {
1453+
return {
1454+
_serviceBrand: undefined,
1455+
localExtensionManagementServer,
1456+
remoteExtensionManagementServer,
1457+
webExtensionManagementServer,
1458+
getExtensionManagementServer: (extension: IExtension) => {
1459+
if (extension.location.scheme === Schemas.file) {
1460+
return localExtensionManagementServer;
1461+
}
1462+
if (extension.location.scheme === Schemas.vscodeRemote) {
1463+
return remoteExtensionManagementServer;
1464+
}
1465+
return webExtensionManagementServer;
1466+
}
1467+
};
1468+
}
1469+
14521470
function aMultiExtensionManagementServerService(instantiationService: TestInstantiationService, localExtensionManagementService?: IExtensionManagementService, remoteExtensionManagementService?: IExtensionManagementService): IExtensionManagementServerService {
14531471
const localExtensionManagementServer: IExtensionManagementServer = {
14541472
id: 'vscode-local',

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

+187-67
Large diffs are not rendered by default.

src/vs/workbench/services/extensionManagement/common/extensionManagement.ts

+19-7
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import { Event } from 'vs/base/common/event';
77
import { createDecorator, refineServiceDecorator } from 'vs/platform/instantiation/common/instantiation';
88
import { IExtension, ExtensionType, IExtensionManifest } from 'vs/platform/extensions/common/extensions';
9-
import { IExtensionManagementService, IGalleryExtension, IExtensionIdentifier, ILocalExtension, InstallOptions } from 'vs/platform/extensionManagement/common/extensionManagement';
9+
import { IExtensionManagementService, IGalleryExtension, IExtensionIdentifier, ILocalExtension, InstallOptions, InstallExtensionEvent, DidInstallExtensionEvent, DidUninstallExtensionEvent } from 'vs/platform/extensionManagement/common/extensionManagement';
1010
import { URI } from 'vs/base/common/uri';
1111

1212
export interface IExtensionManagementServer {
@@ -24,9 +24,20 @@ export interface IExtensionManagementServerService {
2424
getExtensionManagementServer(extension: IExtension): IExtensionManagementServer | null;
2525
}
2626

27+
export type InstallExtensionOnServerEvent = InstallExtensionEvent & { server: IExtensionManagementServer };
28+
export type DidInstallExtensionOnServerEvent = DidInstallExtensionEvent & { server: IExtensionManagementServer };
29+
export type UninstallExtensionOnServerEvent = IExtensionIdentifier & { server: IExtensionManagementServer };
30+
export type DidUninstallExtensionOnServerEvent = DidUninstallExtensionEvent & { server: IExtensionManagementServer };
31+
2732
export const IWorkbenchExtensionManagementService = refineServiceDecorator<IExtensionManagementService, IWorkbenchExtensionManagementService>(IExtensionManagementService);
2833
export interface IWorkbenchExtensionManagementService extends IExtensionManagementService {
2934
readonly _serviceBrand: undefined;
35+
36+
onInstallExtension: Event<InstallExtensionOnServerEvent>;
37+
onDidInstallExtension: Event<DidInstallExtensionOnServerEvent>;
38+
onUninstallExtension: Event<UninstallExtensionOnServerEvent>;
39+
onDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;
40+
3041
installWebExtension(location: URI): Promise<ILocalExtension>;
3142
installExtensions(extensions: IGalleryExtension[], installOptions?: InstallOptions): Promise<ILocalExtension[]>;
3243
updateFromGallery(gallery: IGalleryExtension, extension: ILocalExtension): Promise<ILocalExtension>;
@@ -38,6 +49,7 @@ export const enum EnablementState {
3849
DisabledByExtensionKind,
3950
DisabledByEnvironment,
4051
DisabledByVirtualWorkspace,
52+
DisabledByExtensionDependency,
4153
DisabledGlobally,
4254
DisabledWorkspace,
4355
EnabledGlobally,
@@ -59,6 +71,12 @@ export interface IWorkbenchExtensionEnablementService {
5971
*/
6072
getEnablementState(extension: IExtension): EnablementState;
6173

74+
/**
75+
* Returns the enablement states for the given extensions
76+
* @param extensions list of extensions
77+
*/
78+
getEnablementStates(extensions: IExtension[]): EnablementState[];
79+
6280
/**
6381
* Returns `true` if the enablement can be changed.
6482
*/
@@ -82,12 +100,6 @@ export interface IWorkbenchExtensionEnablementService {
82100
*/
83101
isDisabledGlobally(extension: IExtension): boolean;
84102

85-
/**
86-
* Returns `true` if the given extension identifier is enabled by the user but it it
87-
* disabled due to the fact that the current window/folder/workspace is not trusted.
88-
*/
89-
isDisabledByWorkspaceTrust(extension: IExtension): boolean;
90-
91103
/**
92104
* Enable or disable the given extension.
93105
* if `workspace` is `true` then enablement is done for workspace, otherwise globally.

src/vs/workbench/services/extensionManagement/common/extensionManagementService.ts

+10-10
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
import { Event, EventMultiplexer } from 'vs/base/common/event';
77
import {
8-
ILocalExtension, IGalleryExtension, InstallExtensionEvent, DidInstallExtensionEvent, IExtensionIdentifier, DidUninstallExtensionEvent, IReportedExtension, IGalleryMetadata, IExtensionGalleryService, InstallOptions, UninstallOptions, INSTALL_ERROR_NOT_SUPPORTED, InstallVSIXOptions
8+
ILocalExtension, IGalleryExtension, IExtensionIdentifier, IReportedExtension, IGalleryMetadata, IExtensionGalleryService, InstallOptions, UninstallOptions, INSTALL_ERROR_NOT_SUPPORTED, InstallVSIXOptions
99
} from 'vs/platform/extensionManagement/common/extensionManagement';
10-
import { IExtensionManagementServer, IExtensionManagementServerService, IWorkbenchExtensionManagementService } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
10+
import { DidInstallExtensionOnServerEvent, DidUninstallExtensionOnServerEvent, IExtensionManagementServer, IExtensionManagementServerService, InstallExtensionOnServerEvent, IWorkbenchExtensionManagementService, UninstallExtensionOnServerEvent } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
1111
import { ExtensionType, isLanguagePackExtension, IExtensionManifest } from 'vs/platform/extensions/common/extensions';
1212
import { URI } from 'vs/base/common/uri';
1313
import { Disposable } from 'vs/base/common/lifecycle';
@@ -31,10 +31,10 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
3131

3232
declare readonly _serviceBrand: undefined;
3333

34-
readonly onInstallExtension: Event<InstallExtensionEvent>;
35-
readonly onDidInstallExtension: Event<DidInstallExtensionEvent>;
36-
readonly onUninstallExtension: Event<IExtensionIdentifier>;
37-
readonly onDidUninstallExtension: Event<DidUninstallExtensionEvent>;
34+
readonly onInstallExtension: Event<InstallExtensionOnServerEvent>;
35+
readonly onDidInstallExtension: Event<DidInstallExtensionOnServerEvent>;
36+
readonly onUninstallExtension: Event<UninstallExtensionOnServerEvent>;
37+
readonly onDidUninstallExtension: Event<DidUninstallExtensionOnServerEvent>;
3838

3939
protected readonly servers: IExtensionManagementServer[] = [];
4040

@@ -61,10 +61,10 @@ export class ExtensionManagementService extends Disposable implements IWorkbench
6161
this.servers.push(this.extensionManagementServerService.webExtensionManagementServer);
6262
}
6363

64-
this.onInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<InstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onInstallExtension); return emitter; }, new EventMultiplexer<InstallExtensionEvent>())).event;
65-
this.onDidInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<DidInstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onDidInstallExtension); return emitter; }, new EventMultiplexer<DidInstallExtensionEvent>())).event;
66-
this.onUninstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<IExtensionIdentifier>, server) => { emitter.add(server.extensionManagementService.onUninstallExtension); return emitter; }, new EventMultiplexer<IExtensionIdentifier>())).event;
67-
this.onDidUninstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<DidUninstallExtensionEvent>, server) => { emitter.add(server.extensionManagementService.onDidUninstallExtension); return emitter; }, new EventMultiplexer<DidUninstallExtensionEvent>())).event;
64+
this.onInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<InstallExtensionOnServerEvent>, server) => { emitter.add(Event.map(server.extensionManagementService.onInstallExtension, e => ({ ...e, server }))); return emitter; }, new EventMultiplexer<InstallExtensionOnServerEvent>())).event;
65+
this.onDidInstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<DidInstallExtensionOnServerEvent>, server) => { emitter.add(Event.map(server.extensionManagementService.onDidInstallExtension, e => ({ ...e, server }))); return emitter; }, new EventMultiplexer<DidInstallExtensionOnServerEvent>())).event;
66+
this.onUninstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<UninstallExtensionOnServerEvent>, server) => { emitter.add(Event.map(server.extensionManagementService.onUninstallExtension, e => ({ ...e, server }))); return emitter; }, new EventMultiplexer<UninstallExtensionOnServerEvent>())).event;
67+
this.onDidUninstallExtension = this._register(this.servers.reduce((emitter: EventMultiplexer<DidUninstallExtensionOnServerEvent>, server) => { emitter.add(Event.map(server.extensionManagementService.onDidUninstallExtension, e => ({ ...e, server }))); return emitter; }, new EventMultiplexer<DidUninstallExtensionOnServerEvent>())).event;
6868
}
6969

7070
async getInstalled(type?: ExtensionType): Promise<ILocalExtension[]> {

0 commit comments

Comments
 (0)