Przeglądaj źródła

Fixed: RemoveOperation#fromJSON caused newly created RemoveOperation#targetPosition to be based on current graveyard state rather than original operation's value.

Szymon Cofalik 9 lat temu
rodzic
commit
15ed89f72c

+ 16 - 0
packages/ckeditor5-engine/src/model/operation/removeoperation.js

@@ -130,4 +130,20 @@ export default class RemoveOperation extends MoveOperation {
 	static get className() {
 		return 'engine.model.operation.RemoveOperation';
 	}
+
+	/**
+	 * Creates `RemoveOperation` object from deserilized object, i.e. from parsed JSON string.
+	 *
+	 * @param {Object} json Deserialized JSON object.
+	 * @param {engine.model.Document} document Document on which this operation will be applied.
+	 * @returns {engine.model.operation.RemoveOperation}
+	 */
+	static fromJSON( json, document ) {
+		let sourcePosition = Position.fromJSON( json.sourcePosition, document );
+
+		const removeOp = new RemoveOperation( sourcePosition, json.howMany, json.baseVersion );
+		removeOp.targetPosition = Position.fromJSON( json.targetPosition, document );
+
+		return removeOp;
+	}
 }

+ 3 - 0
packages/ckeditor5-engine/tests/model/operation/removeoperation.js

@@ -11,6 +11,7 @@ import RemoveOperation from 'ckeditor5/engine/model/operation/removeoperation.js
 import MoveOperation from 'ckeditor5/engine/model/operation/moveoperation.js';
 import Position from 'ckeditor5/engine/model/position.js';
 import Text from 'ckeditor5/engine/model/text.js';
+import Element from 'ckeditor5/engine/model/element.js';
 import Delta from 'ckeditor5/engine/model/delta/delta.js';
 import { jsonParseStringify, wrapInDelta } from 'tests/engine/model/_utils/utils.js';
 
@@ -204,6 +205,8 @@ describe( 'RemoveOperation', () => {
 				doc.version
 			);
 
+			doc.graveyard.appendChildren( [ new Element( '$graveyardHolder' ), new Element( '$graveyardHolder' ) ] );
+
 			const serialized = jsonParseStringify( op );
 			const deserialized = RemoveOperation.fromJSON( serialized, doc );