瀏覽代碼

Fixed: History should fix baseVersions after transforming delta, deltas transformed by History should be treated as important.

Szymon Cofalik 9 年之前
父節點
當前提交
4c6f9e40c3
共有 2 個文件被更改,包括 39 次插入1 次删除
  1. 9 1
      packages/ckeditor5-engine/src/model/history.js
  2. 30 0
      packages/ckeditor5-engine/tests/model/history.js

+ 9 - 1
packages/ckeditor5-engine/src/model/history.js

@@ -101,6 +101,14 @@ export default class History {
 			transformed = allResults;
 		}
 
+		// Fix base versions.
+		let baseVersion = transformed[ 0 ].operations[ 0 ].baseVersion;
+
+		for ( let i = 0; i < transformed.length; i++ ) {
+			transformed[ i ].baseVersion = baseVersion;
+			baseVersion += transformed[ i ].operations.length;
+		}
+
 		return transformed;
 	}
 
@@ -131,6 +139,6 @@ export default class History {
 	 * @returns {Array.<engine.model.delta.Delta>} Result of the transformation.
 	 */
 	static _transform( toTransform, transformBy ) {
-		return transform( toTransform, transformBy, false );
+		return transform( toTransform, transformBy, true );
 	}
 }

+ 30 - 0
packages/ckeditor5-engine/tests/model/history.js

@@ -116,6 +116,36 @@ describe( 'History', () => {
 			expect( History._transform.calledWithExactly( sinon.match.instanceOf( Delta ), deltaD ) ).to.be.true;
 		} );
 
+		it( 'should correctly set base versions if multiple deltas are result of transformation', () => {
+			// Let's stub History._transform so it will always return two deltas with two operations each.
+			History._transform = function() {
+				let resultA = new Delta();
+				resultA.addOperation( new NoOperation( 1 ) );
+				resultA.addOperation( new NoOperation( 1 ) );
+
+				let resultB = new Delta();
+				resultB.addOperation( new NoOperation( 1 ) );
+				resultB.addOperation( new NoOperation( 1 ) );
+
+				return [ resultA, resultB ];
+			};
+
+			let deltaA = new Delta();
+			deltaA.addOperation( new NoOperation( 0 ) );
+
+			let deltaX = new Delta();
+			deltaX.addOperation( new NoOperation( 0 ) );
+
+			history.addOperation( deltaA.operations[ 0 ] );
+
+			let result = history.getTransformedDelta( deltaX );
+
+			expect( result[ 0 ].operations[ 0 ].baseVersion ).to.equal( 1 );
+			expect( result[ 0 ].operations[ 1 ].baseVersion ).to.equal( 2 );
+			expect( result[ 1 ].operations[ 0 ].baseVersion ).to.equal( 3 );
+			expect( result[ 1 ].operations[ 1 ].baseVersion ).to.equal( 4 );
+		} );
+
 		it( 'should not transform given delta if it bases on current version of history', () => {
 			let deltaA = new Delta();
 			deltaA.addOperation( new NoOperation( 0 ) );