浏览代码

Renderer need to be Observable.

Piotr Jasiun 9 年之前
父节点
当前提交
1d7d9c2845

+ 12 - 12
packages/ckeditor5-engine/src/view/document.js

@@ -74,6 +74,18 @@ export default class Document {
 		this.roots = new Map();
 
 		/**
+		 * {@link engine.view.EditableElement} which is currently focused or null if all of them are blurred.
+		 *
+		 * This property is updated by the {@link engine.view.obsever.FocusObserver}.
+		 * If the {@link engine.view.obsever.FocusObserver} is disabled this property will not change.
+		 *
+		 * @readonly
+		 * @observable
+		 * @member {engine.view.EditableElement|null} engine.view.Document#focusedEditable
+		 */
+		this.set( 'focusedEditable', null );
+
+		/**
 		 * Instance of the {@link engine.view.Document#renderer renderer}.
 		 *
 		 * @readonly
@@ -90,18 +102,6 @@ export default class Document {
 		 */
 		this._observers = new Map();
 
-		/**
-		 * {@link engine.view.EditableElement} which is currently focused or null if all of them are blurred.
-		 *
-		 * This property is updated by the {@link engine.view.obsever.FocusObserver}.
-		 * If the {@link engine.view.obsever.FocusObserver} is disabled this property will not change.
-		 *
-		 * @readonly
-		 * @observable
-		 * @member {engine.view.EditableElement|null} engine.view.Document#focusedEditable
-		 */
-		this.set( 'focusedEditable', null );
-
 		injectQuirksHandling( this );
 	}
 

+ 4 - 0
packages/ckeditor5-engine/src/view/renderer.js

@@ -10,9 +10,11 @@ import ViewElement from './element.js';
 import ViewPosition from './position.js';
 import { INLINE_FILLER, INLINE_FILLER_LENGTH, startsWithFiller, isInlineFiller, isBlockFiller } from './filler.js';
 
+import mix from '../../utils/mix.js';
 import diff from '../../utils/diff.js';
 import insertAt from '../../utils/dom/insertat.js';
 import remove from '../../utils/dom/remove.js';
+import ObservableMixin from '../../utils/observablemixin.js';
 import CKEditorError from '../../utils/ckeditorerror.js';
 
 /**
@@ -433,3 +435,5 @@ export default class Renderer {
 		}
 	}
 }
+
+mix( Renderer, ObservableMixin );

+ 14 - 2
packages/ckeditor5-engine/tests/view/observer/selectionobserver.js

@@ -35,14 +35,14 @@ describe( 'SelectionObserver', () => {
 		viewRoot.appendChildren( parse( '<container:p>foo</container:p><container:p>bar</container:p>' ) );
 
 		viewDocument.render();
-
-		viewDocument.focusedEditable = viewRoot;
 	} );
 
 	beforeEach( ( done ) => {
 		viewDocument.selection.removeAllRanges();
 		document.getSelection().removeAllRanges();
 
+		viewDocument.focusedEditable = viewRoot;
+
 		viewDocument.getObserver( SelectionObserver ).enable();
 
 		// Ensure selectionchange will not be fired.
@@ -112,6 +112,18 @@ describe( 'SelectionObserver', () => {
 		changeDomSelection();
 	} );
 
+	it( 'should not fired if there is no focusedEditable', ( done ) => {
+		viewDocument.focusedEditable = null;
+
+		listenter.listenTo( viewDocument, 'selectionChange', () => {
+			throw 'selectionChange on render';
+		} );
+
+		setTimeout( () => done(), 70 );
+
+		changeDomSelection();
+	} );
+
 	it( 'should call render after selection change which reset selection if it was not changed', ( done ) => {
 		const viewBar = viewDocument.getRoot().getChild( 1 ).getChild( 0 );
 		viewDocument.selection.addRange( ViewRange.createFromParentsAndOffsets( viewBar, 0, viewBar, 1 ) );