Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit cc766ab

Browse files
authored
Merge pull request #1027 from ckeditor/t/1026
Feature: Introduced `view.Document#keyup` event (fired by the `KeyObserver`). Closes #1026.
2 parents 8751faa + bccf3f4 commit cc766ab

File tree

4 files changed

+71
-7
lines changed

4 files changed

+71
-7
lines changed

src/view/observer/keyobserver.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ export default class KeyObserver extends DomEventObserver {
2121
constructor( document ) {
2222
super( document );
2323

24-
this.domEventType = 'keydown';
24+
this.domEventType = [ 'keydown', 'keyup' ];
2525
}
2626

2727
onDomEvent( domEvt ) {
28-
this.fire( 'keydown', domEvt, {
28+
this.fire( domEvt.type, domEvt, {
2929
keyCode: domEvt.keyCode,
3030

3131
altKey: domEvt.altKey,
@@ -54,7 +54,22 @@ export default class KeyObserver extends DomEventObserver {
5454
*/
5555

5656
/**
57-
* The value of the {@link module:engine/view/document~Document#event:keydown} event.
57+
* Fired when a key has been released.
58+
*
59+
* Introduced by {@link module:engine/view/observer/keyobserver~KeyObserver}.
60+
*
61+
* Note that because {@link module:engine/view/observer/keyobserver~KeyObserver} is attached by the
62+
* {@link module:engine/view/document~Document}
63+
* this event is available by default.
64+
*
65+
* @see module:engine/view/observer/keyobserver~KeyObserver
66+
* @event module:engine/view/document~Document#event:keyup
67+
* @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData
68+
*/
69+
70+
/**
71+
* The value of both events - {@link module:engine/view/document~Document#event:keydown} and
72+
* {@link module:engine/view/document~Document#event:keyup}.
5873
*
5974
* @class module:engine/view/observer/keyobserver~KeyEventData
6075
* @extends module:engine/view/observer/domeventdata~DomEventData

tests/view/manual/keyobserver.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import { setData } from '../../../src/dev-utils/view';
1111
const viewDocument = new Document();
1212

1313
viewDocument.on( 'keydown', ( evt, data ) => console.log( 'keydown', data ) );
14+
viewDocument.on( 'keyup', ( evt, data ) => console.log( 'keyup', data ) );
1415

1516
viewDocument.createRoot( document.getElementById( 'editable' ), 'editable' );
1617
setData( viewDocument, 'foo{}bar', { rootName: 'editable' } );

tests/view/manual/keyobserver.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
* Expected initialization: `foo{}bar`.
22
* Press some keys - nothing should be added to editor's contents.
3+
* When press some key - event `keydown` should be logged. When the key is released - event `keyup` should be logged.
4+
* You can hold the key in order to check whether `keydown` event is fired multiple times. After releasing the key, `keyup` event should be fired once.
35
* Check whether key events are logged to the console with proper data:
46
* `keyCode`,
57
* `altKey`,

tests/view/observer/keyobserver.js

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@ describe( 'KeyObserver', () => {
2222
} );
2323

2424
it( 'should define domEventType', () => {
25-
expect( observer.domEventType ).to.equal( 'keydown' );
25+
expect( observer.domEventType ).to.contains( 'keydown' );
26+
expect( observer.domEventType ).to.contains( 'keyup' );
2627
} );
2728

2829
describe( 'onDomEvent', () => {
@@ -31,7 +32,15 @@ describe( 'KeyObserver', () => {
3132

3233
viewDocument.on( 'keydown', spy );
3334

34-
observer.onDomEvent( { target: document.body, keyCode: 111, altKey: false, ctrlKey: false, metaKey: false, shiftKey: false } );
35+
observer.onDomEvent( {
36+
type: 'keydown',
37+
target: document.body,
38+
keyCode: 111,
39+
altKey: false,
40+
ctrlKey: false,
41+
metaKey: false,
42+
shiftKey: false
43+
} );
3544

3645
expect( spy.calledOnce ).to.be.true;
3746

@@ -52,7 +61,15 @@ describe( 'KeyObserver', () => {
5261

5362
viewDocument.on( 'keydown', spy );
5463

55-
observer.onDomEvent( { target: document.body, keyCode: 111, altKey: true, ctrlKey: true, metaKey: false, shiftKey: true } );
64+
observer.onDomEvent( {
65+
type: 'keydown',
66+
target: document.body,
67+
keyCode: 111,
68+
altKey: true,
69+
ctrlKey: true,
70+
metaKey: false,
71+
shiftKey: true
72+
} );
5673

5774
const data = spy.args[ 0 ][ 1 ];
5875
expect( data ).to.have.property( 'keyCode', 111 );
@@ -70,10 +87,39 @@ describe( 'KeyObserver', () => {
7087

7188
viewDocument.on( 'keydown', spy );
7289

73-
observer.onDomEvent( { target: document.body, keyCode: 111, metaKey: true } );
90+
observer.onDomEvent( { type: 'keydown', target: document.body, keyCode: 111, metaKey: true } );
7491

7592
const data = spy.args[ 0 ][ 1 ];
7693
expect( data ).to.have.property( 'ctrlKey', true );
7794
} );
95+
96+
it( 'should fire keyup with the target and key info', () => {
97+
const spy = sinon.spy();
98+
99+
viewDocument.on( 'keyup', spy );
100+
101+
observer.onDomEvent( {
102+
type: 'keyup',
103+
target: document.body,
104+
keyCode: 111,
105+
altKey: false,
106+
ctrlKey: false,
107+
metaKey: false,
108+
shiftKey: false
109+
} );
110+
111+
expect( spy.calledOnce ).to.be.true;
112+
113+
const data = spy.args[ 0 ][ 1 ];
114+
expect( data ).to.have.property( 'domTarget', document.body );
115+
expect( data ).to.have.property( 'keyCode', 111 );
116+
expect( data ).to.have.property( 'altKey', false );
117+
expect( data ).to.have.property( 'ctrlKey', false );
118+
expect( data ).to.have.property( 'shiftKey', false );
119+
expect( data ).to.have.property( 'keystroke', getCode( data ) );
120+
121+
// Just to be sure.
122+
expect( getCode( data ) ).to.equal( 111 );
123+
} );
78124
} );
79125
} );

0 commit comments

Comments
 (0)