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

Merge pull request #944 from ckeditor/t/943

Fix: `MarkerDelta` transformation should no longer cause editor to crash, if a `MarkerOperation` had `null` as it's `oldRange` or `newRange`. Closes #943.
Piotrek Koszuliński 8 лет назад
Родитель
Сommit
8dd1f8588c

+ 7 - 2
packages/ckeditor5-engine/src/model/delta/basic-transformations.js

@@ -103,8 +103,13 @@ function transformMarkerDelta( a, b ) {
 	const transformedDelta = a.clone();
 	const transformedDelta = a.clone();
 	const transformedOp = transformedDelta.operations[ 0 ];
 	const transformedOp = transformedDelta.operations[ 0 ];
 
 
-	transformedOp.oldRange = transformedOp.oldRange.getTransformedByDelta( b )[ 0 ];
-	transformedOp.newRange = transformedOp.newRange.getTransformedByDelta( b )[ 0 ];
+	if ( transformedOp.oldRange ) {
+		transformedOp.oldRange = transformedOp.oldRange.getTransformedByDelta( b )[ 0 ];
+	}
+
+	if ( transformedOp.newRange ) {
+		transformedOp.newRange = transformedOp.newRange.getTransformedByDelta( b )[ 0 ];
+	}
 
 
 	return [ transformedDelta ];
 	return [ transformedDelta ];
 }
 }

+ 21 - 0
packages/ckeditor5-engine/tests/model/delta/transform/markerdelta.js

@@ -232,4 +232,25 @@ describe( 'transform', () => {
 			} );
 			} );
 		} );
 		} );
 	} );
 	} );
+
+	it( 'null ranges of MarkerDelta should not be changed during transformation', () => {
+		const markerDelta = getMarkerDelta( 'name', null, null, baseVersion );
+
+		// Transform `markerDelta` by any other delta that has a special transformation case with `MarkerDelta`.
+		const wrapElement = new Element( 'w' );
+		const wrapRange = new Range( new Position( root, [ 1 ] ), new Position( root, [ 2 ] ) );
+		const wrapDelta = getWrapDelta( wrapRange, wrapElement, baseVersion );
+
+		const transformed = transform( markerDelta, wrapDelta );
+
+		expect( transformed.length ).to.equal( 1 );
+		expect( transformed[ 0 ].operations.length ).to.equal( 1 );
+
+		const transformedOp = transformed[ 0 ].operations[ 0 ];
+
+		expect( transformedOp ).to.be.instanceof( MarkerOperation );
+		expect( transformedOp.oldRange ).to.be.null;
+		expect( transformedOp.newRange ).to.be.null;
+		expect( transformedOp.name ).to.equal( 'name' );
+	} );
 } );
 } );