diff --git a/app/assets/javascripts/discourse/components/d-editor.js.es6 b/app/assets/javascripts/discourse/components/d-editor.js.es6 index ca76273972a..3cf7eadff21 100644 --- a/app/assets/javascripts/discourse/components/d-editor.js.es6 +++ b/app/assets/javascripts/discourse/components/d-editor.js.es6 @@ -159,6 +159,7 @@ export default Ember.Component.extend({ insertLinkHidden: true, link: '', lastSel: null, + _mouseTrap: null, @computed('placeholder') placeholderTranslated(placeholder) { @@ -172,10 +173,12 @@ export default Ember.Component.extend({ loadScript('defer/html-sanitizer-bundle').then(() => this.set('ready', true)); + const mouseTrap = Mousetrap(this.$('.d-editor-input')[0]); + const shortcuts = this.get('toolbar.shortcuts'); Ember.keys(shortcuts).forEach(sc => { const button = shortcuts[sc]; - Mousetrap(this.$('.d-editor-input')[0]).bind(sc, () => { + mouseTrap.bind(sc, () => { this.send(button.action, button); return false; }); @@ -190,15 +193,16 @@ export default Ember.Component.extend({ this.appEvents.on('composer:insert-text', text => { this._addText(this._getSelected(), text); }); + + this._mouseTrap = mouseTrap; }, @on('willDestroyElement') _shutDown() { this.appEvents.off('composer:insert-text'); - Ember.keys(this.get('toolbar.shortcuts')).forEach(sc => { - Mousetrap(this.$('.d-editor-input')[0]).unbind(sc); - }); + const mouseTrap = this._mouseTrap; + Ember.keys(this.get('toolbar.shortcuts')).forEach(sc => mouseTrap.unbind(sc)); this.$('.d-editor-preview').off('click.preview'); }, diff --git a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 index c170fe5cdfd..499a6d1bf6a 100644 --- a/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 +++ b/app/assets/javascripts/discourse/lib/keyboard-shortcuts.js.es6 @@ -374,8 +374,7 @@ export default { if ((combo === 'ctrl+f' || combo === 'command+f') && element.id === 'search-term') { return false; } - - return oldStopCallback(e, element, combo, sequence); + return oldStopCallback.call(this, e, element, combo, sequence); }; } }; diff --git a/test/javascripts/acceptance/composer-test.js.es6 b/test/javascripts/acceptance/composer-test.js.es6 index 76966aa689e..c2d4d04fb7b 100644 --- a/test/javascripts/acceptance/composer-test.js.es6 +++ b/test/javascripts/acceptance/composer-test.js.es6 @@ -42,6 +42,24 @@ test("Tests the Composer controls", () => { ok(exists('.d-editor-textarea-wrapper .popup-tip.good'), 'the body is now good'); }); + andThen(() => { + // Testing keyboard events is tough! + const mac = /Mac|iPod|iPhone|iPad/.test(navigator.platform); + const event = document.createEvent('Event'); + event.initEvent('keydown', true, true); + event[mac ? 'metaKey' : 'ctrlKey'] = true; + event.keyCode = 66; + + find('#reply-control .d-editor-input')[0].dispatchEvent(event); + }); + + andThen(() => { + const example = I18n.t(`composer.bold_text`); + equal(find('#reply-control .d-editor-input').val().trim(), + `this is the *content* of a post**${example}**`, + "it supports keyboard shortcuts"); + }); + click('#reply-control a.cancel'); andThen(() => { ok(exists('.bootbox.modal'), 'it pops up a confirmation dialog'); diff --git a/test/javascripts/components/d-editor-test.js.es6 b/test/javascripts/components/d-editor-test.js.es6 index 40234c1526d..745d9586bf8 100644 --- a/test/javascripts/components/d-editor-test.js.es6 +++ b/test/javascripts/components/d-editor-test.js.es6 @@ -63,7 +63,6 @@ function testCase(title, testFunc) { } testCase(`bold button with no selection`, function(assert, textarea) { - console.log(textarea.selectionStart); click(`button.bold`); andThen(() => { const example = I18n.t(`composer.bold_text`);