From bdaedb0238d7057889adabdc943dd7cda9580f3c Mon Sep 17 00:00:00 2001 From: Sandeep Somavarapu Date: Thu, 6 Sep 2018 20:23:40 +0200 Subject: [PATCH] #56137 Remove wireCancellationToken from Extension editor --- .../common/extensionManagement.ts | 9 ++++--- .../node/extensionGalleryService.ts | 26 +++++++++---------- .../node/multiExtensionManagement.ts | 3 ++- .../parts/extensions/common/extensions.ts | 9 ++++--- .../electron-browser/extensionEditor.ts | 10 +++---- .../electron-browser/extensionsList.ts | 8 +++--- .../node/extensionsWorkbenchService.ts | 17 ++++++------ .../extensionsWorkbenchService.test.ts | 13 +++++----- .../localizations.contribution.ts | 3 ++- 9 files changed, 53 insertions(+), 45 deletions(-) diff --git a/src/vs/platform/extensionManagement/common/extensionManagement.ts b/src/vs/platform/extensionManagement/common/extensionManagement.ts index bd788ac3723..5d24f4acc3b 100644 --- a/src/vs/platform/extensionManagement/common/extensionManagement.ts +++ b/src/vs/platform/extensionManagement/common/extensionManagement.ts @@ -13,6 +13,7 @@ import { createDecorator } from 'vs/platform/instantiation/common/instantiation' import { ILocalization } from 'vs/platform/localizations/common/localizations'; import { URI } from 'vs/base/common/uri'; import { IWorkspaceFolder, IWorkspace } from 'vs/platform/workspace/common/workspace'; +import { CancellationToken } from 'vs/base/common/cancellation'; export const EXTENSION_IDENTIFIER_PATTERN = '^([a-z0-9A-Z][a-z0-9\-A-Z]*)\\.([a-z0-9A-Z][a-z0-9\-A-Z]*)$'; export const EXTENSION_IDENTIFIER_REGEX = new RegExp(EXTENSION_IDENTIFIER_PATTERN); @@ -271,12 +272,12 @@ export interface IExtensionGalleryService { query(options?: IQueryOptions): TPromise>; download(extension: IGalleryExtension, operation: InstallOperation): TPromise; reportStatistic(publisher: string, name: string, version: string, type: StatisticType): TPromise; - getReadme(extension: IGalleryExtension): TPromise; - getManifest(extension: IGalleryExtension): TPromise; - getChangelog(extension: IGalleryExtension): TPromise; + getReadme(extension: IGalleryExtension, token: CancellationToken): TPromise; + getManifest(extension: IGalleryExtension, token: CancellationToken): TPromise; + getChangelog(extension: IGalleryExtension, token: CancellationToken): TPromise; getCoreTranslation(extension: IGalleryExtension, languageId: string): TPromise; loadCompatibleVersion(extension: IGalleryExtension): TPromise; - loadAllDependencies(dependencies: IExtensionIdentifier[]): TPromise; + loadAllDependencies(dependencies: IExtensionIdentifier[], token: CancellationToken): TPromise; getExtensionsReport(): TPromise; getExtension(id: IExtensionIdentifier, version?: string): TPromise; } diff --git a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts index a78f291c408..3d642baf387 100644 --- a/src/vs/platform/extensionManagement/node/extensionGalleryService.ts +++ b/src/vs/platform/extensionManagement/node/extensionGalleryService.ts @@ -538,13 +538,13 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .then(() => zipPath); } - getReadme(extension: IGalleryExtension): TPromise { - return this.getAsset(extension.assets.readme) + getReadme(extension: IGalleryExtension, token: CancellationToken): TPromise { + return this.getAsset(extension.assets.readme, {}, token) .then(asText); } - getManifest(extension: IGalleryExtension): TPromise { - return this.getAsset(extension.assets.manifest) + getManifest(extension: IGalleryExtension, token: CancellationToken): TPromise { + return this.getAsset(extension.assets.manifest, {}, token) .then(asText) .then(JSON.parse); } @@ -559,13 +559,13 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return TPromise.as(null); } - getChangelog(extension: IGalleryExtension): TPromise { - return this.getAsset(extension.assets.changelog) + getChangelog(extension: IGalleryExtension, token: CancellationToken): TPromise { + return this.getAsset(extension.assets.changelog, {}, token) .then(asText); } - loadAllDependencies(extensions: IExtensionIdentifier[]): TPromise { - return this.getDependenciesReccursively(extensions.map(e => e.id), []); + loadAllDependencies(extensions: IExtensionIdentifier[], token: CancellationToken): TPromise { + return this.getDependenciesReccursively(extensions.map(e => e.id), [], token); } loadCompatibleVersion(extension: IGalleryExtension): TPromise { @@ -603,7 +603,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { }); } - private loadDependencies(extensionNames: string[]): TPromise { + private loadDependencies(extensionNames: string[], token: CancellationToken): TPromise { if (!extensionNames || extensionNames.length === 0) { return TPromise.as([]); } @@ -616,7 +616,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { .withAssetTypes(AssetType.Icon, AssetType.License, AssetType.Details, AssetType.Manifest, AssetType.VSIX) .withFilter(FilterType.ExtensionName, ...extensionNames); - return this.queryGallery(query, CancellationToken.None).then(result => { + return this.queryGallery(query, token).then(result => { const dependencies = []; const ids = []; @@ -631,7 +631,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { }); } - private getDependenciesReccursively(toGet: string[], result: IGalleryExtension[]): TPromise { + private getDependenciesReccursively(toGet: string[], result: IGalleryExtension[], token: CancellationToken): TPromise { if (!toGet || !toGet.length) { return TPromise.wrap(result); } @@ -640,7 +640,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { return TPromise.wrap(result); } - return this.loadDependencies(toGet) + return this.loadDependencies(toGet, token) .then(loadedDependencies => { const dependenciesSet = new Set(); for (const dep of loadedDependencies) { @@ -651,7 +651,7 @@ export class ExtensionGalleryService implements IExtensionGalleryService { result = distinct(result.concat(loadedDependencies), d => d.identifier.uuid); const dependencies: string[] = []; dependenciesSet.forEach(d => !ExtensionGalleryService.hasExtensionByName(result, d) && dependencies.push(d)); - return this.getDependenciesReccursively(dependencies, result); + return this.getDependenciesReccursively(dependencies, result, token); }); } diff --git a/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts b/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts index 6f6ddb921cc..065bac07359 100644 --- a/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts +++ b/src/vs/platform/extensionManagement/node/multiExtensionManagement.ts @@ -20,6 +20,7 @@ import { Action } from 'vs/base/common/actions'; import { ILogService } from 'vs/platform/log/common/log'; import { Disposable } from 'vs/base/common/lifecycle'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { CancellationToken } from 'vs/base/common/cancellation'; export class MulitExtensionManagementService extends Disposable implements IExtensionManagementService { @@ -99,7 +100,7 @@ export class MulitExtensionManagementService extends Disposable implements IExte if (this.otherServers.length === 0) { return this.localServer.extensionManagementService.installFromGallery(gallery); } - return this.extensionGalleryService.getManifest(gallery) + return this.extensionGalleryService.getManifest(gallery, CancellationToken.None) .then(manifest => { const servers = isWorkspaceExtension(manifest, this.configurationService) ? this.servers : [this.localServer]; return TPromise.join(servers.map(server => server.extensionManagementService.installFromGallery(gallery))) diff --git a/src/vs/workbench/parts/extensions/common/extensions.ts b/src/vs/workbench/parts/extensions/common/extensions.ts index d21657c5075..8fc3472f451 100644 --- a/src/vs/workbench/parts/extensions/common/extensions.ts +++ b/src/vs/workbench/parts/extensions/common/extensions.ts @@ -11,6 +11,7 @@ import { IPager } from 'vs/base/common/paging'; import { IQueryOptions, IExtensionManifest, LocalExtensionType, EnablementState, ILocalExtension, IGalleryExtension } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IViewContainersRegistry, ViewContainer, Extensions as ViewContainerExtensions } from 'vs/workbench/common/views'; import { Registry } from 'vs/platform/registry/common/platform'; +import { CancellationToken } from 'vs/base/common/cancellation'; export const VIEWLET_ID = 'workbench.view.extensions'; export const VIEW_CONTAINER: ViewContainer = Registry.as(ViewContainerExtensions.ViewContainersRegistry).registerViewContainer(VIEWLET_ID); @@ -52,10 +53,10 @@ export interface IExtension { extensionPack: string[]; telemetryData: any; preview: boolean; - getManifest(): TPromise; - getReadme(): TPromise; + getManifest(token: CancellationToken): TPromise; + getReadme(token: CancellationToken): TPromise; hasReadme(): boolean; - getChangelog(): TPromise; + getChangelog(token: CancellationToken): TPromise; hasChangelog(): boolean; local?: ILocalExtension; locals?: ILocalExtension[]; @@ -87,7 +88,7 @@ export interface IExtensionsWorkbenchService { uninstall(extension: IExtension): TPromise; reinstall(extension: IExtension): TPromise; setEnablement(extensions: IExtension | IExtension[], enablementState: EnablementState): TPromise; - loadDependencies(extension: IExtension): TPromise; + loadDependencies(extension: IExtension, token: CancellationToken): TPromise; open(extension: IExtension, sideByside?: boolean): TPromise; checkForUpdates(): TPromise; allowedBadgeProviders: string[]; diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts index 300f7d75aae..5d3168c592c 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionEditor.ts @@ -9,7 +9,7 @@ import 'vs/css!./media/extensionEditor'; import { localize } from 'vs/nls'; import { TPromise, Promise } from 'vs/base/common/winjs.base'; import { marked } from 'vs/base/common/marked/marked'; -import { createCancelablePromise, wireCancellationToken } from 'vs/base/common/async'; +import { createCancelablePromise } from 'vs/base/common/async'; import * as arrays from 'vs/base/common/arrays'; import { OS } from 'vs/base/common/platform'; import { Event, Emitter, once, chain } from 'vs/base/common/event'; @@ -283,10 +283,10 @@ export class ExtensionEditor extends BaseEditor { this.transientDisposables = dispose(this.transientDisposables); - this.extensionReadme = new Cache(() => createCancelablePromise(token => wireCancellationToken(token, extension.getReadme()))); - this.extensionChangelog = new Cache(() => createCancelablePromise(token => wireCancellationToken(token, extension.getChangelog()))); - this.extensionManifest = new Cache(() => createCancelablePromise(token => wireCancellationToken(token, extension.getManifest()))); - this.extensionDependencies = new Cache(() => createCancelablePromise(token => wireCancellationToken(token, this.extensionsWorkbenchService.loadDependencies(extension)))); + this.extensionReadme = new Cache(() => createCancelablePromise(token => extension.getReadme(token))); + this.extensionChangelog = new Cache(() => createCancelablePromise(token => extension.getChangelog(token))); + this.extensionManifest = new Cache(() => createCancelablePromise(token => extension.getManifest(token))); + this.extensionDependencies = new Cache(() => createCancelablePromise(token => this.extensionsWorkbenchService.loadDependencies(extension, token))); const onError = once(domEvent(this.icon, 'error')); onError(() => this.icon.src = extension.iconUrlFallback, null, this.transientDisposables); diff --git a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts index 961904fe50b..b41009aea78 100644 --- a/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts +++ b/src/vs/workbench/parts/extensions/electron-browser/extensionsList.ts @@ -7,7 +7,7 @@ import { localize } from 'vs/nls'; import { append, $, addClass, removeClass, toggleClass } from 'vs/base/browser/dom'; -import { IDisposable, dispose } from 'vs/base/common/lifecycle'; +import { IDisposable, dispose, toDisposable } from 'vs/base/common/lifecycle'; import { Action } from 'vs/base/common/actions'; import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; @@ -23,6 +23,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { IExtensionTipsService, IExtensionManagementServerService } from 'vs/platform/extensionManagement/common/extensionManagement'; import { IThemeService } from 'vs/platform/theme/common/themeService'; import { INotificationService } from 'vs/platform/notification/common/notification'; +import { createCancelablePromise } from 'vs/base/common/async'; export interface ITemplateData { root: HTMLElement; @@ -180,12 +181,13 @@ export class Renderer implements IPagedRenderer { data.ratings.style.display = ''; data.extension = extension; - extension.getManifest().then(manifest => { + const manifestPromise = createCancelablePromise(token => extension.getManifest(token).then(manifest => { if (manifest) { const name = manifest && manifest.contributes && manifest.contributes.localizations && manifest.contributes.localizations.length > 0 && manifest.contributes.localizations[0].localizedLanguageName; if (name) { data.description.textContent = name[0].toLocaleUpperCase() + name.slice(1); } } - }); + })); + data.disposables.push(toDisposable(() => manifestPromise.cancel())); } disposeElement(): void { diff --git a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts index 82a425562aa..28e53bddc82 100644 --- a/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts +++ b/src/vs/workbench/parts/extensions/node/extensionsWorkbenchService.ts @@ -38,6 +38,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten import { groupBy } from 'vs/base/common/collections'; import { Schemas } from 'vs/base/common/network'; import * as resources from 'vs/base/common/resources'; +import { CancellationToken } from 'vs/base/common/cancellation'; interface IExtensionStateProvider { (extension: Extension): T; @@ -205,10 +206,10 @@ class Extension implements IExtension { return this.local && this.gallery && semver.gt(this.local.manifest.version, this.gallery.version); } - getManifest(): TPromise { + getManifest(token: CancellationToken): TPromise { if (this.gallery && !this.isGalleryOutdated()) { if (this.gallery.assets.manifest) { - return this.galleryService.getManifest(this.gallery); + return this.galleryService.getManifest(this.gallery, token); } this.logService.error(nls.localize('Manifest is not found', "Manifest is not found"), this.id); return TPromise.as(undefined); @@ -229,10 +230,10 @@ class Extension implements IExtension { return this.type === LocalExtensionType.System; } - getReadme(): TPromise { + getReadme(token: CancellationToken): TPromise { if (this.gallery && !this.isGalleryOutdated()) { if (this.gallery.assets.readme) { - return this.galleryService.getReadme(this.gallery); + return this.galleryService.getReadme(this.gallery, token); } this.telemetryService.publicLog('extensions:NotFoundReadMe', this.telemetryData); } @@ -266,9 +267,9 @@ ${this.description} return this.type === LocalExtensionType.System; } - getChangelog(): TPromise { + getChangelog(token: CancellationToken): TPromise { if (this.gallery && this.gallery.assets.changelog && !this.isGalleryOutdated()) { - return this.galleryService.getChangelog(this.gallery); + return this.galleryService.getChangelog(this.gallery, token); } const changelogUrl = this.local && this.local.changelogUrl; @@ -468,7 +469,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, }); } - loadDependencies(extension: IExtension): TPromise { + loadDependencies(extension: IExtension, token: CancellationToken): TPromise { if (!extension.dependencies.length) { return TPromise.wrap(null); } @@ -477,7 +478,7 @@ export class ExtensionsWorkbenchService implements IExtensionsWorkbenchService, .then(report => { const maliciousSet = getMaliciousExtensionsSet(report); - return this.galleryService.loadAllDependencies((extension).dependencies.map(id => ({ id }))) + return this.galleryService.loadAllDependencies((extension).dependencies.map(id => ({ id })), token) .then(galleryExtensions => galleryExtensions.map(galleryExtension => this.fromGallery(galleryExtension, maliciousSet))) .then(extensions => [...this.local, ...extensions]) .then(extensions => { diff --git a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts index 43c9c258989..3c2dbfeb066 100644 --- a/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts +++ b/src/vs/workbench/parts/extensions/test/electron-browser/extensionsWorkbenchService.test.ts @@ -38,6 +38,7 @@ import { ProgressService2 } from 'vs/workbench/services/progress/browser/progres import { INotificationService } from 'vs/platform/notification/common/notification'; import { URLService } from 'vs/platform/url/common/urlService'; import { URI } from 'vs/base/common/uri'; +import { CancellationToken } from 'vs/base/common/cancellation'; suite('ExtensionsWorkbenchServiceTest', () => { @@ -474,7 +475,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { instantiationService.stubPromise(IExtensionGalleryService, 'query', aPage(aGalleryExtension('a'))); return testObject.queryGallery().then(page => { - return testObject.loadDependencies(page.firstPage[0]).then(dependencies => { + return testObject.loadDependencies(page.firstPage[0], CancellationToken.None).then(dependencies => { assert.equal(null, dependencies); }); }); @@ -487,7 +488,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { return testObject.queryGallery().then(page => { const extension = page.firstPage[0]; - return testObject.loadDependencies(extension).then(actual => { + return testObject.loadDependencies(extension, CancellationToken.None).then(actual => { assert.ok(actual.hasDependencies); assert.equal(extension, actual.extension); assert.equal(null, actual.dependent); @@ -526,7 +527,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { return testObject.queryGallery().then(page => { const extension = page.firstPage[0]; - return testObject.loadDependencies(extension).then(actual => { + return testObject.loadDependencies(extension, CancellationToken.None).then(actual => { assert.ok(actual.hasDependencies); assert.equal(extension, actual.extension); assert.equal(null, actual.dependent); @@ -558,7 +559,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { return testObject.queryGallery().then(page => { const extension = page.firstPage[0]; - return testObject.loadDependencies(extension).then(actual => { + return testObject.loadDependencies(extension, CancellationToken.None).then(actual => { assert.ok(actual.hasDependencies); assert.equal(extension, actual.extension); assert.equal(null, actual.dependent); @@ -592,7 +593,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { return testObject.queryGallery().then(page => { const extension = page.firstPage[0]; - return testObject.loadDependencies(extension).then(actual => { + return testObject.loadDependencies(extension, CancellationToken.None).then(actual => { assert.ok(actual.hasDependencies); assert.equal(extension, actual.extension); assert.equal(null, actual.dependent); @@ -630,7 +631,7 @@ suite('ExtensionsWorkbenchServiceTest', () => { return testObject.queryGallery().then(page => { const extension = page.firstPage[0]; - return testObject.loadDependencies(extension).then(a => { + return testObject.loadDependencies(extension, CancellationToken.None).then(a => { assert.ok(a.hasDependencies); assert.equal(extension, a.extension); assert.equal(null, a.dependent); diff --git a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts index 57b338bea4f..f477e490598 100644 --- a/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts +++ b/src/vs/workbench/parts/localizations/electron-browser/localizations.contribution.ts @@ -29,6 +29,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { VIEWLET_ID as EXTENSIONS_VIEWLET_ID, IExtensionsViewlet } from 'vs/workbench/parts/extensions/common/extensions'; import { minimumTranslatedStrings } from 'vs/platform/node/minimalTranslations'; import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; +import { CancellationToken } from 'vs/base/common/cancellation'; // Register action to configure locale and related settings const registry = Registry.as(Extensions.WorkbenchActions); @@ -131,7 +132,7 @@ export class LocalizationWorkbenchContribution extends Disposable implements IWo return; } - TPromise.join([this.galleryService.getManifest(extensionToFetchTranslationsFrom), this.galleryService.getCoreTranslation(extensionToFetchTranslationsFrom, locale)]) + TPromise.join([this.galleryService.getManifest(extensionToFetchTranslationsFrom, CancellationToken.None), this.galleryService.getCoreTranslation(extensionToFetchTranslationsFrom, locale)]) .then(([manifest, translation]) => { const loc = manifest && manifest.contributes && manifest.contributes.localizations && manifest.contributes.localizations.filter(x => x.languageId.toLowerCase() === locale)[0]; const languageName = loc ? (loc.languageName || locale) : locale;