Kaynağa Gözat

Fixed: LiveSelection#_fixGraveyardSelection put range in a place where selection cannot be placed.

Szymon Cofalik 9 yıl önce
ebeveyn
işleme
58d74e31cb

+ 16 - 2
packages/ckeditor5-engine/src/model/liveselection.js

@@ -8,6 +8,7 @@ import Range from './range.js';
 import LiveRange from './liverange.js';
 import Text from './text.js';
 import TextProxy from './textproxy.js';
+import TreeWalker from './treewalker.js';
 import toMap from '../../utils/tomap.js';
 import CKEditorError from '../../utils/ckeditorerror.js';
 import log from '../../utils/log.js';
@@ -621,10 +622,23 @@ export default class LiveSelection extends Selection {
 		newPath[ newPath.length - 1 ] -= gyPath[ 1 ];
 
 		const newPosition = new Position( oldRange.root, newPath );
-		const newRange = this._prepareRange( new Range( newPosition, newPosition ) );
+
+		const walker = new TreeWalker( { startPosition: newPosition, direction: 'backward' } );
+		let newRange = null;
+
+		for ( let value of walker ) {
+			if ( this._document.schema.check( { name: '$text', inside: value.previousPosition } ) ) {
+				newRange = new Range( value.previousPosition, value.previousPosition );
+				break;
+			}
+		}
+
+		if ( !newRange ) {
+			newRange = this._document._getDefaultRange();
+		}
 
 		const index = this._ranges.indexOf( gyRange );
-		this._ranges.splice( index, 1, newRange );
+		this._ranges.splice( index, 1, this._prepareRange( newRange ) );
 
 		gyRange.detach();
 	}

+ 5 - 5
packages/ckeditor5-engine/tests/model/liveselection.js

@@ -315,7 +315,7 @@ describe( 'LiveSelection', () => {
 		beforeEach( () => {
 			root.removeChildren( 0, root.childCount );
 			root.insertChildren( 0, [
-				new Element( 'ul', [], new Text( 'abcdef' ) ),
+				new Element( 'p', [], new Text( 'abcdef' ) ),
 				new Element( 'p', [], new Text( 'foobar' ) ),
 				new Text( 'xyz' )
 			] );
@@ -579,17 +579,17 @@ describe( 'LiveSelection', () => {
 			} );
 
 			it( 'fix selection range if it ends up in graveyard #3', () => {
-				selection.setRanges( [ new Range( new Position( root, [ 1, 2 ] ), new Position( root, [ 1, 4 ] ) ) ] );
+				selection.setRanges( [ new Range( new Position( root, [ 1, 1 ] ), new Position( root, [ 1, 2 ] ) ) ] );
 
 				doc.applyOperation( wrapInDelta(
 					new RemoveOperation(
-						new Position( root, [ 0 ] ),
-						3,
+						new Position( root, [ 1 ] ),
+						2,
 						doc.version
 					)
 				) );
 
-				expect( selection.getFirstPosition().path ).to.deep.equal( [ 0 ] );
+				expect( selection.getFirstPosition().path ).to.deep.equal( [ 0, 6 ] );
 			} );
 		} );
 	} );