Forráskód Böngészése

Merge pull request #1569 from ckeditor/t/1564

Other: View post-fixer should be called once while rendering model changes. Closes #1564.

BREAKING CHANGE: View post-fixers are now called once while rendering model changes.
Piotr Jasiun 7 éve
szülő
commit
8fe87e6f0f

+ 6 - 5
packages/ckeditor5-engine/src/view/view.js

@@ -361,12 +361,13 @@ export default class View {
 		callback( this._writer );
 		this._ongoingChange = false;
 
-		// Execute all document post-fixers after the change.
-		this._postFixersInProgress = true;
-		this.document._callPostFixers( this._writer );
-		this._postFixersInProgress = false;
-
+		// This lock is used by editing controller to render changes from outer most model.change() once. As plugins might call
+		// view.change() inside model.change() block - this will ensures that postfixers and rendering are called once after all changes.
 		if ( !this._renderingDisabled ) {
+			this._postFixersInProgress = true;
+			this.document._callPostFixers( this._writer );
+			this._postFixersInProgress = false;
+
 			this.fire( 'render' );
 		}
 	}

+ 16 - 0
packages/ckeditor5-engine/tests/controller/editingcontroller.js

@@ -431,6 +431,22 @@ describe( 'EditingController', () => {
 				expect( changeListenerSpy.calledOnce ).to.be.true;
 			} );
 
+			it( 'should call view post-fixers once for model.change() block', () => {
+				const postfixerSpy = sinon.spy();
+
+				editing.view.document.registerPostFixer( postfixerSpy );
+
+				model.change( writer => {
+					executeSomeModelChange( writer );
+
+					editing.view.change( writer => {
+						executeSomeViewChange( writer );
+					} );
+				} );
+
+				sinon.assert.calledOnce( postfixerSpy );
+			} );
+
 			function executeSomeModelChange( writer ) {
 				const range = new ModelRange( new ModelPosition( modelRoot, [ 0, 1 ] ), new ModelPosition( modelRoot, [ 2, 2 ] ) );
 				writer.addMarker( 'marker1', { range, usingOperation: true } );