瀏覽代碼

Merge pull request #1361 from ckeditor/t/1358

Fix: `model.Range#getTransformedByDelta` should not crash for `MoveDelta` which moves no nodes. Closes #1358.
Piotr Jasiun 7 年之前
父節點
當前提交
e11474dd99
共有 2 個文件被更改,包括 30 次插入7 次删除
  1. 18 7
      packages/ckeditor5-engine/src/model/range.js
  2. 12 0
      packages/ckeditor5-engine/tests/model/range.js

+ 18 - 7
packages/ckeditor5-engine/src/model/range.js

@@ -399,13 +399,24 @@ export default class Range {
 		for ( const operation of delta.operations ) {
 			if ( supportedTypes.has( operation.type ) ) {
 				for ( let i = 0; i < ranges.length; i++ ) {
-					const result = ranges[ i ]._getTransformedByDocumentChange(
-						operation.type,
-						delta.type,
-						operation.targetPosition || operation.position,
-						operation.howMany || operation.nodes.maxOffset,
-						operation.sourcePosition
-					);
+					let result;
+
+					if ( operation.type == 'insert' ) {
+						result = ranges[ i ]._getTransformedByDocumentChange(
+							operation.type,
+							delta.type,
+							operation.position,
+							operation.nodes.maxOffset
+						);
+					} else {
+						result = ranges[ i ]._getTransformedByDocumentChange(
+							operation.type,
+							delta.type,
+							operation.targetPosition,
+							operation.howMany,
+							operation.sourcePosition
+						);
+					}
 
 					ranges.splice( i, 1, ...result );
 

+ 12 - 0
packages/ckeditor5-engine/tests/model/range.js

@@ -933,6 +933,18 @@ describe( 'Range', () => {
 				expect( transformed[ 0 ].start.path ).to.deep.equal( [ 0, 1 ] );
 				expect( transformed[ 0 ].end.path ).to.deep.equal( [ 2, 1 ] );
 			} );
+
+			// #1358
+			it( 'should not crash and not transform the range if move delta moves 0 nodes', () => {
+				const range = new Range( new Position( root, [ 0, 2 ] ), new Position( root, [ 0, 4 ] ) );
+				const delta = getMoveDelta( new Position( root, [ 0, 1 ] ), 0, new Position( root, [ 0, 3 ] ), 1 );
+
+				const transformed = range.getTransformedByDelta( delta );
+
+				expect( transformed.length ).to.equal( 1 );
+				expect( transformed[ 0 ].start.path ).to.deep.equal( [ 0, 2 ] );
+				expect( transformed[ 0 ].end.path ).to.deep.equal( [ 0, 4 ] );
+			} );
 		} );
 
 		describe( 'by RemoveDelta', () => {