From 895bfa93b325368e1b1729d544bab195431b630c Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Mon, 18 Jun 2018 11:53:45 +0100 Subject: [PATCH] Fix sticky modifier keys for word deletion closes https://github.com/bustle/mobiledoc-kit/issues/625 - use `key.alt/shiftKey` getters when instigating word deletion in `event-manager.js` - word deletion is only triggered on Backspace and Delete so we can use the the browser-provided modifiers on the KeyboardEvent instead the internal modifier key tracking which is not reliable when the editor loses focus - update `triggerDelete` and `triggerForwardDelete` test helpers to accept an `options` argument so that modifier keys can be passed in as event arguments --- src/js/editor/event-manager.js | 13 ++++--------- tests/acceptance/editor-copy-paste-test.js | 2 +- tests/acceptance/editor-sections-test.js | 14 ++++++-------- tests/helpers/dom.js | 11 +++++------ 4 files changed, 16 insertions(+), 24 deletions(-) diff --git a/src/js/editor/event-manager.js b/src/js/editor/event-manager.js index 79c9b189f..22ea4d7ec 100644 --- a/src/js/editor/event-manager.js +++ b/src/js/editor/event-manager.js @@ -21,9 +21,7 @@ export default class EventManager { this._textInputHandler = new TextInputHandler(editor); this._listeners = []; this.modifierKeys = { - shift: false, - alt: false, - ctrl: false + shift: false }; this._selectionManager = new SelectionManager( @@ -156,6 +154,7 @@ export default class EventManager { if (!editor.hasCursor()) { return; } if (!editor.isEditable) { return; } + let key = Key.fromEvent(event); this._updateModifiersFromKey(key, {isDown:true}); @@ -184,9 +183,9 @@ export default class EventManager { case key.isDelete(): { let { direction } = key; let unit = 'char'; - if (this.modifierKeys.alt && Browser.isMac()) { + if (key.altKey && Browser.isMac()) { unit = 'word'; - } else if (this.modifierKeys.ctrl && Browser.isWin()) { + } else if (key.ctrlKey && Browser.isWin()) { unit = 'word'; } editor.performDelete({direction, unit}); @@ -286,10 +285,6 @@ export default class EventManager { _updateModifiersFromKey(key, {isDown}) { if (key.isShiftKey()) { this.modifierKeys.shift = isDown; - } else if (key.isAltKey()) { - this.modifierKeys.alt = isDown; - } else if (key.isCtrlKey()) { - this.modifierKeys.ctrl = isDown; } } diff --git a/tests/acceptance/editor-copy-paste-test.js b/tests/acceptance/editor-copy-paste-test.js index 08cdd9591..261ad1017 100644 --- a/tests/acceptance/editor-copy-paste-test.js +++ b/tests/acceptance/editor-copy-paste-test.js @@ -407,7 +407,7 @@ test('paste with shift key pastes plain text', (assert) => { Helpers.dom.triggerCopyEvent(editor); editor.selectRange(editor.post.tailPosition()); - Helpers.dom.triggerKeyEvent(editor, 'keydown', { keyCode: Keycodes.SHIFT }); + Helpers.dom.triggerKeyEvent(editor, 'keydown', { keyCode: Keycodes.SHIFT, shiftKey: true }); Helpers.dom.triggerPasteEvent(editor); assert.postIsSimilar(editor.post, expected); diff --git a/tests/acceptance/editor-sections-test.js b/tests/acceptance/editor-sections-test.js index 1f1d8e281..5f5c74b38 100644 --- a/tests/acceptance/editor-sections-test.js +++ b/tests/acceptance/editor-sections-test.js @@ -5,6 +5,7 @@ import { NO_BREAK_SPACE } from 'mobiledoc-kit/renderers/editor-dom'; import Range from 'mobiledoc-kit/utils/cursor/range'; import Keycodes from 'mobiledoc-kit/utils/keycodes'; import Browser from 'mobiledoc-kit/utils/browser'; +import { DIRECTION } from 'mobiledoc-kit/utils/key'; const { test, module } = Helpers; @@ -665,18 +666,15 @@ test('delete with option (Mac) or control (Win) key deletes full word', (assert editor.selectRange(new Range(editor.post.tailPosition())); let keyCode = Browser.isMac() ? Keycodes.ALT : Keycodes.CTRL; + let altKey = Browser.isMac(); + let ctrlKey = !Browser.isMac(); - Helpers.dom.triggerKeyEvent(editor, 'keydown', {keyCode}); Helpers.wait(() => { - Helpers.dom.triggerDelete(editor); + Helpers.dom.triggerDelete(editor, DIRECTION.BACKWARD, {altKey, ctrlKey}); Helpers.wait(() => { - Helpers.dom.triggerKeyEvent(editor, 'keyup', {keyCode}); - - Helpers.wait(() => { - assert.postIsSimilar(editor.post, expected); - done(); - }); + assert.postIsSimilar(editor.post, expected); + done(); }); }); }); diff --git a/tests/helpers/dom.js b/tests/helpers/dom.js index caf5e7683..4e72d3f8d 100644 --- a/tests/helpers/dom.js +++ b/tests/helpers/dom.js @@ -154,18 +154,17 @@ function createMockEvent(eventName, element, options={}) { return event; } -function triggerDelete(editor, direction=DIRECTION.BACKWARD) { +function triggerDelete(editor, direction=DIRECTION.BACKWARD, options={}) { assertEditor(editor); const keyCode = direction === DIRECTION.BACKWARD ? KEY_CODES.BACKSPACE : KEY_CODES.DELETE; - let event = createMockEvent('keydown', editor.element, { - keyCode - }); + let eventOptions = merge({keyCode}, options); + let event = createMockEvent('keydown', editor.element, eventOptions); _triggerEditorEvent(editor, event); } -function triggerForwardDelete(editor) { - return triggerDelete(editor, DIRECTION.FORWARD); +function triggerForwardDelete(editor, options) { + return triggerDelete(editor, DIRECTION.FORWARD, options); } function triggerEnter(editor) {