浏览代码

Merge pull request #445 from ckeditor/t/263

t/263: TreeView class improvements.
Piotrek Koszuliński 9 年之前
父节点
当前提交
ea1b8a571a

+ 24 - 10
packages/ckeditor5-engine/src/view/document.js

@@ -69,9 +69,9 @@ export default class Document {
 		 * Roots of the view tree. Map of the {engine.view.Element view elements} with roots names as keys.
 		 *
 		 * @readonly
-		 * @member {Map} engine.view.Document#viewRoots
+		 * @member {Map} engine.view.Document#roots
 		 */
-		this.viewRoots = new Map();
+		this.roots = new Map();
 
 		/**
 		 * Instance of the {@link engine.view.Document#renderer renderer}.
@@ -136,7 +136,7 @@ export default class Document {
 	}
 
 	/**
-	 * Creates a {@link engine.view.Document#viewRoots view root element}.
+	 * Creates a {@link engine.view.Document#roots view root element}.
 	 *
 	 * If the DOM element is passed as a first parameter it will be automatically
 	 * {@link engine.view.Document#attachDomRoot attached}:
@@ -160,7 +160,7 @@ export default class Document {
 		const viewRoot = new ContainerElement( rootTag );
 		viewRoot.setDocument( this );
 
-		this.viewRoots.set( name, viewRoot );
+		this.roots.set( name, viewRoot );
 
 		// Mark changed nodes in the renderer.
 		viewRoot.on( 'change', ( evt, type, node ) => {
@@ -200,14 +200,14 @@ export default class Document {
 	}
 
 	/**
-	 * Gets a {@link engine.view.Document#viewRoots view root element} with the specified name. If the name is not
+	 * Gets a {@link engine.view.Document#roots view root element} with the specified name. If the name is not
 	 * specific "main" root is returned.
 	 *
 	 * @param {String} [name='main'] Name of the root.
 	 * @returns {engine.view.ContainerElement} The view root element with the specified name.
 	 */
 	getRoot( name = 'main' ) {
-		return this.viewRoots.get( name );
+		return this.roots.get( name );
 	}
 
 	/**
@@ -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();
+	}
+
+	/**
+	 * Disables all added observers.
+	 */
+	disableObservers() {
 		for ( let observer of this._observers.values() ) {
 			observer.disable();
 		}
+	}
 
-		this.renderer.render();
-
+	/**
+	 * Enables all added observers.
+	 */
+	enableObservers() {
 		for ( let observer of this._observers.values() ) {
 			observer.enable();
 		}

+ 49 - 15
packages/ckeditor5-engine/tests/view/document/document.js

@@ -51,7 +51,7 @@ describe( 'Document', () => {
 			const viewDocument = new Document();
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 0 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 0 );
+			expect( count( viewDocument.roots ) ).to.equal( 0 );
 			expect( count( viewDocument._observers ) ).to.equal( 0 );
 			expect( viewDocument ).to.have.property( 'renderer' ).that.is.instanceOf( Renderer );
 			expect( viewDocument ).to.have.property( 'writer' ).that.is.instanceOf( Writer );
@@ -69,7 +69,7 @@ describe( 'Document', () => {
 			const ret = viewDocument.createRoot( domDiv );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 1 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
 			const domRoot = viewDocument.getDomRoot();
 			const viewRoot = viewDocument.getRoot();
@@ -109,10 +109,10 @@ describe( 'Document', () => {
 			const ret = viewDocument.createRoot( domDiv );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 1 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
 			const domRoot = viewDocument.domRoots.get( 'main' );
-			const viewRoot = viewDocument.viewRoots.get( 'main' );
+			const viewRoot = viewDocument.roots.get( 'main' );
 
 			expect( ret ).to.equal( viewRoot );
 
@@ -126,10 +126,10 @@ describe( 'Document', () => {
 			const ret = viewDocument.createRoot( domDiv, 'header' );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 1 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
 			const domRoot = viewDocument.domRoots.get( 'header' );
-			const viewRoot = viewDocument.viewRoots.get( 'header' );
+			const viewRoot = viewDocument.roots.get( 'header' );
 
 			expect( ret ).to.equal( viewRoot );
 
@@ -141,7 +141,7 @@ describe( 'Document', () => {
 			const ret = viewDocument.createRoot( 'div' );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 0 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 			expect( ret ).to.equal( viewDocument.getRoot() );
 		} );
 	} );
@@ -154,13 +154,13 @@ describe( 'Document', () => {
 			const viewRoot = viewDocument.createRoot( 'div' );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 0 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 			expect( viewRoot ).to.equal( viewDocument.getRoot() );
 
 			viewDocument.attachDomRoot( domDiv );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 1 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
 			expect( viewDocument.getDomRoot() ).to.equal( domDiv );
 			expect( viewDocument.domConverter.getCorrespondingDom( viewRoot ) ).to.equal( domDiv );
@@ -176,13 +176,13 @@ describe( 'Document', () => {
 			const viewH1 = viewDocument.createRoot( 'h1', 'header' );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 0 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 2 );
+			expect( count( viewDocument.roots ) ).to.equal( 2 );
 			expect( viewH1 ).to.equal( viewDocument.getRoot( 'header' ) );
 
 			viewDocument.attachDomRoot( domH1, 'header' );
 
 			expect( count( viewDocument.domRoots ) ).to.equal( 1 );
-			expect( count( viewDocument.viewRoots ) ).to.equal( 2 );
+			expect( count( viewDocument.roots ) ).to.equal( 2 );
 
 			expect( viewDocument.getDomRoot( 'header' ) ).to.equal( domH1 );
 			expect( viewDocument.domConverter.getCorrespondingDom( viewH1 ) ).to.equal( domH1 );
@@ -196,18 +196,18 @@ describe( 'Document', () => {
 			const viewDocument = new Document();
 			viewDocument.createRoot( document.createElement( 'div' ) );
 
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
-			expect( viewDocument.getRoot() ).to.equal( viewDocument.viewRoots.get( 'main' ) );
+			expect( viewDocument.getRoot() ).to.equal( viewDocument.roots.get( 'main' ) );
 		} );
 
 		it( 'should return named root', () => {
 			const viewDocument = new Document();
 			viewDocument.createRoot( document.createElement( 'h1' ), 'header' );
 
-			expect( count( viewDocument.viewRoots ) ).to.equal( 1 );
+			expect( count( viewDocument.roots ) ).to.equal( 1 );
 
-			expect( viewDocument.getRoot( 'header' ) ).to.equal( viewDocument.viewRoots.get( 'header' ) );
+			expect( viewDocument.getRoot( 'header' ) ).to.equal( viewDocument.roots.get( 'header' ) );
 		} );
 	} );
 
@@ -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;
+		} );
+	} );
 } );

+ 1 - 1
packages/ckeditor5-engine/tests/view/observer/mutationobserver.js

@@ -109,7 +109,7 @@ describe( 'MutationObserver', () => {
 		// Prepare AdditionalEditor
 		viewDocument.createRoot( domAdditionalEditor, 'additional' );
 
-		viewDocument.viewRoots.get( 'additional' ).appendChildren(
+		viewDocument.getRoot( 'additional' ).appendChildren(
 			parse( '<container:p>foo</container:p><container:p>bar</container:p>' ) );
 
 		// Render AdditionalEditor (first editor has been rendered in the beforeEach function)