From 830d5c408ce73f2103033a3ff38e4ba990fb99b7 Mon Sep 17 00:00:00 2001 From: Alex Dima Date: Tue, 21 Nov 2017 13:47:09 +0100 Subject: [PATCH] Fixes #34913: Wait for command activation event if command is unknown --- .../commands/common/commandService.ts | 18 ++++++------- .../commands/test/commandService.test.ts | 26 +++++++++++++++++-- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/vs/platform/commands/common/commandService.ts b/src/vs/platform/commands/common/commandService.ts index 59365d20b37..1c9c187b2bf 100644 --- a/src/vs/platform/commands/common/commandService.ts +++ b/src/vs/platform/commands/common/commandService.ts @@ -6,7 +6,7 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; -import { ICommandService, ICommand, ICommandEvent, CommandsRegistry } from 'vs/platform/commands/common/commands'; +import { ICommandService, ICommandEvent, CommandsRegistry } from 'vs/platform/commands/common/commands'; import { IExtensionService } from 'vs/platform/extensions/common/extensions'; import Event, { Emitter } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; @@ -33,17 +33,19 @@ export class CommandService extends Disposable implements ICommandService { executeCommand(id: string, ...args: any[]): TPromise { // we always send an activation event, but // we don't wait for it when the extension - // host didn't yet start + // host didn't yet start and the command is already registered const activation = this._extensionService.activateByEvent(`onCommand:${id}`); - return this._extensionHostIsReady - ? activation.then(_ => this._tryExecuteCommand(id, args)) - : this._tryExecuteCommand(id, args); + if (!this._extensionHostIsReady && CommandsRegistry.getCommand(id)) { + return this._tryExecuteCommand(id, args); + } else { + return activation.then(_ => this._tryExecuteCommand(id, args)); + } } private _tryExecuteCommand(id: string, args: any[]): TPromise { - const command = this._getCommand(id); + const command = CommandsRegistry.getCommand(id); if (!command) { return TPromise.wrapError(new Error(`command '${id}' not found`)); } @@ -61,8 +63,4 @@ export class CommandService extends Disposable implements ICommandService { return TPromise.wrapError(err); } } - - private _getCommand(id: string): ICommand { - return CommandsRegistry.getCommand(id); - } } diff --git a/src/vs/platform/commands/test/commandService.test.ts b/src/vs/platform/commands/test/commandService.test.ts index faabf78a338..2d41ddf2fbb 100644 --- a/src/vs/platform/commands/test/commandService.test.ts +++ b/src/vs/platform/commands/test/commandService.test.ts @@ -101,10 +101,32 @@ suite('CommandService', function () { } }, new ContextKeyService(new SimpleConfigurationService())); - return service.executeCommand('bar').then(() => { + service.executeCommand('bar'); + assert.equal(callCounter, 1); + reg.dispose(); + }); + + test('issue #34913: !onReady, unknown command', function () { + + let callCounter = 0; + let resolveFunc: Function; + // let reg = CommandsRegistry.registerCommand('bar', () => callCounter += 1); + + let service = new CommandService(new InstantiationService(), new class extends SimpleExtensionService { + onReady() { + return new TPromise(_resolve => { resolveFunc = _resolve; }); + } + }, new ContextKeyService(new SimpleConfigurationService())); + + let r = service.executeCommand('bar'); + assert.equal(callCounter, 0); + + let reg = CommandsRegistry.registerCommand('bar', () => callCounter += 1); + resolveFunc(true); + + return r.then(() => { reg.dispose(); assert.equal(callCounter, 1); - }); }); -- GitLab