8
0
Quellcode durchsuchen

Fixed tests failing on Safari browser.

Szymon Kupś vor 8 Jahren
Ursprung
Commit
310df70db8

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

@@ -303,6 +303,9 @@ describe( 'SelectionObserver', () => {
 
 	it( 'should re-render view if selections are similar if DOM selection is in incorrect place', done => {
 		const sel = domDocument.getSelection();
+		const domParagraph = domMain.childNodes[ 0 ];
+		const domText = domParagraph.childNodes[ 0 ];
+		const domUI = domParagraph.childNodes[ 1 ];
 
 		// Add rendering on selectionChange event to check this feature.
 		viewDocument.on( 'selectionChange', () => {
@@ -332,12 +335,22 @@ describe( 'SelectionObserver', () => {
 			// 3. Now, collapse selection in similar position, but in UI element.
 			// Current and new selection position are similar in view (but not equal!).
 			// Also add a spy to `viewDocument#render` to see if view will be re-rendered.
-			sel.collapse( domMain.childNodes[ 0 ].childNodes[ 1 ], 0 );
+			sel.collapse( domUI, 0 );
 			sinon.spy( viewDocument, 'render' );
+
+			// Some browsers like Safari won't allow to put selection inside empty ui element.
+			// In that situation selection should stay in correct place.
+			if ( sel.anchorNode !== domUI ) {
+				expect( sel.anchorNode ).to.equal( domText );
+				expect( sel.anchorOffset ).to.equal( 3 );
+				expect( sel.isCollapsed ).to.be.true;
+
+				done();
+			}
 		}, { priority: 'lowest' } );
 
 		// 1. Collapse in a text node, before ui element, and wait for async selectionchange to fire selection change handling.
-		sel.collapse( domMain.childNodes[ 0 ].childNodes[ 0 ], 3 );
+		sel.collapse( domText, 3 );
 	} );
 
 	function changeDomSelection() {

+ 46 - 15
packages/ckeditor5-engine/tests/view/renderer.js

@@ -1181,16 +1181,14 @@ describe( 'Renderer', () => {
 		} );
 
 		it( 'should not change selection if there is no editable with selection', () => {
-			const domDiv = createElement( document, 'div', null, 'not editable' );
+			const domDiv = createElement( document, 'div', { contenteditable: true }, 'not editable' );
 			document.body.appendChild( domDiv );
+			domDiv.focus();
 
 			const domSelection = document.getSelection();
 
 			domSelection.removeAllRanges();
-			const domRange = document.createRange();
-			domRange.setStart( domDiv, 0 );
-			domRange.collapse( true );
-			domSelection.addRange( domRange );
+			domSelection.collapse( domDiv, 0 );
 
 			selectionEditable = null;
 
@@ -1202,9 +1200,21 @@ describe( 'Renderer', () => {
 			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 );
+
+			// Depending on the browser selection may end up before the text node or at the beginning of it.
+			// TODO: Switch this code to the upcoming tool: https://github.com/ckeditor/ckeditor5-core/issues/107.
+			const domRange = domSelection.getRangeAt( 0 );
+
+			if ( domRange.startContainer == domDiv ) {
+				expect( domRange.startContainer ).to.equal( domDiv );
+			} else {
+				expect( domRange.startContainer ).to.equal( domDiv.childNodes[ 0 ] );
+			}
+
+			expect( domRange.startOffset ).to.equal( 0 );
+			expect( domRange.collapsed ).to.be.true;
+
+			domDiv.remove();
 		} );
 
 		it( 'should not change selection if there is no focus', () => {
@@ -1229,9 +1239,21 @@ describe( 'Renderer', () => {
 			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 );
+
+			// Depending on the browser selection may end up before the text node or at the beginning of it.
+			// TODO: Switch this code to the upcoming tool: https://github.com/ckeditor/ckeditor5-core/issues/107.
+			const domSelectionRange = domSelection.getRangeAt( 0 );
+
+			if ( domSelectionRange.startContainer == domDiv ) {
+				expect( domSelectionRange.startContainer ).to.equal( domDiv );
+			} else {
+				expect( domSelectionRange.startContainer ).to.equal( domDiv.childNodes[ 0 ] );
+			}
+
+			expect( domSelectionRange.startOffset ).to.equal( 0 );
+			expect( domSelectionRange.collapsed ).to.be.true;
+
+			domDiv.remove();
 		} );
 
 		it( 'should not add inline filler after text node', () => {
@@ -1672,10 +1694,19 @@ describe( 'Renderer', () => {
 				renderer.render();
 
 				// Expect that after calling `renderer.render()` the DOM selection was re-rendered (and set at correct position).
-				expect( domSelection.anchorNode ).to.equal( domP );
-				expect( domSelection.anchorOffset ).to.equal( 1 );
-				expect( domSelection.focusNode ).to.equal( domP );
-				expect( domSelection.focusOffset ).to.equal( 1 );
+
+				// Depending on the browser selection may end up at the end of the text node or after the text node.
+				// TODO: Switch this code to the upcoming tool: https://github.com/ckeditor/ckeditor5-core/issues/107.
+				if ( domSelection.anchorNode == domP ) {
+					expect( domSelection.anchorNode ).to.equal( domP );
+					expect( domSelection.anchorOffset ).to.equal( 1 );
+				} else {
+					const textNode = domP.childNodes[ 0 ];
+					expect( domSelection.anchorNode ).to.equal( textNode );
+					expect( domSelection.anchorOffset ).to.equal( 3 );
+				}
+
+				expect( domSelection.getRangeAt( 0 ).collapsed ).to.be.true;
 			} );
 
 			it( 'should not render non-collapsed selection it is similar (element start)', () => {