diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index fea9dd07dca..3163de80013 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -10,6 +10,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import Event from 'vs/base/common/event'; import { IPager } from 'vs/base/common/paging'; import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import { IRequestContext } from 'vs/base/node/request'; export interface IExtensionManifest { name: string; @@ -99,6 +100,7 @@ export interface IExtensionGalleryService { isEnabled(): boolean; query(options?: IQueryOptions): TPromise>; download(extension: IGalleryExtension): TPromise; + getAsset(url: string): TPromise; } export type InstallExtensionEvent = { id: string; gallery?: IGalleryExtension; }; diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index f53eeaca413..812a300558a 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -13,7 +13,7 @@ import { assign, getOrDefault } from 'vs/base/common/objects'; import { IRequestService } from 'vs/platform/request/common/request'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IPager } from 'vs/base/common/paging'; -import { download, asJson } from 'vs/base/node/request'; +import { IRequestOptions, IRequestContext, download, asJson } from 'vs/base/node/request'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import pkg from 'vs/platform/package'; import product from 'vs/platform/product'; @@ -340,13 +340,21 @@ export class ExtensionGalleryService implements IExtensionGalleryService { const zipPath = path.join(tmpdir(), extension.id); return this.getCommonHeaders() - .then(headers => this.requestService.request({ url, headers })) + .then(headers => this._getAsset({ url, headers })) .then(context => download(zipPath, context)) .then(() => zipPath); }); }); } + getAsset(url: string): TPromise { + return this._getAsset({ url }); + } + + private _getAsset(options: IRequestOptions): TPromise { + return this.requestService.request(options); + } + private getLastValidExtensionVersion(extension: IRawGalleryExtension, versions: IRawGalleryExtensionVersion[]): TPromise { if (!versions.length) { return TPromise.wrapError(new Error(localize('noCompatible', "Couldn't find a compatible version of {0} with this version of Code.", extension.displayName || extension.extensionName))); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index c05768571a4..395aeb43e14 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -18,8 +18,6 @@ import { IViewlet } from 'vs/workbench/common/viewlet'; import { IViewletService } from 'vs/workbench/services/viewlet/common/viewletService'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { asText } from 'vs/base/node/request'; -import { IRequestService } from 'vs/platform/request/common/request'; import { IExtensionGalleryService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IThemeService } from 'vs/workbench/services/themes/common/themeService'; import { ExtensionsInput } from './extensionsInput'; @@ -71,7 +69,6 @@ export class ExtensionEditor extends BaseEditor { @IExtensionGalleryService private galleryService: IExtensionGalleryService, @IConfigurationService private configurationService: IConfigurationService, @IInstantiationService private instantiationService: IInstantiationService, - @IRequestService private requestService: IRequestService, @IViewletService private viewletService: IViewletService, @IExtensionsWorkbenchService private extensionsWorkbenchService: IExtensionsWorkbenchService, @IThemeService private themeService: IThemeService, @@ -176,8 +173,7 @@ export class ExtensionEditor extends BaseEditor { if (extension.readmeUrl) { promise = promise .then(() => addClass(this.body, 'loading')) - .then(() => this.requestService.request({ url: extension.readmeUrl })) - .then(asText) + .then(() => this.extensionsWorkbenchService.getReadmeContents(extension)) .then(marked.parse) .then(body => { const webview = new WebView( diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts index 8b6d89d0080..7ddb3aaef9a 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensions.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensions.ts @@ -56,4 +56,5 @@ export interface IExtensionsWorkbenchService { canInstall(extension: IExtension): boolean; install(extension: IExtension): TPromise; uninstall(extension: IExtension): TPromise; + getReadmeContents(extension: IExtension): TPromise; } \ No newline at end of file diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts index 1b8871da0e6..3bcd3338121 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsWorkbenchService.ts @@ -18,6 +18,8 @@ import { IExtensionManagementService, IExtensionGalleryService, IExtensionTipsSe import * as semver from 'semver'; import * as path from 'path'; import URI from 'vs/base/common/uri'; +import { readFile } from 'vs/base/node/pfs'; +import { asText } from 'vs/base/node/request'; import { IExtension, ExtensionState, IExtensionsWorkbenchService } from './extensions'; interface IExtensionStateProvider { @@ -415,6 +417,21 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService { this.telemetryService.publicLog(eventName, assign(data, { success, duration })); } + getReadmeContents(extension: IExtension): TPromise { + if (!extension.readmeUrl) { + return TPromise.as(''); + } + + const uri = URI.parse(extension.readmeUrl); + + if (uri.scheme === 'file') { + return readFile(uri.fsPath, 'utf8'); + } + + return this.galleryService.getAsset(extension.readmeUrl) + .then(asText); + } + dispose(): void { this.disposables = dispose(this.disposables); }