Przeglądaj źródła

EditableElement.isFocus is set before actual rendering.

Szymon Kupś 9 lat temu
rodzic
commit
88466f28e5

+ 3 - 3
packages/ckeditor5-engine/src/view/editableelement.js

@@ -80,11 +80,11 @@ export default class EditableElement extends ContainerElement {
 			( isFocused ) => isFocused && document.selection.editableElement == this
 		);
 
-		// Update focus state after each rendering. Selection might be moved to different editable before rendering,
-		// but this does not mean that editable has focus - it will be placed there after rendering.
+		// Update focus state before each rendering. Rendering should not change neither the selection nor the value of
+		// document.isFocused property.
 		this.listenTo( document, 'render', () => {
 			this.isFocused = document.isFocused && document.selection.editableElement == this;
-		}, { priority: 'low' } );
+		}, { priority: 'high' } );
 	}
 }
 

+ 22 - 0
packages/ckeditor5-engine/tests/view/editableelement.js

@@ -91,6 +91,28 @@ describe( 'EditableElement', () => {
 			expect( viewHeader.isFocused ).to.be.true;
 		} );
 
+		it( 'should change isFocus before actual rendering', ( done ) => {
+			const rangeMain = Range.createFromParentsAndOffsets( viewMain, 0, viewMain, 0 );
+			const rangeHeader = Range.createFromParentsAndOffsets( viewHeader, 0, viewHeader, 0 );
+			docMock.render = sinon.spy();
+
+			docMock.selection.addRange( rangeMain );
+			docMock.isFocused = true;
+
+			expect( viewMain.isFocused ).to.be.true;
+			expect( viewHeader.isFocused ).to.be.false;
+
+			docMock.selection.setRanges( [ rangeHeader ] );
+
+			viewHeader.on( 'change:isFocused', ( evt, propertyName, value ) => {
+				expect( value ).to.be.true;
+				sinon.assert.notCalled( docMock.render );
+				done();
+			} );
+
+			docMock.fire( 'render' );
+		} );
+
 		it( 'should change isFocused when document.isFocus changes', () => {
 			const rangeMain = Range.createFromParentsAndOffsets( viewMain, 0, viewMain, 0 );
 			const rangeHeader = Range.createFromParentsAndOffsets( viewHeader, 0, viewHeader, 0 );