diff --git a/src/inputcommand.js b/src/inputcommand.js index f290dcc..892581e 100644 --- a/src/inputcommand.js +++ b/src/inputcommand.js @@ -61,7 +61,7 @@ export default class InputCommand extends Command { * on the beginning of the range (which after removal is a collapsed range). * * @param {Object} [options] The command options. - * @param {String} [options.text] Text to be inserted. + * @param {String} options.text Text to be inserted. * @param {module:engine/model/range~Range} [options.range] Range in which the text is inserted. Defaults * to the first range in the current selection. * @param {module:engine/model/position~Position} [options.resultPosition] Position at which the selection @@ -76,28 +76,26 @@ export default class InputCommand extends Command { let textInsertions = 0; - if ( range && text !== undefined ) { - doc.enqueueChanges( () => { - const isCollapsedRange = range.isCollapsed; + doc.enqueueChanges( () => { + const isCollapsedRange = range.isCollapsed; - if ( !isCollapsedRange ) { - this._buffer.batch.remove( range ); - } + if ( !isCollapsedRange ) { + this._buffer.batch.remove( range ); + } - if ( text && text.length ) { - textInsertions = text.length; - this._buffer.batch.weakInsert( range.start, text ); - } + if ( text && text.length ) { + textInsertions = text.length; + this._buffer.batch.weakInsert( range.start, text ); + } - if ( resultPosition ) { - this.editor.data.model.selection.collapse( resultPosition ); - } else if ( isCollapsedRange ) { - // If range was collapsed just shift the selection by the number of inserted characters. - this.editor.data.model.selection.collapse( range.start.getShiftedBy( textInsertions ) ); - } + if ( resultPosition ) { + this.editor.data.model.selection.collapse( resultPosition ); + } else if ( isCollapsedRange ) { + // If range was collapsed just shift the selection by the number of inserted characters. + this.editor.data.model.selection.collapse( range.start.getShiftedBy( textInsertions ) ); + } - this._buffer.input( textInsertions ); - } ); - } + this._buffer.input( textInsertions ); + } ); } } diff --git a/tests/inputcommand.js b/tests/inputcommand.js index 6be4dbc..db23867 100644 --- a/tests/inputcommand.js +++ b/tests/inputcommand.js @@ -154,28 +154,27 @@ describe( 'InputCommand', () => { expect( buffer.size ).to.be.equal( 0 ); } ); - it( 'does nothing when there is no range', () => { + it( 'only removes content when no text given (with default non-collapsed range)', () => { setData( doc, '

[fo]obar

' ); - testUtils.sinon.stub( editor.document.selection, 'getFirstRange' ).returns( null ); + const spy = testUtils.sinon.spy( doc, 'enqueueChanges' ); - editor.execute( 'input', { - text: 'baz' - } ); + editor.execute( 'input' ); - expect( getData( doc, { selection: true } ) ).to.be.equal( '

[fo]obar

' ); + expect( spy.callCount ).to.be.equal( 1 ); + expect( getData( doc, { selection: true } ) ).to.be.equal( '

[]obar

' ); expect( buffer.size ).to.be.equal( 0 ); } ); - it( 'does nothing when there is no options object provided', () => { - setData( doc, '

[fo]obar

' ); + it( 'does not change selection and content when no text given (with default collapsed range)', () => { + setData( doc, '

fo[]obar

' ); const spy = testUtils.sinon.spy( doc, 'enqueueChanges' ); editor.execute( 'input' ); - expect( spy.callCount ).to.be.equal( 0 ); - expect( getData( doc, { selection: true } ) ).to.be.equal( '

[fo]obar

' ); + expect( spy.callCount ).to.be.equal( 1 ); + expect( getData( doc, { selection: true } ) ).to.be.equal( '

fo[]obar

' ); expect( buffer.size ).to.be.equal( 0 ); } ); } );