Browse Source

Changed: Range#getTransformedByMove should not expect transformed targetPosition.

Szymon Cofalik 9 năm trước cách đây
mục cha
commit
a5ca4c9ebc

+ 8 - 1
packages/ckeditor5-engine/src/treemodel/liverange.js

@@ -120,7 +120,14 @@ function fixBoundaries( type, range, position ) {
 		case 'move':
 		case 'remove':
 		case 'reinsert':
-			const result = this.getTransformedByMove( position, range.start, howMany );
+			const sourcePosition = position;
+
+			// Range.getTransformedByMove is expecting `targetPosition` to be "before" move
+			// (before transformation). `range.start` is already after the move happened.
+			// We have to revert `range.start` to the state before the move.
+			const targetPosition = range.start.getTransformedByInsertion( sourcePosition, howMany );
+
+			const result = this.getTransformedByMove( sourcePosition, targetPosition, howMany );
 
 			// First item in the array is the "difference" part, so a part of the range
 			// that did not get moved. We use it as reference range and expand if possible.

+ 6 - 4
packages/ckeditor5-engine/src/treemodel/range.js

@@ -435,8 +435,10 @@ export default class Range {
 			difference = null;
 		}
 
+		const insertPosition = targetPosition.getTransformedByDeletion( sourcePosition, howMany );
+
 		if ( difference ) {
-			result = difference.getTransformedByInsertion( targetPosition, howMany, spread );
+			result = difference.getTransformedByInsertion( insertPosition, howMany, spread );
 		} else {
 			result = [];
 		}
@@ -445,10 +447,10 @@ export default class Range {
 
 		// Add common part of the range only if there is any and only if it is not
 		// already included in `difference` part.
-		if ( common && ( spread || !difference.containsPosition( targetPosition ) ) ) {
+		if ( common && ( spread || difference === null || !difference.containsPosition( insertPosition ) ) ) {
 			result.push( new Range(
-				common.start._getCombined( moveRange.start, targetPosition ),
-				common.end._getCombined( moveRange.start, targetPosition )
+				common.start._getCombined( moveRange.start, insertPosition ),
+				common.end._getCombined( moveRange.start, insertPosition )
 			) );
 		}
 

+ 2 - 2
packages/ckeditor5-engine/tests/treemodel/range.js

@@ -544,8 +544,8 @@ describe( 'Range', () => {
 			const range = new Range( new Position( root, [ 3, 2 ] ), new Position( root, [ 3, 7 ] ) );
 			const transformed = range.getTransformedByMove( new Position( root, [ 3 ] ), new Position( root, [ 6 ] ), 2 );
 
-			expect( transformed[ 0 ].start.path ).to.deep.equal( [ 6, 2 ] );
-			expect( transformed[ 0 ].end.path ).to.deep.equal( [ 6, 7 ] );
+			expect( transformed[ 0 ].start.path ).to.deep.equal( [ 4, 2 ] );
+			expect( transformed[ 0 ].end.path ).to.deep.equal( [ 4, 7 ] );
 		} );
 	} );