8
0
Quellcode durchsuchen

Marker type shouldn't change during the runtime.

Maciej Bukowski vor 7 Jahren
Ursprung
Commit
d423d56a18

+ 9 - 1
packages/ckeditor5-engine/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;
 			}
 

+ 5 - 5
packages/ckeditor5-engine/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;
 			}
 		}
 

+ 14 - 3
packages/ckeditor5-engine/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 );