From 0628cb33c794848d8df45d53f60ac782bfbb7d07 Mon Sep 17 00:00:00 2001 From: Anton Kosyakov Date: Thu, 31 Jan 2019 08:06:11 +0000 Subject: [PATCH] [vscode] fix #4175: tolerate mistyped keybindings Signed-off-by: Anton Kosyakov --- packages/core/src/browser/keybinding.spec.ts | 14 +++++++++++--- packages/core/src/browser/keys.ts | 4 ++-- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/core/src/browser/keybinding.spec.ts b/packages/core/src/browser/keybinding.spec.ts index 373ece00b0f58..ea1e7c241d375 100644 --- a/packages/core/src/browser/keybinding.spec.ts +++ b/packages/core/src/browser/keybinding.spec.ts @@ -157,10 +157,10 @@ describe('keybindings', () => { const bindings = keybindingRegistry.getKeybindingsForCommand(TEST_COMMAND2.id); if (bindings) { - expect(bindings.length).to.be.equal(2); + expect(bindings.length).to.be.equal(1); const keyCode = KeyCode.parse(bindings[0].keybinding); - expect(keyCode.key).to.be.equal(Key.F1); - expect(keyCode.ctrl).to.be.true; + expect(keyCode.key).to.be.equal(Key.F3); + expect(keyCode.ctrl).to.be.false; } }); @@ -516,6 +516,14 @@ describe('keys api', () => { const normalized = keyCode.normalizeToUsLayout(); expect(normalized).to.be.deep.equal(KeyCode.parse('ctrlcmd+/')); }); + + it('parse bogus keybinding', () => { + const [first, second] = KeySequence.parse(' CtrlCmd+sHiFt+F10 b '); + expect(first.ctrl).to.be.true; + expect(first.shift).to.be.true; + expect(first.key).is.equal(Key.F10); + expect(second.key).is.equal(Key.KEY_B); + }); }); const TEST_COMMAND: Command = { diff --git a/packages/core/src/browser/keys.ts b/packages/core/src/browser/keys.ts index 7f6f39f97c41a..9cbaad9558b48 100644 --- a/packages/core/src/browser/keys.ts +++ b/packages/core/src/browser/keys.ts @@ -84,7 +84,7 @@ export namespace KeySequence { export function parse(keybinding: string): KeySequence { const keyCodes = []; - const rawKeyCodes = keybinding.split(' '); + const rawKeyCodes = keybinding.trim().split(/\s+/g); for (const rawKeyCode of rawKeyCodes) { const keyCode = KeyCode.parse(rawKeyCode); if (keyCode !== undefined) { @@ -258,7 +258,7 @@ export class KeyCode { } const sequence: string[] = []; - const keys = keybinding.split('+'); + const keys = keybinding.trim().toLowerCase().split('+'); /* If duplicates i.e ctrl+ctrl+a or alt+alt+b or b+alt+b it is invalid */ if (keys.length !== new Set(keys).size) { throw new Error(`Can't parse keybinding ${keybinding} Duplicate modifiers`);