Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit d328811

Browse files
authored
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.
2 parents 6875eff + 50d0c09 commit d328811

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/model/delta/basic-transformations.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,13 @@ function transformMarkerDelta( a, b ) {
103103
const transformedDelta = a.clone();
104104
const transformedOp = transformedDelta.operations[ 0 ];
105105

106-
transformedOp.oldRange = transformedOp.oldRange.getTransformedByDelta( b )[ 0 ];
107-
transformedOp.newRange = transformedOp.newRange.getTransformedByDelta( b )[ 0 ];
106+
if ( transformedOp.oldRange ) {
107+
transformedOp.oldRange = transformedOp.oldRange.getTransformedByDelta( b )[ 0 ];
108+
}
109+
110+
if ( transformedOp.newRange ) {
111+
transformedOp.newRange = transformedOp.newRange.getTransformedByDelta( b )[ 0 ];
112+
}
108113

109114
return [ transformedDelta ];
110115
}

tests/model/delta/transform/markerdelta.js

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,4 +232,25 @@ describe( 'transform', () => {
232232
} );
233233
} );
234234
} );
235+
236+
it( 'null ranges of MarkerDelta should not be changed during transformation', () => {
237+
const markerDelta = getMarkerDelta( 'name', null, null, baseVersion );
238+
239+
// Transform `markerDelta` by any other delta that has a special transformation case with `MarkerDelta`.
240+
const wrapElement = new Element( 'w' );
241+
const wrapRange = new Range( new Position( root, [ 1 ] ), new Position( root, [ 2 ] ) );
242+
const wrapDelta = getWrapDelta( wrapRange, wrapElement, baseVersion );
243+
244+
const transformed = transform( markerDelta, wrapDelta );
245+
246+
expect( transformed.length ).to.equal( 1 );
247+
expect( transformed[ 0 ].operations.length ).to.equal( 1 );
248+
249+
const transformedOp = transformed[ 0 ].operations[ 0 ];
250+
251+
expect( transformedOp ).to.be.instanceof( MarkerOperation );
252+
expect( transformedOp.oldRange ).to.be.null;
253+
expect( transformedOp.newRange ).to.be.null;
254+
expect( transformedOp.name ).to.equal( 'name' );
255+
} );
235256
} );

0 commit comments

Comments
 (0)