diff --git a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts index c378b1c8bde..3687285e230 100644 --- a/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts +++ b/src/vs/code/electron-browser/sharedProcess/sharedProcessMain.ts @@ -98,7 +98,8 @@ import { FileUserDataProvider } from 'vs/platform/userData/common/fileUserDataPr import { DiskFileSystemProviderClient, LOCAL_FILE_SYSTEM_CHANNEL_NAME } from 'vs/platform/files/common/diskFileSystemProviderClient'; import { InspectProfilingService as V8InspectProfilingService } from 'vs/platform/profiling/node/profilingService'; import { IV8InspectProfilingService } from 'vs/platform/profiling/common/profiling'; -import { NativeExtensionsScannerService, INativeExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { ExtensionsScannerService } from 'vs/platform/extensionManagement/node/extensionsScannerService'; class SharedProcessMain extends Disposable { @@ -294,7 +295,7 @@ class SharedProcessMain extends Disposable { services.set(ICustomEndpointTelemetryService, customEndpointTelemetryService); // Extension Management - services.set(INativeExtensionsScannerService, new SyncDescriptor(NativeExtensionsScannerService)); + services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService)); services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); // Extension Gallery diff --git a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts index e6cc2f4aa42..3db83fd9409 100644 --- a/src/vs/platform/extensionManagement/common/extensionsScannerService.ts +++ b/src/vs/platform/extensionManagement/common/extensionsScannerService.ts @@ -18,13 +18,12 @@ import Severity from 'vs/base/common/severity'; import { isArray, isObject, isString } from 'vs/base/common/types'; import { URI } from 'vs/base/common/uri'; import { localize } from 'vs/nls'; -import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { IEnvironmentService, INativeEnvironmentService } from 'vs/platform/environment/common/environment'; import { Metadata } from 'vs/platform/extensionManagement/common/extensionManagement'; import { computeTargetPlatform, ExtensionKey, getExtensionId, getGalleryExtensionId } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; import { ExtensionType, ExtensionIdentifier, IExtensionManifest, TargetPlatform, IExtensionIdentifier, IRelaxedExtensionManifest, UNDEFINED_PUBLISHER, IExtensionDescription } from 'vs/platform/extensions/common/extensions'; import { validateExtensionManifest } from 'vs/platform/extensions/common/extensionValidator'; import { FileOperationResult, IFileService, toFileOperationResult } from 'vs/platform/files/common/files'; -import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; import { ILogService } from 'vs/platform/log/common/log'; import { IProductService } from 'vs/platform/product/common/productService'; @@ -107,8 +106,8 @@ export type ScanOptions = { readonly checkControlFile?: boolean; }; -export const INativeExtensionsScannerService = createDecorator('INativeExtensionsScannerService'); -export interface INativeExtensionsScannerService { +export const IExtensionsScannerService = createDecorator('IExtensionsScannerService'); +export interface IExtensionsScannerService { readonly _serviceBrand: undefined; readonly systemExtensionsLocation: URI; @@ -126,22 +125,21 @@ export interface INativeExtensionsScannerService { updateMetadata(extensionLocation: URI, metadata: Partial): Promise; } -export class NativeExtensionsScannerService extends Disposable implements INativeExtensionsScannerService { +export abstract class AbstractExtensionsScannerService extends Disposable implements IExtensionsScannerService { readonly _serviceBrand: undefined; - readonly systemExtensionsLocation: URI; - readonly userExtensionsLocation: URI; + abstract readonly systemExtensionsLocation: URI; + abstract readonly userExtensionsLocation: URI; + protected abstract readonly extensionsControlLocation: URI; constructor( @IFileService private readonly fileService: IFileService, @ILogService private readonly logService: ILogService, - @INativeEnvironmentService private readonly environmentService: INativeEnvironmentService, + @INativeEnvironmentService private readonly environmentService: IEnvironmentService, @IProductService private readonly productService: IProductService, ) { super(); - this.systemExtensionsLocation = URI.file(environmentService.builtinExtensionsPath); - this.userExtensionsLocation = URI.file(environmentService.extensionsPath); } private _targetPlatformPromise: Promise | undefined; @@ -310,7 +308,7 @@ export class NativeExtensionsScannerService extends Disposable implements INativ private async getBuiltInExtensionControl(): Promise { try { - const content = await this.fileService.readFile(joinPath(this.environmentService.userHome, '.vscode-oss-dev', 'extensions', 'control.json')); + const content = await this.fileService.readFile(this.extensionsControlLocation); return JSON.parse(content.value.toString()); } catch (error) { return {}; @@ -658,5 +656,3 @@ export function toExtensionDescription(extension: IScannedExtension, isUnderDeve ...extension.manifest, }; } - -registerSingleton(INativeExtensionsScannerService, NativeExtensionsScannerService); diff --git a/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/src/vs/platform/extensionManagement/node/extensionsScanner.ts index c47171faf08..b725a35ad7b 100644 --- a/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -20,7 +20,7 @@ import { extract, ExtractError } from 'vs/base/node/zip'; import { localize } from 'vs/nls'; import { ExtensionManagementError, ExtensionManagementErrorCode, Metadata, ILocalExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { ExtensionKey, groupByExtension } from 'vs/platform/extensionManagement/common/extensionManagementUtil'; -import { INativeExtensionsScannerService, IScannedExtension, ScanOptions } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService, IScannedExtension, ScanOptions } from 'vs/platform/extensionManagement/common/extensionsScannerService'; import { ExtensionType, IExtensionIdentifier } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { ILogService } from 'vs/platform/log/common/log'; @@ -33,7 +33,7 @@ export class ExtensionsScanner extends Disposable { constructor( private readonly beforeRemovingExtension: (e: ILocalExtension) => Promise, @IFileService private readonly fileService: IFileService, - @INativeExtensionsScannerService private readonly extensionsScannerService: INativeExtensionsScannerService, + @IExtensionsScannerService private readonly extensionsScannerService: IExtensionsScannerService, @ILogService private readonly logService: ILogService, ) { super(); diff --git a/src/vs/platform/extensionManagement/node/extensionsScannerService.ts b/src/vs/platform/extensionManagement/node/extensionsScannerService.ts new file mode 100644 index 00000000000..20ff1608038 --- /dev/null +++ b/src/vs/platform/extensionManagement/node/extensionsScannerService.ts @@ -0,0 +1,35 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { joinPath } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { AbstractExtensionsScannerService, IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IFileService } from 'vs/platform/files/common/files'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IProductService } from 'vs/platform/product/common/productService'; + +export class ExtensionsScannerService extends AbstractExtensionsScannerService implements IExtensionsScannerService { + + readonly systemExtensionsLocation: URI; + readonly userExtensionsLocation: URI; + protected readonly extensionsControlLocation: URI; + + constructor( + @IFileService fileService: IFileService, + @ILogService logService: ILogService, + @INativeEnvironmentService environmentService: INativeEnvironmentService, + @IProductService productService: IProductService, + ) { + super(fileService, logService, environmentService, productService); + this.systemExtensionsLocation = URI.file(environmentService.builtinExtensionsPath); + this.userExtensionsLocation = URI.file(environmentService.extensionsPath); + this.extensionsControlLocation = joinPath(environmentService.userHome, '.vscode-oss-dev', 'extensions', 'control.json'); + } + +} + +registerSingleton(IExtensionsScannerService, ExtensionsScannerService); diff --git a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts index 60b80de354d..938adcbd388 100644 --- a/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts +++ b/src/vs/platform/extensionManagement/test/node/extensionsScannerService.test.ts @@ -9,7 +9,8 @@ import { DisposableStore } from 'vs/base/common/lifecycle'; import { dirname, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; -import { INativeExtensionsScannerService, IScannedExtensionManifest, NativeExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService, IScannedExtensionManifest } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { ExtensionsScannerService } from 'vs/platform/extensionManagement/node/extensionsScannerService'; import { ExtensionType, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions'; import { IFileService } from 'vs/platform/files/common/files'; import { FileService } from 'vs/platform/files/common/fileService'; @@ -46,7 +47,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan system extension', async () => { const manifest: Partial = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' }); const extensionLocation = await aSystemExtension(manifest); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanSystemExtensions({}); @@ -65,7 +66,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan user extension', async () => { const manifest: Partial = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' }); const extensionLocation = await aUserExtension(manifest); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -84,7 +85,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan existing extension', async () => { const manifest: Partial = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' }); const extensionLocation = await aUserExtension(manifest); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanExistingExtension(extensionLocation, ExtensionType.User, {}); @@ -103,7 +104,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan single extension', async () => { const manifest: Partial = anExtensionManifest({ 'name': 'name', 'publisher': 'pub' }); const extensionLocation = await aUserExtension(manifest); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanOneOrMultipleExtensions(extensionLocation, ExtensionType.User, {}); @@ -122,7 +123,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan multiple extensions', async () => { const extensionLocation = await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' })); await aUserExtension(anExtensionManifest({ 'name': 'name2', 'publisher': 'pub' })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanOneOrMultipleExtensions(dirname(extensionLocation), ExtensionType.User, {}); @@ -134,7 +135,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan user extension with different versions', async () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.1' })); await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.2' })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -146,7 +147,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan user extension include all versions', async () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.1' })); await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.2' })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({ includeAllVersions: true }); @@ -160,7 +161,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan user extension with different versions and higher version is not compatible', async () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.1' })); await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.2', engines: { vscode: '^1.67.0' } })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -172,7 +173,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan exclude invalid extensions', async () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' })); await aUserExtension(anExtensionManifest({ 'name': 'name2', 'publisher': 'pub', engines: { vscode: '^1.67.0' } })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -184,7 +185,7 @@ suite('NativeExtensionsScanerService Test', () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' })); await aUserExtension(anExtensionManifest({ 'name': 'name2', 'publisher': 'pub' })); await instantiationService.get(IFileService).writeFile(joinPath(URI.file(instantiationService.get(INativeEnvironmentService).extensionsPath), '.obsolete'), VSBuffer.fromString(JSON.stringify({ 'pub.name2-1.0.0': true }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -196,7 +197,7 @@ suite('NativeExtensionsScanerService Test', () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' })); await aUserExtension(anExtensionManifest({ 'name': 'name2', 'publisher': 'pub' })); await instantiationService.get(IFileService).writeFile(joinPath(URI.file(instantiationService.get(INativeEnvironmentService).extensionsPath), '.obsolete'), VSBuffer.fromString(JSON.stringify({ 'pub.name2-1.0.0': true }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({ includeUninstalled: true }); @@ -208,7 +209,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan include invalid extensions', async () => { await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' })); await aUserExtension(anExtensionManifest({ 'name': 'name2', 'publisher': 'pub', engines: { vscode: '^1.67.0' } })); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({ includeInvalid: true }); @@ -229,7 +230,7 @@ suite('NativeExtensionsScanerService Test', () => { const extensionLocation = await anExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub' }), joinPath(ROOT, 'additional')); await aSystemExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', version: '1.0.1' })); await instantiationService.get(IFileService).writeFile(joinPath(instantiationService.get(INativeEnvironmentService).userHome, '.vscode-oss-dev', 'extensions', 'control.json'), VSBuffer.fromString(JSON.stringify({ 'pub.name2': 'disabled', 'pub.name': extensionLocation.fsPath }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanSystemExtensions({ checkControlFile: true }); @@ -241,7 +242,7 @@ suite('NativeExtensionsScanerService Test', () => { test('scan extension with default nls replacements', async () => { const extensionLocation = await aUserExtension(anExtensionManifest({ 'name': 'name', 'publisher': 'pub', displayName: '%displayName%' })); await instantiationService.get(IFileService).writeFile(joinPath(extensionLocation, 'package.nls.json'), VSBuffer.fromString(JSON.stringify({ displayName: 'Hello World' }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({}); @@ -255,7 +256,7 @@ suite('NativeExtensionsScanerService Test', () => { await instantiationService.get(IFileService).writeFile(joinPath(extensionLocation, 'package.nls.json'), VSBuffer.fromString(JSON.stringify({ displayName: 'Hello World' }))); const nlsLocation = joinPath(extensionLocation, 'package.en.json'); await instantiationService.get(IFileService).writeFile(nlsLocation, VSBuffer.fromString(JSON.stringify({ contents: { package: { displayName: 'Hello World EN' } } }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({ nlsConfiguration: { locale: 'en', devMode: false, pseudo: false, translations: { 'pub.name': nlsLocation.fsPath } } }); @@ -269,7 +270,7 @@ suite('NativeExtensionsScanerService Test', () => { await instantiationService.get(IFileService).writeFile(joinPath(extensionLocation, 'package.nls.json'), VSBuffer.fromString(JSON.stringify({ displayName: 'Hello World' }))); const nlsLocation = joinPath(extensionLocation, 'package.en.json'); await instantiationService.get(IFileService).writeFile(nlsLocation, VSBuffer.fromString(JSON.stringify({ contents: { package: { displayName: 'Hello World EN' } } }))); - const testObject: INativeExtensionsScannerService = instantiationService.createInstance(NativeExtensionsScannerService); + const testObject: IExtensionsScannerService = instantiationService.createInstance(ExtensionsScannerService); const actual = await testObject.scanUserExtensions({ nlsConfiguration: { locale: 'en', devMode: false, pseudo: false, translations: { 'pub.name2': nlsLocation.fsPath } } }); diff --git a/src/vs/server/node/remoteAgentEnvironmentImpl.ts b/src/vs/server/node/remoteAgentEnvironmentImpl.ts index 28dda15bd92..5defb12624a 100644 --- a/src/vs/server/node/remoteAgentEnvironmentImpl.ts +++ b/src/vs/server/node/remoteAgentEnvironmentImpl.ts @@ -28,7 +28,7 @@ import { cwd } from 'vs/base/common/process'; import * as pfs from 'vs/base/node/pfs'; import { ServerConnectionToken, ServerConnectionTokenType } from 'vs/server/node/serverConnectionToken'; import { IExtensionHostStatusService } from 'vs/server/node/extensionHostStatusService'; -import { INativeExtensionsScannerService, NlsConfiguration, toExtensionDescription, Translations } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService, NlsConfiguration, toExtensionDescription, Translations } from 'vs/platform/extensionManagement/common/extensionsScannerService'; export class RemoteAgentEnvironmentChannel implements IServerChannel { @@ -42,7 +42,7 @@ export class RemoteAgentEnvironmentChannel implements IServerChannel { extensionManagementCLIService: IExtensionManagementCLIService, private readonly _logService: ILogService, private readonly _extensionHostStatusService: IExtensionHostStatusService, - private readonly _extensionsScannerService: INativeExtensionsScannerService, + private readonly _extensionsScannerService: IExtensionsScannerService, ) { if (_environmentService.args['install-builtin-extension']) { const installOptions: InstallOptions = { isMachineScoped: !!_environmentService.args['do-not-sync'], installPreReleaseVersion: !!_environmentService.args['pre-release'] }; diff --git a/src/vs/server/node/serverServices.ts b/src/vs/server/node/serverServices.ts index cf8abddae85..919924f53ad 100644 --- a/src/vs/server/node/serverServices.ts +++ b/src/vs/server/node/serverServices.ts @@ -68,7 +68,8 @@ import { REMOTE_TERMINAL_CHANNEL_NAME } from 'vs/workbench/contrib/terminal/comm import { RemoteExtensionLogFileName } from 'vs/workbench/services/remote/common/remoteAgentService'; import { REMOTE_FILE_SYSTEM_CHANNEL_NAME } from 'vs/workbench/services/remote/common/remoteFileSystemProviderClient'; import { ExtensionHostStatusService, IExtensionHostStatusService } from 'vs/server/node/extensionHostStatusService'; -import { NativeExtensionsScannerService, INativeExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { ExtensionsScannerService } from 'vs/platform/extensionManagement/node/extensionsScannerService'; const eventPrefix = 'monacoworkbench'; @@ -153,7 +154,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken const downloadChannel = socketServer.getChannel('download', router); services.set(IDownloadService, new DownloadServiceChannelClient(downloadChannel, () => getUriTransformer('renderer') /* TODO: @Sandy @Joao need dynamic context based router */)); - services.set(INativeExtensionsScannerService, new SyncDescriptor(NativeExtensionsScannerService)); + services.set(IExtensionsScannerService, new SyncDescriptor(ExtensionsScannerService)); services.set(IExtensionManagementService, new SyncDescriptor(ExtensionManagementService)); const instantiationService: IInstantiationService = new InstantiationService(services); @@ -178,7 +179,7 @@ export async function setupServerServices(connectionToken: ServerConnectionToken instantiationService.invokeFunction(accessor => { const extensionManagementService = accessor.get(IExtensionManagementService); - const extensionsScannerService = accessor.get(INativeExtensionsScannerService); + const extensionsScannerService = accessor.get(IExtensionsScannerService); const remoteExtensionEnvironmentChannel = new RemoteAgentEnvironmentChannel(connectionToken, environmentService, extensionManagementCLIService, logService, extensionHostStatusService, extensionsScannerService); socketServer.registerChannel('remoteextensionsenvironment', remoteExtensionEnvironmentChannel); diff --git a/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionsScannerService.ts b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionsScannerService.ts new file mode 100644 index 00000000000..5fa1a022246 --- /dev/null +++ b/src/vs/workbench/services/extensionManagement/electron-sandbox/extensionsScannerService.ts @@ -0,0 +1,36 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the MIT License. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { joinPath } from 'vs/base/common/resources'; +import { URI } from 'vs/base/common/uri'; +import { INativeEnvironmentService } from 'vs/platform/environment/common/environment'; +import { AbstractExtensionsScannerService, IExtensionsScannerService } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IFileService } from 'vs/platform/files/common/files'; +import { registerSingleton } from 'vs/platform/instantiation/common/extensions'; +import { ILogService } from 'vs/platform/log/common/log'; +import { IProductService } from 'vs/platform/product/common/productService'; +import { INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; + +export class ExtensionsScannerService extends AbstractExtensionsScannerService implements IExtensionsScannerService { + + readonly systemExtensionsLocation: URI; + readonly userExtensionsLocation: URI; + protected readonly extensionsControlLocation: URI; + + constructor( + @IFileService fileService: IFileService, + @ILogService logService: ILogService, + @INativeEnvironmentService environmentService: INativeWorkbenchEnvironmentService, + @IProductService productService: IProductService, + ) { + super(fileService, logService, environmentService, productService); + this.systemExtensionsLocation = URI.file(environmentService.builtinExtensionsPath); + this.userExtensionsLocation = URI.file(environmentService.extensionsPath); + this.extensionsControlLocation = joinPath(environmentService.userHome, '.vscode-oss-dev', 'extensions', 'control.json'); + } + +} + +registerSingleton(IExtensionsScannerService, ExtensionsScannerService); diff --git a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts index 47403cf5f56..6357aee8c51 100644 --- a/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts +++ b/src/vs/workbench/services/extensions/electron-sandbox/cachedExtensionScanner.ts @@ -17,7 +17,7 @@ import { IHostService } from 'vs/workbench/services/host/browser/host'; import { dedupExtensions } from 'vs/workbench/services/extensions/common/extensionsUtil'; import { IFileService } from 'vs/platform/files/common/files'; import { VSBuffer } from 'vs/base/common/buffer'; -import { INativeExtensionsScannerService, IScannedExtension, NlsConfiguration, toExtensionDescription, Translations } from 'vs/platform/extensionManagement/common/extensionsScannerService'; +import { IExtensionsScannerService, IScannedExtension, NlsConfiguration, toExtensionDescription, Translations } from 'vs/platform/extensionManagement/common/extensionsScannerService'; import { ILogService } from 'vs/platform/log/common/log'; interface IExtensionCacheData { @@ -81,7 +81,7 @@ export class CachedExtensionScanner { @IHostService private readonly _hostService: IHostService, @IProductService private readonly _productService: IProductService, @IFileService private readonly _fileService: IFileService, - @INativeExtensionsScannerService private readonly _extensionsScannerService: INativeExtensionsScannerService, + @IExtensionsScannerService private readonly _extensionsScannerService: IExtensionsScannerService, @ILogService private readonly _logService: ILogService, ) { this.scannedExtensions = new Promise((resolve, reject) => { diff --git a/src/vs/workbench/workbench.common.main.ts b/src/vs/workbench/workbench.common.main.ts index deec2104b46..dfc2bcadef0 100644 --- a/src/vs/workbench/workbench.common.main.ts +++ b/src/vs/workbench/workbench.common.main.ts @@ -76,7 +76,6 @@ import 'vs/workbench/services/commands/common/commandService'; import 'vs/workbench/services/themes/browser/workbenchThemeService'; import 'vs/workbench/services/label/common/labelService'; import 'vs/workbench/services/extensions/common/extensionManifestPropertiesService'; -import 'vs/platform/extensionManagement/common/extensionsScannerService'; import 'vs/workbench/services/extensionManagement/browser/webExtensionsScannerService'; import 'vs/workbench/services/extensionManagement/browser/extensionEnablementService'; import 'vs/workbench/services/extensionManagement/browser/builtinExtensionsScannerService'; diff --git a/src/vs/workbench/workbench.sandbox.main.ts b/src/vs/workbench/workbench.sandbox.main.ts index 2150dd3f14b..148a706dfdb 100644 --- a/src/vs/workbench/workbench.sandbox.main.ts +++ b/src/vs/workbench/workbench.sandbox.main.ts @@ -61,6 +61,7 @@ import 'vs/workbench/services/encryption/electron-sandbox/encryptionService'; import 'vs/workbench/services/localizations/electron-sandbox/localizationsService'; import 'vs/workbench/services/telemetry/electron-sandbox/telemetryService'; import 'vs/workbench/services/extensions/electron-sandbox/extensionHostStarter'; +import 'vs/workbench/services/extensionManagement/electron-sandbox/extensionsScannerService'; import 'vs/workbench/services/extensionManagement/electron-sandbox/extensionManagementServerService'; import 'vs/workbench/services/extensionManagement/electron-sandbox/extensionTipsService'; import 'vs/workbench/services/userDataSync/electron-sandbox/userDataSyncMachinesService';