8
0
Pārlūkot izejas kodu

Introduced disableObservers and enableObservers methods.

Piotr Jasiun 9 gadi atpakaļ
vecāks
revīzija
9150c2bcda

+ 18 - 4
packages/ckeditor5-engine/src/view/document.js

@@ -221,16 +221,30 @@ export default class Document {
 	}
 
 	/**
-	 * Renders all changes. In order to avoid triggering the observers (e.g. mutations) all observers all detached
-	 * before rendering and reattached after that.
+	 * Renders all changes. In order to avoid triggering the observers (e.g. mutations) all observers are disabled
+	 * before rendering and re-enabled after that.
 	 */
 	render() {
+		this.disableObservers();
+
+		this.renderer.render();
+
+		this.enableObservers();
+	}
+
+	/**
+	 * Disable all added observers.
+	 */
+	disableObservers() {
 		for ( let observer of this._observers.values() ) {
 			observer.disable();
 		}
+	}
 
-		this.renderer.render();
-
+	/**
+	 * Enable all added observers.
+	 */
+	enableObservers() {
 		for ( let observer of this._observers.values() ) {
 			observer.enable();
 		}

+ 34 - 0
packages/ckeditor5-engine/tests/view/document/document.js

@@ -300,4 +300,38 @@ describe( 'Document', () => {
 			expect( getObserverMock ).to.be.undefined();
 		} );
 	} );
+
+	describe( 'disableObservers', () => {
+		it( 'should disable observers', () => {
+			const viewDocument = new Document();
+
+			const addedObserverMock = viewDocument.addObserver( ObserverMock );
+
+			expect( addedObserverMock.enable.calledOnce ).to.be.true;
+			expect( addedObserverMock.disable.called ).to.be.false;
+
+			viewDocument.disableObservers();
+
+			expect( addedObserverMock.enable.calledOnce ).to.be.true;
+			expect( addedObserverMock.disable.calledOnce ).to.be.true;
+		} );
+	} );
+
+	describe( 'enableObservers', () => {
+		it( 'should enable observers', () => {
+			const viewDocument = new Document();
+
+			const addedObserverMock = viewDocument.addObserver( ObserverMock );
+
+			viewDocument.disableObservers();
+
+			expect( addedObserverMock.enable.calledOnce ).to.be.true;
+			expect( addedObserverMock.disable.calledOnce ).to.be.true;
+
+			viewDocument.enableObservers();
+
+			expect( addedObserverMock.enable.calledTwice ).to.be.true;
+			expect( addedObserverMock.disable.calledOnce ).to.be.true;
+		} );
+	} );
 } );