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

Added: Introduced `model.Document#transformDeltas` as an entry point for deltas transformation (instead of `deltaTransform.transformDeltaSets` which is protected).

Szymon Cofalik 8 лет назад
Родитель
Сommit
9917897f58

+ 21 - 0
packages/ckeditor5-engine/src/model/document.js

@@ -22,6 +22,7 @@ import LiveSelection from './liveselection';
 import Schema from './schema';
 import TreeWalker from './treewalker';
 import MarkerCollection from './markercollection';
+import deltaTransform from './delta/transform';
 import clone from '@ckeditor/ckeditor5-utils/src/lib/lodash/clone';
 import EmitterMixin from '@ckeditor/ckeditor5-utils/src/emittermixin';
 import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
@@ -338,6 +339,26 @@ export default class Document {
 		return null;
 	}
 
+	/**
+	 * Transforms two sets of deltas by themselves. Returns both transformed sets.
+	 *
+	 * @param {Array.<module:engine/model/delta/delta~Delta>} deltasA Array with the first set of deltas to transform. These
+	 * deltas are considered more important (than `deltasB`) when resolving conflicts.
+	 * @param {Array.<module:engine/model/delta/delta~Delta>} deltasB Array with the second set of deltas to transform. These
+	 * deltas are considered less important (than `deltasA`) when resolving conflicts.
+	 * @param {Boolean} [useContext=false] When set to `true`, transformation will store and use additional context
+	 * information to guarantee more expected results. Should be used whenever deltas related to already applied
+	 * deltas are transformed (for example when undoing changes).
+	 * @returns {Object}
+	 * @returns {Array.<module:engine/model/delta/delta~Delta>} return.deltasA The first set of deltas transformed
+	 * by the second set of deltas.
+	 * @returns {Array.<module:engine/model/delta/delta~Delta>} return.deltasB The second set of deltas transformed
+	 * by the first set of deltas.
+	 */
+	transformDeltas( deltasA, deltasB, useContext = false ) {
+		return deltaTransform.transformDeltaSets( deltasA, deltasB, useContext ? this : null );
+	}
+
 	/**
 	 * Custom toJSON method to solve child-parent circular dependencies.
 	 *

+ 40 - 0
packages/ckeditor5-engine/tests/model/document/document.js

@@ -8,6 +8,8 @@ import Schema from '../../../src/model/schema';
 import RootElement from '../../../src/model/rootelement';
 import Batch from '../../../src/model/batch';
 import Delta from '../../../src/model/delta/delta';
+import NoOperation from '../../../src/model/operation/nooperation';
+import deltaTransform from '../../../src/model/delta/transform';
 import Range from '../../../src/model/range';
 import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
 import count from '@ckeditor/ckeditor5-utils/src/count';
@@ -503,6 +505,44 @@ describe( 'Document', () => {
 		}
 	} );
 
+	describe( 'transformDeltas', () => {
+		it( 'should use deltaTransform.transformDeltaSets', () => {
+			sinon.spy( deltaTransform, 'transformDeltaSets' );
+
+			// Prepare some empty-ish deltas so the transformation won't throw an error.
+			const deltasA = [ new Delta() ];
+			deltasA[ 0 ].addOperation( new NoOperation( 0 ) );
+
+			const deltasB = [ new Delta() ];
+			deltasB[ 0 ].addOperation( new NoOperation( 0 ) );
+
+			doc.transformDeltas( deltasA, deltasB );
+
+			expect( deltaTransform.transformDeltaSets.calledOnce ).to.be.true;
+			expect( deltaTransform.transformDeltaSets.calledWith( deltasA, deltasB, null ) ).to.be.true;
+
+			deltaTransform.transformDeltaSets.restore();
+		} );
+
+		it( 'should pass itself to transformDeltaSets if useContext was set to true', () => {
+			sinon.spy( deltaTransform, 'transformDeltaSets' );
+
+			// Prepare some empty-ish deltas so the transformation won't throw an error.
+			const deltasA = [ new Delta() ];
+			deltasA[ 0 ].addOperation( new NoOperation( 0 ) );
+
+			const deltasB = [ new Delta() ];
+			deltasB[ 0 ].addOperation( new NoOperation( 0 ) );
+
+			doc.transformDeltas( deltasA, deltasB, true );
+
+			expect( deltaTransform.transformDeltaSets.calledOnce ).to.be.true;
+			expect( deltaTransform.transformDeltaSets.calledWith( deltasA, deltasB, doc ) ).to.be.true;
+
+			deltaTransform.transformDeltaSets.restore();
+		} );
+	} );
+
 	describe( '_getDefaultRoot()', () => {
 		it( 'should return graveyard root if there are no other roots in the document', () => {
 			expect( doc._getDefaultRoot() ).to.equal( doc.graveyard );