diff --git a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts index 7aa8ac10873..e840bd9b331 100644 --- a/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts +++ b/src/vs/workbench/contrib/extensions/browser/extensionRecommendationNotificationService.ts @@ -361,7 +361,7 @@ export class ExtensionRecommendationNotificationService extends Disposable imple this.visibleNotification = { recommendationsNotification, source, from: Date.now() }; recommendationsNotification.show(); } - await raceCancellation(Event.toPromise(recommendationsNotification.onDidClose), token); + await raceCancellation(new Promise(c => disposables.add(Event.once(recommendationsNotification.onDidClose)(c))), token); return !recommendationsNotification.isCancelled(); } finally { disposables.dispose(); diff --git a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts index 82b0f4d4298..c644f0acb11 100644 --- a/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts +++ b/src/vs/workbench/contrib/extensions/test/electron-sandbox/extensionRecommendationsService.test.ts @@ -61,7 +61,9 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { platform } from 'vs/base/common/platform'; import { arch } from 'vs/base/common/process'; import { runWithFakedTimers } from 'vs/base/test/common/timeTravelScheduler'; +import { ensureNoDisposablesAreLeakedInTestSuite } from 'vs/base/test/common/utils'; import { DisposableStore } from 'vs/base/common/lifecycle'; +import { timeout } from 'vs/base/common/async'; const mockExtensionGallery: IGalleryExtension[] = [ aGalleryExtension('MockExtension1', { @@ -181,7 +183,7 @@ function aGalleryExtension(name: string, properties: any = {}, galleryExtensionP } suite('ExtensionRecommendationsService Test', () => { - const disposableStore = new DisposableStore(); + let disposableStore: DisposableStore; let workspaceService: IWorkspaceContextService; let instantiationService: TestInstantiationService; let testConfigurationService: TestConfigurationService; @@ -194,7 +196,15 @@ suite('ExtensionRecommendationsService Test', () => { let promptedEmitter: Emitter; let onModelAddedEvent: Emitter; + teardown(async () => { + disposableStore.dispose(); + await timeout(0); // allow for async disposables to complete + }); + + ensureNoDisposablesAreLeakedInTestSuite(); + setup(() => { + disposableStore = new DisposableStore(); instantiationService = disposableStore.add(new TestInstantiationService()); promptedEmitter = disposableStore.add(new Emitter()); installEvent = disposableStore.add(new Emitter()); @@ -308,8 +318,6 @@ suite('ExtensionRecommendationsService Test', () => { }); }); - teardown(() => disposableStore.clear()); - function setUpFolderWorkspace(folderName: string, recommendedExtensions: string[], ignoredRecommendations: string[] = []): Promise { return setUpFolder(folderName, recommendedExtensions, ignoredRecommendations); }