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

Changed: ModelConversionDispatcher added additional conditions when changes in model are not dispatched.

Szymon Cofalik 9 лет назад
Родитель
Сommit
ad84938da1

+ 9 - 0
packages/ckeditor5-engine/src/conversion/modelconversiondispatcher.js

@@ -139,6 +139,15 @@ export default class ModelConversionDispatcher {
 			return;
 		}
 
+		if ( type == 'remove' && data.sourcePosition.root.rootName == '$graveyard' ) {
+			return;
+		}
+
+		if ( type == 'rename' && data.element.root.rootName == '$graveyard' ) {
+			return;
+		}
+
+		// We can safely dispatch changes.
 		if ( type == 'insert' || type == 'reinsert' ) {
 			this.convertInsertion( data.range );
 		} else if ( type == 'move' ) {

+ 25 - 1
packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js

@@ -191,7 +191,7 @@ describe( 'ModelConversionDispatcher', () => {
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
 
-		it( 'should not fire any event if change was in graveyard root and change type is different than remove', () => {
+		it( 'should not fire any event if changed range in graveyard root and change type is different than remove', () => {
 			sinon.spy( dispatcher, 'fire' );
 
 			let gyNode = new ModelElement( 'image' );
@@ -201,6 +201,30 @@ describe( 'ModelConversionDispatcher', () => {
 
 			expect( dispatcher.fire.called ).to.be.false;
 		} );
+
+		it( 'should not fire any event if remove operation moves nodes between graveyard holders', () => {
+			// This may happen during OT.
+			sinon.spy( dispatcher, 'fire' );
+
+			let gyNode = new ModelElement( 'image' );
+			doc.graveyard.appendChildren( gyNode );
+
+			doc.batch().remove( gyNode );
+
+			expect( dispatcher.fire.called ).to.be.false;
+		} );
+
+		it( 'should not fire any event if element in graveyard was removed', () => {
+			// This may happen during OT.
+			sinon.spy( dispatcher, 'fire' );
+
+			let gyNode = new ModelElement( 'image' );
+			doc.graveyard.appendChildren( gyNode );
+
+			doc.batch().rename( gyNode, 'p' );
+
+			expect( dispatcher.fire.called ).to.be.false;
+		} );
 	} );
 
 	describe( 'convertInsert', () => {