Explorar el Código

Renderer tests and improvements.

Piotr Jasiun hace 9 años
padre
commit
c82c884bbf

+ 1 - 3
packages/ckeditor5-engine/src/view/renderer.js

@@ -418,9 +418,7 @@ export default class Renderer {
 			return;
 		}
 
-		if ( domSelection ) {
-			domSelection.removeAllRanges();
-		}
+		domSelection.removeAllRanges();
 
 		for ( let range of this.selection.getRanges() ) {
 			// Update ranges only in currently focused editable.

+ 49 - 0
packages/ckeditor5-engine/tests/view/renderer.js

@@ -17,6 +17,8 @@ import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
 import { parse } from '/tests/engine/_utils/view.js';
 import { INLINE_FILLER, INLINE_FILLER_LENGTH, isBlockFiller, BR_FILLER } from '/ckeditor5/engine/view/filler.js';
 
+import createElement from '/ckeditor5/utils/dom/createelement.js';
+
 describe( 'Renderer', () => {
 	let selection, domConverter, renderer;
 
@@ -760,6 +762,53 @@ describe( 'Renderer', () => {
 			renderAndExpectNoChanges( renderer, domRoot );
 		} );
 
+		it( 'should not change selection if there is no focusedEditable', () => {
+			const domDiv = createElement( document, 'div', null, 'not editable' );
+			document.body.appendChild( domDiv );
+
+			const domSelection = document.getSelection();
+
+			domSelection.removeAllRanges();
+			const domRange = new Range();
+			domRange.setStart( domDiv, 0 );
+			domRange.collapse( true );
+			domSelection.addRange( domRange );
+
+			renderer.focusedEditable = null;
+
+			const { view: viewP, selection: newSelection } = parse( '<container:p>fo{o}</container:p>' );
+
+			viewRoot.appendChildren( viewP );
+			selection.setTo( newSelection );
+
+			renderer.render();
+
+			expect( domSelection.rangeCount ).to.equal( 1 );
+			expect( domSelection.getRangeAt( 0 ).startContainer ).to.equal( domDiv );
+			expect( domSelection.getRangeAt( 0 ).startOffset ).to.equal( 0 );
+			expect( domSelection.getRangeAt( 0 ).collapsed ).to.equal( true );
+		} );
+
+		it( 'should not add ranges if different editable is focused', () => {
+			const domHeader = document.createElement( 'h1' );
+			const viewHeader = new ViewElement( 'h1' );
+			document.body.appendChild( domHeader );
+
+			domConverter.bindElements( domHeader, viewHeader );
+
+			renderer.focusedEditable = viewHeader;
+
+			const { view: viewP, selection: newSelection } = parse( '<container:p>fo{o}</container:p>' );
+
+			viewRoot.appendChildren( viewP );
+			selection.setTo( newSelection );
+
+			renderer.render();
+
+			const domSelection = document.getSelection();
+			expect( domSelection.rangeCount ).to.equal( 0 );
+		} );
+
 		it( 'should not add inline filler after text node', () => {
 			const domSelection = document.getSelection();