소스 검색

Fixed treeModel.MoveOperation#getReversed to return properly transformed operation.

Szymon Cofalik 10 년 전
부모
커밋
80e649bddb

+ 4 - 1
packages/ckeditor5-engine/src/treemodel/operation/moveoperation.js

@@ -66,7 +66,10 @@ export default class MoveOperation extends Operation {
 	 * @returns {core.treeModel.operation.MoveOperation}
 	 */
 	getReversed() {
-		return new this.constructor( this.targetPosition, this.howMany, this.sourcePosition, this.baseVersion + 1 );
+		let newSourcePosition = this.targetPosition.getTransformedByDeletion( this.sourcePosition, this.howMany );
+		let newTargetPosition = this.sourcePosition.getTransformedByInsertion( this.targetPosition, this.howMany );
+
+		return new this.constructor( newSourcePosition, this.howMany, newTargetPosition, this.baseVersion + 1 );
 	}
 
 	_execute() {

+ 11 - 9
packages/ckeditor5-engine/tests/treemodel/operation/moveoperation.js

@@ -11,7 +11,6 @@ import Document from '/ckeditor5/core/treemodel/document.js';
 import MoveOperation from '/ckeditor5/core/treemodel/operation/moveoperation.js';
 import Position from '/ckeditor5/core/treemodel/position.js';
 import Element from '/ckeditor5/core/treemodel/element.js';
-import NodeList from '/ckeditor5/core/treemodel/nodelist.js';
 import CKEditorError from '/ckeditor5/core/ckeditorerror.js';
 
 describe( 'MoveOperation', () => {
@@ -99,21 +98,24 @@ describe( 'MoveOperation', () => {
 		expect( root.getChild( 4 ).character ).to.equal( 'x' );
 	} );
 
-	it( 'should create a MoveOperation as a reverse', () => {
-		let nodeList = new NodeList( 'bar' );
-
+	it( 'should create a proper MoveOperation as a reverse', () => {
 		let sourcePosition = new Position( root, [ 0 ] );
 		let targetPosition = new Position( root, [ 4 ] );
 
-		let operation = new MoveOperation( sourcePosition, nodeList.length, targetPosition, doc.version );
-
+		let operation = new MoveOperation( sourcePosition, 3, targetPosition, doc.version );
 		let reverse = operation.getReversed();
 
 		expect( reverse ).to.be.an.instanceof( MoveOperation );
 		expect( reverse.baseVersion ).to.equal( 1 );
-		expect( reverse.howMany ).to.equal( nodeList.length );
-		expect( reverse.sourcePosition.isEqual( targetPosition ) ).to.be.true;
-		expect( reverse.targetPosition.isEqual( sourcePosition ) ).to.be.true;
+		expect( reverse.howMany ).to.equal( 3 );
+		expect( reverse.sourcePosition.path ).is.deep.equal( [ 1 ] );
+		expect( reverse.targetPosition.path ).is.deep.equal( [ 0 ] );
+
+		operation = new MoveOperation( targetPosition, 3, sourcePosition, doc.version );
+		reverse = operation.getReversed();
+
+		expect( reverse.sourcePosition.path ).is.deep.equal( [ 0 ] );
+		expect( reverse.targetPosition.path ).is.deep.equal( [ 7 ] );
 	} );
 
 	it( 'should undo move node by applying reverse operation', () => {