Bladeren bron

Fixed: view.Writer#move was incorrect for some cases when targetPosition was in an element which part was in moved range.

Szymon Cofalik 9 jaren geleden
bovenliggende
commit
46d4a8146c
2 gewijzigde bestanden met toevoegingen van 26 en 4 verwijderingen
  1. 15 4
      packages/ckeditor5-engine/src/view/writer.js
  2. 11 0
      packages/ckeditor5-engine/tests/view/writer/move.js

+ 15 - 4
packages/ckeditor5-engine/src/view/writer.js

@@ -379,11 +379,22 @@ export function remove( range ) {
  * {@link module:engine/view/range~Range#start start} and {@link module:engine/view/range~Range#end end} positions.
  */
 export function move( sourceRange, targetPosition ) {
-	if ( sourceRange.start.parent == targetPosition.parent ) {
-		targetPosition.offset -= sourceRange.end.offset - sourceRange.start.offset;
-	}
+	let nodes;
+
+	if ( targetPosition.isAfter( sourceRange.end ) ) {
+		targetPosition = _breakAttributes( targetPosition, true );
+
+		const parent = targetPosition.parent;
+		const countBefore = parent.childCount;
+
+		sourceRange = _breakAttributesRange( sourceRange, true );
 
-	const nodes = remove( sourceRange );
+		nodes = remove( sourceRange );
+
+		targetPosition.offset += ( parent.childCount - countBefore );
+	} else {
+		nodes = remove( sourceRange );
+	}
 
 	return insert( targetPosition, nodes );
 }

+ 11 - 0
packages/ckeditor5-engine/tests/view/writer/move.js

@@ -119,6 +119,17 @@ describe( 'writer', () => {
 			expect( stringify( view, newRange, { showType: true } ) ).to.equal( expectedView );
 		} );
 
+		it( 'should correctly move text nodes inside same container', () => {
+			let { view, selection } = parse( '<container:p><attribute:b>a{b</attribute:b>xx<attribute:b>c}d</attribute:b>yy</container:p>' );
+
+			const viewText = view.getChild( 3 );
+			const newRange = move( selection.getFirstRange(), ViewPosition.createAt( viewText, 1 ) );
+
+			expect( stringify( view, newRange, { showType: true } ) ).to.equal(
+				'<container:p><attribute:b>ad</attribute:b>y[<attribute:b>b</attribute:b>xx<attribute:b>c</attribute:b>]y</container:p>'
+			);
+		} );
+
 		it( 'should move EmptyElement', () => {
 			test(
 				'<container:p>foo[<empty:img></empty:img>]bar</container:p>',