From fc422b53b2d5924a2afc9d9c342769ed37293e48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Szymon=20Kup=C5=9B?= Date: Thu, 4 Jan 2018 16:50:17 +0100 Subject: [PATCH] EnterObserver stops keydown event if enter event is stopped. --- src/enterobserver.js | 10 ++++++++++ tests/enterobserver.js | 24 ++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/src/enterobserver.js b/src/enterobserver.js index da2dbdb..9ffc402 100644 --- a/src/enterobserver.js +++ b/src/enterobserver.js @@ -22,7 +22,17 @@ export default class EnterObserver extends Observer { document.on( 'keydown', ( evt, data ) => { if ( this.isEnabled && data.keyCode == keyCodes.enter ) { + // Save the event object to check later if it was stopped or not. + let event; + document.once( 'enter', evt => ( event = evt ), { priority: 'highest' } ); + document.fire( 'enter', new DomEventData( document, data.domEvent ) ); + + // Stop `keydown` event if `enter` event was stopped. + // https://github.com/ckeditor/ckeditor5/issues/753 + if ( event && event.stop.called ) { + evt.stop(); + } } } ); } diff --git a/tests/enterobserver.js b/tests/enterobserver.js index 9254c42..62761ed 100644 --- a/tests/enterobserver.js +++ b/tests/enterobserver.js @@ -49,6 +49,30 @@ describe( 'EnterObserver', () => { expect( spy.calledOnce ).to.be.false; } ); + + it( 'should stop keydown event when enter event is stopped', () => { + const keydownSpy = sinon.spy(); + viewDocument.on( 'keydown', keydownSpy ); + viewDocument.on( 'enter', evt => evt.stop() ); + + viewDocument.fire( 'keydown', new DomEventData( viewDocument, getDomEvent(), { + keyCode: getCode( 'enter' ) + } ) ); + + sinon.assert.notCalled( keydownSpy ); + } ); + + it( 'should not stop keydown event when enter event is not stopped', () => { + const keydownSpy = sinon.spy(); + viewDocument.on( 'keydown', keydownSpy ); + viewDocument.on( 'enter', evt => evt.stop() ); + + viewDocument.fire( 'keydown', new DomEventData( viewDocument, getDomEvent(), { + keyCode: getCode( 'x' ) + } ) ); + + sinon.assert.calledOnce( keydownSpy ); + } ); } ); function getDomEvent() {