diff --git a/src/model/markercollection.js b/src/model/markercollection.js index 895fa0d97..44aab4977 100644 --- a/src/model/markercollection.js +++ b/src/model/markercollection.js @@ -111,7 +111,15 @@ export default class MarkerCollection { if ( oldMarker ) { const oldRange = oldMarker.getRange(); - if ( oldRange.isEqual( range ) && managedUsingOperations === oldMarker.managedUsingOperations ) { + if ( managedUsingOperations !== oldMarker.managedUsingOperations ) { + /** + * Marker's type should be consistent. Provide correct `managedUsingOperations` parameter. + */ + throw new CKEditorError( 'marker-set-incorrect-marker-type:' + + ' Marker\'s type should be consistent. Provide correct `managedUsingOperations` parameter.' ); + } + + if ( oldRange.isEqual( range ) ) { return oldMarker; } diff --git a/src/model/writer.js b/src/model/writer.js index d23eaceed..1690cf24f 100644 --- a/src/model/writer.js +++ b/src/model/writer.js @@ -815,7 +815,7 @@ export default class Writer { * @param {Boolean} [options.usingOperation=false] Flag indicated whether the marker should be added by MarkerOperation. * @returns {module:engine/model/markercollection~Marker} Marker that was set. */ - setMarker( markerOrNameOrRange, rangeOrManagedUsingOperations, options ) { + setMarker( markerOrNameOrRange, rangeOrOptions, options ) { this._assertWriterUsedCorrectly(); let markerName, newRange, usingOperation; @@ -823,16 +823,16 @@ export default class Writer { if ( markerOrNameOrRange instanceof Range ) { markerName = uid(); newRange = markerOrNameOrRange; - usingOperation = !!rangeOrManagedUsingOperations && !!rangeOrManagedUsingOperations.usingOperation; + usingOperation = !!rangeOrOptions && !!rangeOrOptions.usingOperation; } else { markerName = typeof markerOrNameOrRange === 'string' ? markerOrNameOrRange : markerOrNameOrRange.name; - if ( rangeOrManagedUsingOperations instanceof Range ) { - newRange = rangeOrManagedUsingOperations; + if ( rangeOrOptions instanceof Range ) { + newRange = rangeOrOptions; usingOperation = !!options && !!options.usingOperation; } else { newRange = null; - usingOperation = !!rangeOrManagedUsingOperations && !!rangeOrManagedUsingOperations.usingOperation; + usingOperation = !!rangeOrOptions && !!rangeOrOptions.usingOperation; } } diff --git a/tests/model/writer.js b/tests/model/writer.js index af127e8f9..6882f533c 100644 --- a/tests/model/writer.js +++ b/tests/model/writer.js @@ -2004,11 +2004,14 @@ describe( 'Writer', () => { } ); it( 'should accept marker instance', () => { - const marker = setMarker( 'name', range ); + const marker = setMarker( 'name', range, { usingOperation: true } ); const range2 = Range.createFromParentsAndOffsets( root, 0, root, 0 ); setMarker( marker, range2, { usingOperation: true } ); - const op = batch.deltas[ 0 ].operations[ 0 ]; + + expect( batch.deltas.length ).to.equal( 2 ); + + const op = batch.deltas[ 1 ].operations[ 0 ]; expect( model.markers.get( 'name' ).getRange().isEqual( range2 ) ).to.be.true; expect( op.oldRange.isEqual( range ) ).to.be.true; @@ -2016,7 +2019,7 @@ describe( 'Writer', () => { } ); it( 'should accept empty range parameter if marker instance is passed and usingOperation is set to true', () => { - const marker = setMarker( 'name', range ); + const marker = setMarker( 'name', range, { usingOperation: true } ); const spy = sinon.spy(); model.on( 'applyOperation', spy ); @@ -2073,6 +2076,14 @@ describe( 'Writer', () => { } ).to.throw( CKEditorError, /^writer-setMarker-no-range/ ); } ); + it( 'should throw if marker is updated incorrectly', () => { + setMarker( 'name', range ); + + expect( () => { + setMarker( 'name', range, { usingOperation: true } ); + } ).to.throw( CKEditorError, /^marker-set-incorrect-marker-type/ ); + } ); + it( 'should throw when trying to use detached writer', () => { const marker = setMarker( 'name', range ); const writer = new Writer( model, batch );