From 466e69b8edc25cad61d2aff295a4573bbd9eda66 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 19 Mar 2019 09:09:30 +0100 Subject: [PATCH] files2 - always trigger activation event for fs provider, even if already registered --- .../services/files2/browser/fileService2.ts | 12 ++++++++---- .../files2/test/browser/fileService2.test.ts | 9 ++++++++- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/vs/workbench/services/files2/browser/fileService2.ts b/src/vs/workbench/services/files2/browser/fileService2.ts index eec59d16654..39dd466abe0 100644 --- a/src/vs/workbench/services/files2/browser/fileService2.ts +++ b/src/vs/workbench/services/files2/browser/fileService2.ts @@ -69,12 +69,10 @@ export class FileService2 extends Disposable implements IFileService { } activateProvider(scheme: string): Promise { - if (this.provider.has(scheme)) { - return Promise.resolve(); // provider is already here! TODO@ben should we still activate by event but not wait for it? - } + // Emit an event that we are about to activate a provider with the given scheme. + // Listeners can participate in the activation by registering a provider for it. const joiners: Promise[] = []; - this._onWillActivateFileSystemProvider.fire({ scheme, join(promise) { @@ -84,6 +82,12 @@ export class FileService2 extends Disposable implements IFileService { }, }); + if (this.provider.has(scheme)) { + return Promise.resolve(); // provider is already here so we can return directly + } + + // If the provider is not yet there, make sure to join on the listeners assuming + // that it takes a bit longer to register the file system provider. return Promise.all(joiners).then(() => undefined); } diff --git a/src/vs/workbench/services/files2/test/browser/fileService2.test.ts b/src/vs/workbench/services/files2/test/browser/fileService2.test.ts index 657594f1972..29a63567a3e 100644 --- a/src/vs/workbench/services/files2/test/browser/fileService2.test.ts +++ b/src/vs/workbench/services/files2/test/browser/fileService2.test.ts @@ -23,8 +23,11 @@ suite('File Service 2', () => { }); let registrationDisposable: IDisposable; + let callCount = 0; service.onWillActivateFileSystemProvider(e => { - if (e.scheme === 'test') { + callCount++; + + if (e.scheme === 'test' && callCount === 1) { e.join(new Promise(resolve => { registrationDisposable = service.registerProvider('test', new NullFileSystemProvider()); @@ -40,6 +43,10 @@ suite('File Service 2', () => { assert.equal(registrations.length, 1); assert.equal(registrations[0].scheme, 'test'); assert.equal(registrations[0].added, true); + assert.ok(registrationDisposable); + + await service.activateProvider('test'); + assert.equal(callCount, 2); // activation is called again registrationDisposable.dispose();