8
0
Просмотр исходного кода

Fixed: Preventing "empty" wraps also in MoveOperation x WrapOperation cases.

Szymon Cofalik 7 лет назад
Родитель
Сommit
e00f1bd1aa

+ 9 - 2
packages/ckeditor5-engine/src/model/position.js

@@ -604,12 +604,19 @@ export default class Position {
 		if ( isContained ) {
 			pos = this._getCombined( operation.position, operation.targetPosition );
 		} else if ( this.isEqual( operation.targetPosition ) ) {
-			return Position.createFromPosition( this );
+			pos = Position.createFromPosition( this );
 		} else {
 			pos = this._getTransformedByInsertion( operation.targetPosition, operation.howMany );
 		}
 
-		return pos._getTransformedByMove( operation.targetPosition.getShiftedBy( operation.howMany ), operation.graveyardPosition, 1 );
+		const targetPosition = operation.targetPosition.getShiftedBy( operation.howMany );
+
+		if ( !targetPosition.isEqual( operation.graveyardPosition ) ) {
+			pos = pos._getTransformedByDeletion( targetPosition, 1 );
+			pos = pos._getTransformedByInsertion( operation.graveyardPosition, 1 );
+		}
+
+		return pos;
 	}
 
 	/**

+ 96 - 0
packages/ckeditor5-engine/tests/model/operation/transform/wrap.js

@@ -211,6 +211,102 @@ describe( 'transform', () => {
 			} );
 		} );
 
+		describe( 'by remove', () => {
+			it( 'remove the only wrapped element', () => {
+				john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+				kate.remove();
+
+				syncClients();
+
+				expectClients( '<paragraph>Bar</paragraph>' );
+			} );
+
+			it( 'remove one of two wrapped elements', () => {
+				john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+				kate.remove();
+
+				syncClients();
+
+				expectClients( '<blockQuote><paragraph>Bar</paragraph></blockQuote>' );
+			} );
+
+			it( 'remove all wrapped elements', () => {
+				john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Xyz</paragraph>' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+
+				kate.remove();
+				kate.setSelection( [ 0 ], [ 1 ] );
+				kate.remove();
+
+				syncClients();
+
+				expectClients( '<paragraph>Xyz</paragraph>' );
+			} );
+
+			it( 'remove the only wrapped element with undo', () => {
+				john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+				kate.remove();
+
+				syncClients();
+				expectClients( '<paragraph>Bar</paragraph>' );
+
+				john.undo();
+				kate.undo();
+
+				syncClients();
+				expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
+			} );
+
+			it( 'remove one of two wrapped elements with undo', () => {
+				john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+				kate.remove();
+
+				syncClients();
+				expectClients( '<blockQuote><paragraph>Bar</paragraph></blockQuote>' );
+
+				john.undo();
+				kate.undo();
+
+				syncClients();
+				expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph>' );
+			} );
+
+			it( 'remove all wrapped elements with undo', () => {
+				john.setData( '[<paragraph>Foo</paragraph><paragraph>Bar</paragraph>]<paragraph>Xyz</paragraph>' );
+				kate.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );
+
+				john.wrap( 'blockQuote' );
+
+				kate.remove();
+				kate.setSelection( [ 0 ], [ 1 ] );
+				kate.remove();
+
+				syncClients();
+				expectClients( '<paragraph>Xyz</paragraph>' );
+
+				john.undo();
+				kate.undo();
+				kate.undo();
+
+				syncClients();
+				expectClients( '<paragraph>Foo</paragraph><paragraph>Bar</paragraph><paragraph>Xyz</paragraph>' );
+			} );
+		} );
+
 		describe( 'by merge', () => {
 			it( 'element into paragraph #1', () => {
 				john.setData( '[<paragraph>Foo</paragraph>]<paragraph>Bar</paragraph>' );