瀏覽代碼

Merge pull request #1682 from ckeditor/t/ckeditor5/1530

Feature: Introduce read-only `View#isRenderingInProgress` flag to check if the document is in the rendering phase. Closes https://github.com/ckeditor/ckeditor5/issues/1530.
Piotr Jasiun 6 年之前
父節點
當前提交
1d39f74b05
共有 2 個文件被更改,包括 27 次插入11 次删除
  1. 11 11
      packages/ckeditor5-engine/src/view/view.js
  2. 16 0
      packages/ckeditor5-engine/tests/view/view/view.js

+ 11 - 11
packages/ckeditor5-engine/src/view/view.js

@@ -89,6 +89,14 @@ export default class View {
 		this.domRoots = new Map();
 
 		/**
+		 * Used to prevent calling {@link #forceRender} and {@link #change} during rendering view to the DOM.
+		 *
+		 * @readonly
+		 * @member {Boolean} #isRenderingInProgress
+		 */
+		this.set( 'isRenderingInProgress', false );
+
+		/**
 		 * Instance of the {@link module:engine/view/renderer~Renderer renderer}.
 		 *
 		 * @protected
@@ -130,14 +138,6 @@ export default class View {
 		 * @private
 		 * @type {Boolean}
 		 */
-		this._renderingInProgress = false;
-
-		/**
-		 * Used to prevent calling {@link #forceRender} and {@link #change} during rendering view to the DOM.
-		 *
-		 * @private
-		 * @type {Boolean}
-		 */
 		this._postFixersInProgress = false;
 
 		/**
@@ -434,7 +434,7 @@ export default class View {
 	 * @returns {*} Value returned by the callback.
 	 */
 	change( callback ) {
-		if ( this._renderingInProgress || this._postFixersInProgress ) {
+		if ( this.isRenderingInProgress || this._postFixersInProgress ) {
 			/**
 			 * Thrown when there is an attempt to make changes to the view tree when it is in incorrect state. This may
 			 * cause some unexpected behaviour and inconsistency between the DOM and the view.
@@ -668,11 +668,11 @@ export default class View {
 	 * @private
 	 */
 	_render() {
-		this._renderingInProgress = true;
+		this.isRenderingInProgress = true;
 		this.disableObservers();
 		this._renderer.render();
 		this.enableObservers();
-		this._renderingInProgress = false;
+		this.isRenderingInProgress = false;
 	}
 
 	/**

+ 16 - 0
packages/ckeditor5-engine/tests/view/view/view.js

@@ -487,6 +487,22 @@ describe( 'view', () => {
 		} );
 	} );
 
+	describe( 'isRenderingInProgress', () => {
+		it( 'should be true while rendering is in progress', () => {
+			expect( view.isRenderingInProgress ).to.equal( false );
+
+			const spy = sinon.spy();
+
+			view.on( 'change:isRenderingInProgress', spy );
+
+			view.fire( 'render' );
+
+			sinon.assert.calledTwice( spy );
+			sinon.assert.calledWith( spy.firstCall, sinon.match.any, 'isRenderingInProgress', true );
+			sinon.assert.calledWith( spy.secondCall, sinon.match.any, 'isRenderingInProgress', false );
+		} );
+	} );
+
 	describe( 'forceRender()', () => {
 		it( 'disable observers, renders and enable observers', () => {
 			const observerMock = view.addObserver( ObserverMock );