This commit is contained in:
Sandeep Somavarapu 2024-06-25 21:52:08 +02:00 committed by GitHub
parent 01ef3f7526
commit 393e1222ca
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 23 additions and 12 deletions

View file

@ -657,10 +657,7 @@ class ExtensionsScanner extends Disposable {
const type = metadata?.isSystem ? ExtensionType.System : input.type;
const isBuiltin = type === ExtensionType.System || !!metadata?.isBuiltin;
manifest = await this.translateManifest(input.location, manifest, ExtensionScannerInput.createNlsConfiguration(input));
if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion?.includes(id.toLowerCase())) {
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
}
const extension: IRelaxedScannedExtension = {
let extension: IRelaxedScannedExtension = {
type,
identifier,
manifest,
@ -672,7 +669,13 @@ class ExtensionsScanner extends Disposable {
isValid: true,
validations: []
};
return input.validate ? this.validate(extension, input) : extension;
if (input.validate) {
extension = this.validate(extension, input);
}
if (manifest.enabledApiProposals && this.extensionsEnabledWithApiProposalVersion.includes(id.toLowerCase())) {
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
}
return extension;
}
} catch (e) {
if (input.type !== ExtensionType.System) {
@ -684,7 +687,8 @@ class ExtensionsScanner extends Disposable {
validate(extension: IRelaxedScannedExtension, input: ExtensionScannerInput): IRelaxedScannedExtension {
let isValid = true;
const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin);
const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(extension.identifier.id.toLowerCase());
const validations = validateExtensionManifest(input.productVersion, input.productDate, input.location, extension.manifest, extension.isBuiltin, validateApiVersion);
for (const [severity, message] of validations) {
if (severity === Severity.Error) {
isValid = false;

View file

@ -240,7 +240,7 @@ export function isValidVersion(_inputVersion: string | INormalizedVersion, _inpu
type ProductDate = string | Date | undefined;
export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean): readonly [Severity, string][] {
export function validateExtensionManifest(productVersion: string, productDate: ProductDate, extensionLocation: URI, extensionManifest: IExtensionManifest, extensionIsBuiltin: boolean, validateApiVersion: boolean): readonly [Severity, string][] {
const validations: [Severity, string][] = [];
if (typeof extensionManifest.publisher !== 'undefined' && typeof extensionManifest.publisher !== 'string') {
validations.push([Severity.Error, nls.localize('extensionDescription.publisher', "property publisher must be of type `string`.")]);
@ -322,7 +322,7 @@ export function validateExtensionManifest(productVersion: string, productDate: P
}
}
if (extensionManifest.enabledApiProposals?.length) {
if (validateApiVersion && extensionManifest.enabledApiProposals?.length) {
const incompatibleNotices: string[] = [];
if (!areApiProposalsCompatible([...extensionManifest.enabledApiProposals], incompatibleNotices)) {
for (const notice of incompatibleNotices) {

View file

@ -3,7 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform } from 'vs/platform/extensions/common/extensions';
import { IBuiltinExtensionsScannerService, ExtensionType, IExtensionIdentifier, IExtension, IExtensionManifest, TargetPlatform, IRelaxedExtensionManifest, parseEnabledApiProposalNames } from 'vs/platform/extensions/common/extensions';
import { IBrowserWorkbenchEnvironmentService } from 'vs/workbench/services/environment/browser/environmentService';
import { IScannedExtension, IWebExtensionsScannerService, ScanOptions } from 'vs/workbench/services/extensionManagement/common/extensionManagement';
import { isWeb, Language } from 'vs/base/common/platform';
@ -99,6 +99,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
private readonly systemExtensionsCacheResource: URI | undefined = undefined;
private readonly customBuiltinExtensionsCacheResource: URI | undefined = undefined;
private readonly resourcesAccessQueueMap = new ResourceMap<Queue<IWebExtension[]>>();
private readonly extensionsEnabledWithApiProposalVersion: string[];
constructor(
@IBrowserWorkbenchEnvironmentService private readonly environmentService: IBrowserWorkbenchEnvironmentService,
@ -123,6 +124,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
// Eventually update caches
lifecycleService.when(LifecyclePhase.Eventually).then(() => this.updateCaches());
}
this.extensionsEnabledWithApiProposalVersion = productService.extensionsEnabledWithApiProposalVersion?.map(id => id.toLowerCase()) ?? [];
}
private _customBuiltinExtensionsInfoPromise: Promise<{ extensions: ExtensionInfo[]; extensionsToMigrate: [string, string][]; extensionLocations: URI[]; extensionGalleryResources: URI[] }> | undefined;
@ -735,7 +737,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
private async toScannedExtension(webExtension: IWebExtension, isBuiltin: boolean, type: ExtensionType = ExtensionType.User): Promise<IScannedExtension> {
const validations: [Severity, string][] = [];
let manifest: IExtensionManifest | undefined = webExtension.manifest;
let manifest: IRelaxedExtensionManifest | undefined = webExtension.manifest;
if (!manifest) {
try {
@ -766,7 +768,8 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
const uuid = (<IGalleryMetadata | undefined>webExtension.metadata)?.id;
validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false));
const validateApiVersion = this.extensionsEnabledWithApiProposalVersion.includes(webExtension.identifier.id.toLowerCase());
validations.push(...validateExtensionManifest(this.productService.version, this.productService.date, webExtension.location, manifest, false, validateApiVersion));
let isValid = true;
for (const [severity, message] of validations) {
if (severity === Severity.Error) {
@ -775,6 +778,10 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
}
}
if (manifest.enabledApiProposals && validateApiVersion) {
manifest.enabledApiProposals = parseEnabledApiProposalNames([...manifest.enabledApiProposals]);
}
return {
identifier: { id: webExtension.identifier.id, uuid: webExtension.identifier.uuid || uuid },
location: webExtension.location,
@ -800,7 +807,7 @@ export class WebExtensionsScannerService extends Disposable implements IWebExten
return [];
}
private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise<IExtensionManifest> {
private async translateManifest(manifest: IExtensionManifest, nlsURL: ITranslations | URI, fallbackNLS?: ITranslations | URI): Promise<IRelaxedExtensionManifest> {
try {
const translations = URI.isUri(nlsURL) ? await this.getTranslations(nlsURL) : nlsURL;
const fallbackTranslations = URI.isUri(fallbackNLS) ? await this.getTranslations(fallbackNLS) : fallbackNLS;