8
0
Pārlūkot izejas kodu

Added: DomConverter#viewPositionToDom implemented additional conditions when the method may return `null` value.

Szymon Cofalik 9 gadi atpakaļ
vecāks
revīzija
1b581370a1

+ 15 - 4
packages/ckeditor5-engine/src/view/domconverter.js

@@ -252,7 +252,7 @@ export default class DomConverter {
 	 * If the converted position is directly before inline filler it is moved inside the filler.
 	 *
 	 * @param {engine.view.position} viewPosition View position.
-	 * @returns {Object} position
+	 * @returns {Object|null} position DOM position or `null` if view position could not be converted to DOM.
 	 * @returns {Node} position.parent DOM position parent.
 	 * @returns {Number} position.offset DOM position offset.
 	 */
@@ -261,6 +261,12 @@ export default class DomConverter {
 
 		if ( viewParent instanceof ViewText ) {
 			const domParent = this.getCorrespondingDomText( viewParent );
+
+			if ( !domParent ) {
+				// Position is in a view text node that has not been rendered to DOM yet.
+				return null;
+			}
+
 			let offset = viewPosition.offset;
 
 			if ( startsWithFiller( domParent ) ) {
@@ -268,13 +274,18 @@ export default class DomConverter {
 			}
 
 			return { parent: domParent, offset: offset };
-		}
-		// viewParent instance of ViewElement.
-		else {
+		} else {
+			// viewParent is instance of ViewElement.
 			let domParent, domBefore, domAfter;
 
 			if ( viewPosition.offset === 0 ) {
 				domParent = this.getCorrespondingDom( viewPosition.parent );
+
+				if ( !domParent ) {
+					// Position is in a view element that has not been rendered to DOM yet.
+					return null;
+				}
+
 				domAfter = domParent.childNodes[ 0 ];
 			} else {
 				domBefore = this.getCorrespondingDom( viewPosition.nodeBefore );

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

@@ -295,15 +295,7 @@ export default class Renderer {
 		// Possible options are:
 		// "FILLER{}"
 		// "FILLERadded-text{}"
-
 		const selectionPosition = this.selection.getFirstPosition();
-
-		// If we cannot convert this position's parent it means that selection is in not yet rendered
-		// node, which means that the filler can't be there.
-		if ( !this.domConverter.getCorrespondingDom( selectionPosition.parent ) ) {
-			return false;
-		}
-
 		const position = this.domConverter.viewPositionToDom( selectionPosition );
 
 		if ( position ) {

+ 17 - 0
packages/ckeditor5-engine/tests/view/domconverter/view-to-dom.js

@@ -8,6 +8,7 @@
 
 import ViewText from 'ckeditor5/engine/view/text.js';
 import ViewElement from 'ckeditor5/engine/view/element.js';
+import ViewPosition from 'ckeditor5/engine/view/position.js';
 import ViewContainerElement from 'ckeditor5/engine/view/containerelement.js';
 import ViewAttributeElement from 'ckeditor5/engine/view/attributeelement.js';
 import DomConverter from 'ckeditor5/engine/view/domconverter.js';
@@ -520,6 +521,22 @@ describe( 'DomConverter', () => {
 
 			expect( domPosition ).to.equal( null );
 		} );
+
+		it( 'should return null if view position is in a view text node that has not been rendered to DOM', () => {
+			const viewText = new ViewText( 'foo' );
+			const viewPosition = new ViewPosition( viewText, 1 );
+			const domPosition = converter.viewPositionToDom( viewPosition );
+
+			expect( domPosition ).to.equal( null );
+		} );
+
+		it( 'should return null if view position is in a view element that has not been rendered to DOM', () => {
+			const viewElement = new ViewContainerElement( 'div' );
+			const viewPosition = new ViewPosition( viewElement, 0 );
+			const domPosition = converter.viewPositionToDom( viewPosition );
+
+			expect( domPosition ).to.equal( null );
+		} );
 	} );
 
 	describe( 'viewRangeToDom', () => {