diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index df2c7b25e93f5ff1ba3c6b429427e034479d68e3..d5b93c042117baed182f77d9038a147be7b1af60 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -29,6 +29,7 @@ export interface IGalleryVersion { readmeUrl: string; downloadUrl: string; iconUrl: string; + licenseUrl: string; downloadHeaders: { [key: string]: string; }; } diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index c23444a192df72f2df75bd64c567ad128fb8d207..d5c8e5e90120bec9eccdd1bcffa3ada7ddf081e8 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -68,7 +68,8 @@ const AssetType = { Icon: 'Microsoft.VisualStudio.Services.Icons.Default', Details: 'Microsoft.VisualStudio.Services.Content.Details', Manifest: 'Microsoft.VisualStudio.Code.Manifest', - VSIX: 'Microsoft.VisualStudio.Services.VSIXPackage' + VSIX: 'Microsoft.VisualStudio.Services.VSIXPackage', + License: 'Microsoft.VisualStudio.Services.Content.License' }; interface ICriterium { @@ -152,21 +153,22 @@ function getStatistic(statistics: IRawGalleryExtensionStatistics[], name: string return result ? result.value : 0; } +function getAssetSource(files: IRawGalleryExtensionFile[], type: string): string { + const result = files.filter(f => f.assetType === type)[0]; + return result && result.source; +} + function toExtension(galleryExtension: IRawGalleryExtension, extensionsGalleryUrl: string, downloadHeaders: any): IGalleryExtension { - const versions = galleryExtension.versions.map(v => { - const iconFile = v.files.filter(f => f.assetType === AssetType.Icon)[0]; - const iconUrl = iconFile ? iconFile.source : require.toUrl('./media/defaultIcon.png'); - - return { - version: v.version, - date: v.lastUpdated, - downloadHeaders, - downloadUrl: `${ v.assetUri }/${ AssetType.VSIX }?install=true`, - manifestUrl: `${ v.assetUri }/${ AssetType.Manifest }`, - readmeUrl: `${ v.assetUri }/${ AssetType.Details }`, - iconUrl - }; - }); + const versions = galleryExtension.versions.map(v => ({ + version: v.version, + date: v.lastUpdated, + downloadHeaders, + downloadUrl: `${ v.assetUri }/${ AssetType.VSIX }?install=true`, + manifestUrl: `${ v.assetUri }/${ AssetType.Manifest }`, + readmeUrl: `${ v.assetUri }/${ AssetType.Details }`, + iconUrl: getAssetSource(v.files, AssetType.Icon) || require.toUrl('./media/defaultIcon.png'), + licenseUrl: getAssetSource(v.files, AssetType.License) + })); return { id: galleryExtension.extensionId, @@ -222,7 +224,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withFlags(Flags.IncludeVersions, Flags.IncludeCategoryAndTags, Flags.IncludeAssetUri, Flags.IncludeStatistics, Flags.IncludeFiles) .withPage(1, pageSize) .withFilter(FilterType.Target, 'Microsoft.VisualStudio.Code') - .withAssetTypes(AssetType.Icon); + .withAssetTypes(AssetType.Icon, AssetType.License); if (text) { query = query.withFilter(FilterType.SearchText, text).withSortBy(SortBy.NoneOrRelevance); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index d6fe2af2d096f4ad658b91c3bf8912936893ce9c..5e5ff68ceccc9783b3d9a9401a21e2ee7d5db1db 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -109,6 +109,7 @@ export class ExtensionEditor extends BaseEditor { this.license = append(subtitle, $('a.license')); this.license.href = '#'; this.license.textContent = localize('license', 'License'); + this.license.style.display = 'none'; this.description = append(details, $('.description')); @@ -131,16 +132,22 @@ export class ExtensionEditor extends BaseEditor { if (product.extensionsGallery) { const extensionUrl = `${ product.extensionsGallery.itemUrl }?itemName=${ extension.publisher }.${ extension.name }`; - const licenseUrl = `${ product.extensionsGallery.itemUrl }/${ extension.publisher }.${ extension.name }/license`; this.name.onclick = finalHandler(() => shell.openExternal(extensionUrl)); - this.license.onclick = finalHandler(() => shell.openExternal(licenseUrl)); this.rating.onclick = finalHandler(() => shell.openExternal(`${ extensionUrl }#review-details`)); this.publisher.onclick = finalHandler(() => { this.viewletService.openViewlet(VIEWLET_ID, true) .then(viewlet => viewlet as IExtensionsViewlet) .done(viewlet => viewlet.search(`publisher:"${ extension.publisherDisplayName }"`, true)); }); + + if (extension.licenseUrl) { + this.license.onclick = finalHandler(() => shell.openExternal(extension.licenseUrl)); + this.license.style.display = 'initial'; + } else { + this.license.onclick = null; + this.license.style.display = 'none'; + } } const install = this.instantiationService.createInstance(InstallWidget, this.installCount, { extension }); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index 098c63012916f67bf220ce6beb334fc69ff9c5d6..25c7d7281dfc59d1c6400e3bc5e0703e4c468fc0 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -34,6 +34,7 @@ export interface IExtension { description: string; readmeUrl: string; iconUrl: string; + licenseUrl: string; installCount: number; rating: number; ratingCount: number; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index f4f450a990e8765a2fd3773298f52ffc83e5e431..32e32d6aa333cc387d2f02ce6be75afcd6e1ec61 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -98,6 +98,14 @@ class Extension implements IExtension { return require.toUrl('./media/defaultIcon.png'); } + get licenseUrl(): string { + if (this.gallery) { + return this.gallery.versions[0].licenseUrl; + } + + return null; + } + get state(): ExtensionState { return this.stateProvider(this); }