提交 830d5c40 编写于 作者: A Alex Dima

Fixes #34913: Wait for command activation event if command is unknown

上级 448eaa21
......@@ -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<T>(id: string, ...args: any[]): TPromise<T> {
// 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<any> {
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);
}
}
......@@ -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<boolean>(_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);
});
});
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册