Skip to content

Commit

Permalink
Fix sticky modifier keys for word deletion
Browse files Browse the repository at this point in the history
closes bustle#625
- use `key.alt/shiftKey` getters when instigating word deletion in `event-manager.js`
    - word deletion is only triggered on <kbd>Backspace</kbd> and <kbd>Delete</kbd> 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
  • Loading branch information
kevinansfield committed Jun 18, 2018
1 parent 9a1b10f commit 895bfa9
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 24 deletions.
13 changes: 4 additions & 9 deletions src/js/editor/event-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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});

Expand Down Expand Up @@ -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});
Expand Down Expand Up @@ -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;
}
}

Expand Down
2 changes: 1 addition & 1 deletion tests/acceptance/editor-copy-paste-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
14 changes: 6 additions & 8 deletions tests/acceptance/editor-sections-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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();
});
});
});
11 changes: 5 additions & 6 deletions tests/helpers/dom.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 895bfa9

Please sign in to comment.