From 0df2a5da559a6aca1bb97c61c110b4eff4511f80 Mon Sep 17 00:00:00 2001 From: Kevin Ansfield Date: Sat, 7 Mar 2020 21:33:12 +0000 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20Fixed=20Ctrl+h=20and=20Ctrl+d=20?= =?UTF-8?q?breaking=20the=20editor=20when=20used=20on=20card=20boundaries?= =?UTF-8?q?=20in=20macOS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit closes https://github.com/TryGhost/Ghost/issues/10240 - intercept known macOS content-modifying keyboard shortcuts and simulate the "normal" keyboard events that they map to - `ctrl+h`: `Backspace` - `ctrl+d`: `Delete` --- .../addon/components/koenig-editor.js | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js b/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js index 4def64d92f..ad405546e2 100644 --- a/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js +++ b/ghost/admin/lib/koenig-editor/addon/components/koenig-editor.js @@ -3,6 +3,7 @@ * https://github.com/bustle/ember-mobiledoc-editor */ +import Browser from 'mobiledoc-kit/utils/browser'; import Component from '@ember/component'; import Editor from 'mobiledoc-kit/editor/editor'; import EmberObject, {computed, get} from '@ember/object'; @@ -810,6 +811,10 @@ export default Component.extend({ // handlers manually instead. // // Does not work on Linux but it's easier to have keymaps without dead keys there + // + // Secondarily, we also use this handler to deal with known default key combos + // that perform actions like DELETE, BACKSPACE, etc which can break mobiledoc + // if not intercepted and handled like the "normal" key events handleKeydown(event) { let key = Key.fromEvent(event); this._updateModifiersFromKey(key, {isDown: true}); @@ -824,6 +829,32 @@ export default Component.extend({ if (event.key === '`' && event.code === 'Space') { this._triggerTextHandlers(); } + + // intercept and simulate keyboard events to be picked up by + // mobiledoc-kit's event manager + // https://github.com/TryGhost/Ghost/issues/10240 + let {editor} = this; + if (Browser.isMac() && editor && editor.cursor && editor.cursor.isAddressable(event.target)) { + // ctrl+h = BACKSPACE + if (event.key === 'h' && event.ctrlKey) { + event.preventDefault(); + let simEvent = new KeyboardEvent('keydown', { + key: 'Backspace', + keyCode: 8 + }); + event.target.dispatchEvent(simEvent); + } + + // ctrl+d = DELETE + if (event.key === 'd' && event.ctrlKey) { + event.preventDefault(); + let simEvent = new KeyboardEvent('keydown', { + key: 'Delete', + keyCode: 46 + }); + event.target.dispatchEvent(simEvent); + } + } }, handleKeyup(event) {