8
0
Просмотр исходного кода

Added getEditableElement() method to engine.view.Position class.

Szymon Kupś 9 лет назад
Родитель
Сommit
7351f9549e

+ 20 - 0
packages/ckeditor5-engine/src/view/position.js

@@ -9,6 +9,7 @@ import Text from './text.js';
 
 import compareArrays from '../../utils/comparearrays.js';
 import CKEditorError from '../../utils/ckeditorerror.js';
+import EditableElement from './editableelement.js';
 
 /**
  * Position in the tree. Position is always located before or after a node.
@@ -186,6 +187,25 @@ export default class Position {
 		return index < 0 ? 'BEFORE' : 'AFTER';
 	}
 
+	/**
+	 * Returns {@link engine.view.EditableElement EditableElement} instance that contains this position.
+	 *
+	 * @returns {engine.view.EditableElement|null} Returns closest EditableElement or null if none is found.
+	 */
+	getEditableElement() {
+		let editable = this.parent;
+
+		while ( !( editable instanceof EditableElement ) ) {
+			if ( editable.parent ) {
+				editable = editable.parent;
+			} else {
+				return null;
+			}
+		}
+
+		return editable;
+	}
+
 	/**
 	 * Creates a new position after the given node.
 	 *

+ 1 - 12
packages/ckeditor5-engine/src/view/selection.js

@@ -10,7 +10,6 @@ import Range from './range.js';
 import Position from './position.js';
 import mix from '../../utils/mix.js';
 import EmitterMixin from '../../utils/emittermixin.js';
-import EditableElement from './editableelement.js';
 
 /**
  * Class representing selection in tree view.
@@ -321,17 +320,7 @@ export default class Selection {
 	 */
 	getEditableElement() {
 		if ( this.rangeCount ) {
-			let editable = this.getFirstPosition().parent;
-
-			while ( !( editable instanceof EditableElement ) ) {
-				if ( editable.parent ) {
-					editable = editable.parent;
-				} else {
-					return null;
-				}
-			}
-
-			return editable;
+			return this.getFirstPosition().getEditableElement();
 		}
 
 		return null;

+ 19 - 0
packages/ckeditor5-engine/tests/view/position.js

@@ -10,6 +10,8 @@
 import Position from '/ckeditor5/engine/view/position.js';
 import Node from '/ckeditor5/engine/view/node.js';
 import Element from '/ckeditor5/engine/view/element.js';
+import EditableElement from '/ckeditor5/engine/view/editableelement.js';
+import Document from '/ckeditor5/engine/view/document.js';
 import Text from '/ckeditor5/engine/view/text.js';
 
 import CKEditorError from '/ckeditor5/utils/ckeditorerror.js';
@@ -319,4 +321,21 @@ describe( 'Position', () => {
 			} ).to.throw( CKEditorError, /position-after-root/ );
 		} );
 	} );
+
+	describe( 'getEditableElement', () => {
+		it( 'should return null if position is not inside EditableElement', () => {
+			const position = new Position( new Element( 'p' ), 0 );
+
+			expect( position.getEditableElement() ).to.be.null;
+		} );
+
+		it( 'should return EditableElement when position is placed inside', () => {
+			const document = new Document();
+			const p = new Element( 'p' );
+			const editable = new EditableElement( document, 'div', null, p );
+			const position = new Position( p, 0 );
+
+			expect( position.getEditableElement() ).to.equal( editable );
+		} );
+	} );
 } );