浏览代码

Merge pull request #522 from ckeditor/t/471

Added validation for Range.
Szymon Cofalik 9 年之前
父节点
当前提交
79997c2f34

+ 8 - 0
packages/ckeditor5-engine/src/model/selection.js

@@ -212,6 +212,10 @@ export default class Selection {
 	 * or backward - from end to start (`true`). Defaults to `false`.
 	 * or backward - from end to start (`true`). Defaults to `false`.
 	 */
 	 */
 	addRange( range, isBackward ) {
 	addRange( range, isBackward ) {
+		if ( !( range instanceof Range ) ) {
+			throw new CKEditorError( 'selection-invalid-range: Invalid Range.' );
+		}
+
 		this._pushRange( range );
 		this._pushRange( range );
 		this._lastRangeBackward = !!isBackward;
 		this._lastRangeBackward = !!isBackward;
 
 
@@ -291,6 +295,10 @@ export default class Selection {
 		this._ranges = [];
 		this._ranges = [];
 
 
 		for ( let range of newRanges ) {
 		for ( let range of newRanges ) {
+			if ( !( range instanceof Range ) ) {
+				throw new CKEditorError( 'selection-invalid-range: Invalid Range.' );
+			}
+
 			this._pushRange( range );
 			this._pushRange( range );
 		}
 		}
 
 

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

@@ -122,13 +122,17 @@ export default class Selection {
 	 * The flag is used to set {@link engine.view.Selection#anchor anchor} and
 	 * The flag is used to set {@link engine.view.Selection#anchor anchor} and
 	 * {@link engine.view.Selection#focus focus} properties.
 	 * {@link engine.view.Selection#focus focus} properties.
 	 *
 	 *
-	 * Throws {@link utils.CKEditorError CKEditorError} `view-selection-range-intersects` if added range intersects
+	 * Throws {@link utils.CKEditorError CKEditorError} `selection-range-intersects` if added range intersects
 	 * with ranges already stored in Selection instance.
 	 * with ranges already stored in Selection instance.
 	 *
 	 *
 	 * @fires engine.view.Selection#change
 	 * @fires engine.view.Selection#change
 	 * @param {engine.view.Range} range
 	 * @param {engine.view.Range} range
 	 */
 	 */
 	addRange( range, isBackward ) {
 	addRange( range, isBackward ) {
+		if ( !( range instanceof Range ) ) {
+			throw new CKEditorError( 'selection-invalid-range: Invalid Range.' );
+		}
+
 		this._pushRange( range );
 		this._pushRange( range );
 		this._lastRangeBackward = !!isBackward;
 		this._lastRangeBackward = !!isBackward;
 		this.fire( 'change' );
 		this.fire( 'change' );
@@ -259,6 +263,10 @@ export default class Selection {
 		this._ranges = [];
 		this._ranges = [];
 
 
 		for ( let range of newRanges ) {
 		for ( let range of newRanges ) {
+			if ( !( range instanceof Range ) ) {
+				throw new CKEditorError( 'selection-invalid-range: Invalid Range.' );
+			}
+
 			this._pushRange( range );
 			this._pushRange( range );
 		}
 		}
 
 
@@ -330,7 +338,7 @@ export default class Selection {
 	/**
 	/**
 	 * Adds range to selection - creates copy of given range so it can be safely used and modified.
 	 * Adds range to selection - creates copy of given range so it can be safely used and modified.
 	 *
 	 *
-	 * Throws {@link utils.CKEditorError CKEditorError} `view-selection-range-intersects` if added range intersects
+	 * Throws {@link utils.CKEditorError CKEditorError} `selection-range-intersects` if added range intersects
 	 * with ranges already stored in selection instance.
 	 * with ranges already stored in selection instance.
 	 *
 	 *
 	 * @private
 	 * @private
@@ -342,12 +350,12 @@ export default class Selection {
 				/**
 				/**
 				 * Trying to add a range that intersects with another range from selection.
 				 * Trying to add a range that intersects with another range from selection.
 				 *
 				 *
-				 * @error view-selection-range-intersects
+				 * @error selection-range-intersects
 				 * @param {engine.view.Range} addedRange Range that was added to the selection.
 				 * @param {engine.view.Range} addedRange Range that was added to the selection.
 				 * @param {engine.view.Range} intersectingRange Range from selection that intersects with `addedRange`.
 				 * @param {engine.view.Range} intersectingRange Range from selection that intersects with `addedRange`.
 				 */
 				 */
 				throw new CKEditorError(
 				throw new CKEditorError(
-					'view-selection-range-intersects: Trying to add a range that intersects with another range from selection.',
+					'selection-range-intersects: Trying to add a range that intersects with another range from selection.',
 					{ addedRange: range, intersectingRange: storedRange }
 					{ addedRange: range, intersectingRange: storedRange }
 				);
 				);
 			}
 			}

+ 12 - 0
packages/ckeditor5-engine/tests/model/selection.js

@@ -103,6 +103,12 @@ describe( 'Selection', () => {
 	} );
 	} );
 
 
 	describe( 'addRange', () => {
 	describe( 'addRange', () => {
+		it( 'should throw an error when range is invalid', () => {
+			expect( () => {
+				selection.addRange( { invalid: 'Range' } );
+			} ).to.throw( CKEditorError, 'selection-invalid-range: Invalid Range.' );
+		} );
+
 		it( 'should copy added ranges and store multiple ranges', () => {
 		it( 'should copy added ranges and store multiple ranges', () => {
 			selection.addRange( liveRange );
 			selection.addRange( liveRange );
 			selection.addRange( range );
 			selection.addRange( range );
@@ -491,6 +497,12 @@ describe( 'Selection', () => {
 			oldRanges = selection._ranges;
 			oldRanges = selection._ranges;
 		} );
 		} );
 
 
+		it( 'should throw an error when range is invalid', () => {
+			expect( () => {
+				selection.setRanges( [ { invalid: 'range' } ] );
+			} ).to.throw( CKEditorError, 'selection-invalid-range: Invalid Range.' );
+		} );
+
 		it( 'should remove all ranges and add given ranges', () => {
 		it( 'should remove all ranges and add given ranges', () => {
 			selection.setRanges( newRanges );
 			selection.setRanges( newRanges );
 
 

+ 14 - 2
packages/ckeditor5-engine/tests/view/selection.js

@@ -144,6 +144,12 @@ describe( 'Selection', () => {
 	} );
 	} );
 
 
 	describe( 'addRange', () => {
 	describe( 'addRange', () => {
+		it( 'should throw an error when range is invalid', () => {
+			expect( () => {
+				selection.addRange( { invalid: 'range' } );
+			} ).to.throw( CKEditorError, 'selection-invalid-range: Invalid Range.' );
+		} );
+
 		it( 'should add range to selection ranges', () => {
 		it( 'should add range to selection ranges', () => {
 			selection.addRange( range1 );
 			selection.addRange( range1 );
 			expect( selection._ranges[ 0 ].isEqual( range1 ) ).to.be.true;
 			expect( selection._ranges[ 0 ].isEqual( range1 ) ).to.be.true;
@@ -163,11 +169,11 @@ describe( 'Selection', () => {
 			selection.addRange( range1 );
 			selection.addRange( range1 );
 			expect( () => {
 			expect( () => {
 				selection.addRange( range2 );
 				selection.addRange( range2 );
-			} ).to.throw( CKEditorError, 'view-selection-range-intersects' );
+			} ).to.throw( CKEditorError, 'selection-range-intersects' );
 
 
 			expect( () => {
 			expect( () => {
 				selection.addRange( range1 );
 				selection.addRange( range1 );
-			} ).to.throw( CKEditorError, 'view-selection-range-intersects' );
+			} ).to.throw( CKEditorError, 'selection-range-intersects' );
 		} );
 		} );
 	} );
 	} );
 
 
@@ -328,6 +334,12 @@ describe( 'Selection', () => {
 	} );
 	} );
 
 
 	describe( 'setRanges', () => {
 	describe( 'setRanges', () => {
+		it( 'should throw an error when range is invalid', () => {
+			expect( () => {
+				selection.setRanges( [ { invalid: 'range' } ] );
+			} ).to.throw( CKEditorError, 'selection-invalid-range: Invalid Range.' );
+		} );
+
 		it( 'should add ranges and fire change event', ( done ) => {
 		it( 'should add ranges and fire change event', ( done ) => {
 			selection.addRange( range1 );
 			selection.addRange( range1 );