Kaynağa Gözat

Aligned code to changes in ModelSelection#setTo method.

Maciej Bukowski 7 yıl önce
ebeveyn
işleme
7284c797e0

+ 1 - 1
packages/ckeditor5-engine/src/conversion/downcast-selection-converters.js

@@ -39,7 +39,7 @@ export function convertRangeSelection() {
 			viewRanges.push( viewRange );
 		}
 
-		conversionApi.writer.setSelection( viewRanges, selection.isBackward );
+		conversionApi.writer.setSelection( viewRanges, { backward: selection.isBackward } );
 	};
 }
 

+ 1 - 1
packages/ckeditor5-engine/src/conversion/upcast-selection-converters.js

@@ -37,7 +37,7 @@ export function convertSelectionChange( model, mapper ) {
 			ranges.push( mapper.toModelRange( viewRange ) );
 		}
 
-		modelSelection.setTo( ranges, viewSelection.isBackward );
+		modelSelection.setTo( ranges, { backward: viewSelection.isBackward } );
 
 		if ( !modelSelection.isEqual( model.document.selection ) ) {
 			model.change( writer => {

+ 2 - 2
packages/ckeditor5-engine/src/dev-utils/model.js

@@ -131,7 +131,7 @@ export function setData( model, data, options = {} ) {
 				ranges.push( new ModelRange( start, end ) );
 			}
 
-			writer.setSelection( ranges, selection.isBackward );
+			writer.setSelection( ranges, { backward: selection.isBackward } );
 
 			if ( options.selectionAttributes ) {
 				writer.setSelectionAttribute( selection.getAttributes() );
@@ -326,7 +326,7 @@ export function parse( data, schema, options = {} ) {
 		}
 
 		// Create new selection.
-		selection = new ModelSelection( ranges, viewSelection.isBackward );
+		selection = new ModelSelection( ranges, { backward: viewSelection.isBackward } );
 
 		// Set attributes to selection if specified.
 		for ( const [ key, value ] of toMap( options.selectionAttributes || [] ) ) {

+ 2 - 2
packages/ckeditor5-engine/src/model/documentselection.js

@@ -634,8 +634,8 @@ class LiveSelection extends Selection {
 		return super.getLastRange() || this._document._getDefaultRange();
 	}
 
-	setTo( selectable, backwardSelectionOrOffset ) {
-		super.setTo( selectable, backwardSelectionOrOffset );
+	setTo( selectable, optionsOrPlaceOrOffset, options ) {
+		super.setTo( selectable, optionsOrPlaceOrOffset, options );
 		this._refreshAttributes();
 	}
 

+ 5 - 5
packages/ckeditor5-engine/src/model/selection.js

@@ -36,11 +36,11 @@ export default class Selection {
 	 *
 	 *		// Creates selection at the given range.
 	 *		const range = new Range( start, end );
-	 *		const selection = new Selection( range, isBackwardSelection );
+	 *		const selection = new Selection( range, { backward } );
 	 *
 	 *		// Creates selection at the given ranges
 	 * 		const ranges = [ new Range( start1, end2 ), new Range( star2, end2 ) ];
-	 *		const selection = new Selection( ranges, isBackwardSelection );
+	 *		const selection = new Selection( ranges, { backward } );
 	 *
 	 *		// Creates selection from the other selection.
 	 *		// Note: It doesn't copies selection attributes.
@@ -306,11 +306,11 @@ export default class Selection {
 	 *
 	 *		// Sets ranges from the given range.
 	 *		const range = new Range( start, end );
-	 *		selection.setTo( range, isBackwardSelection );
+	 *		selection.setTo( range, { backward } );
 	 *
 	 *		// Sets ranges from the iterable of ranges.
 	 * 		const ranges = [ new Range( start1, end2 ), new Range( star2, end2 ) ];
-	 *		selection.setTo( ranges, isBackwardSelection );
+	 *		selection.setTo( ranges, { backward } );
 	 *
 	 *		// Sets ranges from the other selection.
 	 *		// Note: It doesn't copies selection attributes.
@@ -385,7 +385,7 @@ export default class Selection {
 			this._setRanges( [ range ], backward );
 		} else if ( isIterable( selectable ) ) {
 			// We assume that the selectable is an iterable of ranges.
-			this._setRanges( selectable, optionsOrPlaceOrOffset );
+			this._setRanges( selectable, optionsOrPlaceOrOffset && !!optionsOrPlaceOrOffset.backward );
 		} else {
 			/**
 			 * Cannot set selection to given place.

+ 2 - 2
packages/ckeditor5-engine/src/model/utils/deletecontent.js

@@ -194,9 +194,9 @@ function insertParagraph( writer, position, selection ) {
 	writer.insert( paragraph, position );
 
 	if ( selection instanceof DocumentSelection ) {
-		writer.setSelection( paragraph );
+		writer.setSelection( paragraph, 0 );
 	} else {
-		selection.setTo( paragraph );
+		selection.setTo( paragraph, 0 );
 	}
 }
 

+ 1 - 0
packages/ckeditor5-engine/src/model/utils/modifyselection.js

@@ -50,6 +50,7 @@ export default function modifySelection( model, selection, options = {} ) {
 	const unit = options.unit ? options.unit : 'character';
 
 	const focus = selection.focus;
+
 	const walker = new TreeWalker( {
 		boundaries: getSearchRange( focus, isForward ),
 		singleCharacters: true,

+ 19 - 8
packages/ckeditor5-engine/src/model/writer.js

@@ -902,16 +902,16 @@ export default class Writer {
 	/**
 	 * Sets this selection's ranges and direction to the specified location based on the given
 	 * {@link module:engine/model/selection~Selection selection}, {@link module:engine/model/position~Position position},
-	 * {@link module:engine/model/element~Element element}, {@link module:engine/model/position~Position position},
+	 * {@link module:engine/model/element~Node node}, {@link module:engine/model/position~Position position},
 	 * {@link module:engine/model/range~Range range}, an iterable of {@link module:engine/model/range~Range ranges} or null.
 	 *
 	 *		// Sets ranges from the given range.
 	 *		const range = new Range( start, end );
-	 *		writer.setSelection( range, isBackwardSelection );
+	 *		writer.setSelection( range, { backward } );
 	 *
 	 *		// Sets ranges from the iterable of ranges.
 	 * 		const ranges = [ new Range( start1, end2 ), new Range( star2, end2 ) ];
-	 *		writer.setSelection( range, isBackwardSelection );
+	 *		writer.setSelection( range, { backward } );
 	 *
 	 *		// Sets ranges from the other selection.
 	 *		const otherSelection = new Selection();
@@ -925,24 +925,35 @@ export default class Writer {
 	 *		const position = new Position( root, path );
 	 *		writer.setSelection( position );
 	 *
-	 * 		// Sets collapsed range at the given offset in element.
+	 * 		// Sets range at the position of given node and offset.
 	 *		const paragraph = writer.createElement( 'paragraph' );
 	 *		writer.setSelection( paragraph, offset );
 	 *
+	 *		// Sets range inside the node.
+	 *		const paragraph = writer.createElement( 'paragraph', { backward } );
+	 *		writer.setSelection( paragraph, 'in' );
+	 *
+	 *		// Sets range on the node.
+	 *		const paragraph = writer.createElement( 'paragraph', { backward } );
+	 *		writer.setSelection( paragraph, 'on' );
+	 *
 	 * 		// Removes all ranges.
 	 *		writer.setSelection( null );
 	 *
 	 * Throws `writer-incorrect-use` error when the writer is used outside the `change()` block.
 	 *
 	 * @param {module:engine/model/selection~Selection|module:engine/model/documentselection~DocumentSelection|
-	 * module:engine/model/position~Position|module:engine/model/element~Element|
+	 * module:engine/model/position~Position|module:engine/model/node~Node|
 	 * Iterable.<module:engine/model/range~Range>|module:engine/model/range~Range|null} selectable
-	 * @param {Boolean|Number|'before'|'end'|'after'} [backwardSelectionOrOffset]
+	 * @param {Object|Number|'before'|'end'|'after'|'on'|'in'} [optionsOrPlaceOrOffset]
+	 * @param {Boolean} [optionsOrPlaceOrOffset.backward]
+	 * @param {Object} [options]
+	 * @param {Boolean} [options.backward]
 	 */
-	setSelection( selectable, backwardSelectionOrOffset ) {
+	setSelection( selectable, optionsOrPlaceOrOffset, options ) {
 		this._assertWriterUsedCorrectly();
 
-		this.model.document.selection._setTo( selectable, backwardSelectionOrOffset );
+		this.model.document.selection._setTo( selectable, optionsOrPlaceOrOffset, options );
 	}
 
 	/**

+ 1 - 1
packages/ckeditor5-engine/tests/conversion/downcast-selection-converters.js

@@ -574,7 +574,7 @@ describe( 'downcast-selection-converters', () => {
 
 		const isBackward = selectionPaths[ 2 ] === 'backward';
 		model.change( writer => {
-			writer.setSelection( new ModelRange( startPos, endPos ), isBackward );
+			writer.setSelection( new ModelRange( startPos, endPos ), { backward: isBackward } );
 
 			// And add or remove passed attributes.
 			for ( const key in selectionAttributes ) {

+ 3 - 3
packages/ckeditor5-engine/tests/dev-utils/model.js

@@ -283,7 +283,7 @@ describe( 'model test utils', () => {
 			it( 'writes selection in an empty root', () => {
 				const root = document.createRoot( '$root', 'empty' );
 				model.change( writer => {
-					writer.setSelection( root );
+					writer.setSelection( root, 0 );
 				} );
 
 				expect( stringify( root, selection ) ).to.equal(
@@ -293,7 +293,7 @@ describe( 'model test utils', () => {
 
 			it( 'writes selection collapsed in an element', () => {
 				model.change( writer => {
-					writer.setSelection( root );
+					writer.setSelection( root, 0 );
 				} );
 
 				expect( stringify( root, selection ) ).to.equal(
@@ -386,7 +386,7 @@ describe( 'model test utils', () => {
 
 			it( 'writes selection when is backward', () => {
 				model.change( writer => {
-					writer.setSelection( Range.createFromParentsAndOffsets( elA, 0, elB, 0 ), true );
+					writer.setSelection( Range.createFromParentsAndOffsets( elA, 0, elB, 0 ), { backward: true } );
 				} );
 
 				expect( stringify( root, selection ) ).to.equal(

+ 2 - 0
packages/ckeditor5-engine/tests/model/model.js

@@ -476,6 +476,8 @@ describe( 'Model', () => {
 
 			setData( model, '<paragraph>fo[ob]ar</paragraph>' );
 
+			expect( getData( model ) ).to.equal( '<paragraph>fo[ob]ar</paragraph>' );
+
 			model.modifySelection( model.document.selection, { direction: 'backward' } );
 
 			expect( getData( model ) ).to.equal( '<paragraph>fo[o]bar</paragraph>' );

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

@@ -320,6 +320,23 @@ describe( 'Selection', () => {
 			expect( ranges[ 0 ].end.offset ).to.deep.equal( 6 );
 		} );
 
+		it( 'should allow setting backward inside on the item', () => {
+			const textNode1 = new Text( 'foo' );
+			const textNode2 = new Text( 'bar' );
+			const textNode3 = new Text( 'baz' );
+			const element = new Element( 'p', null, [ textNode1, textNode2, textNode3 ] );
+
+			selection.setTo( textNode2, 'on', { backward: true } );
+
+			const ranges = Array.from( selection.getRanges() );
+			expect( ranges.length ).to.equal( 1 );
+			expect( ranges[ 0 ].start.parent ).to.equal( element );
+			expect( ranges[ 0 ].start.offset ).to.deep.equal( 3 );
+			expect( ranges[ 0 ].end.parent ).to.equal( element );
+			expect( ranges[ 0 ].end.offset ).to.deep.equal( 6 );
+			expect( selection.isBackward ).to.equal( true );
+		} );
+
 		// TODO - backward
 		// TODO - throwing
 

+ 4 - 4
packages/ckeditor5-engine/tests/model/writer.js

@@ -2195,7 +2195,7 @@ describe( 'Writer', () => {
 			const firstParagraph = root.getNodeByPath( [ 1 ] );
 
 			const setToSpy = sinon.spy( DocumentSelection.prototype, '_setTo' );
-			setSelection( firstParagraph );
+			setSelection( firstParagraph, 0 );
 
 			expect( setToSpy.calledOnce ).to.be.true;
 			setToSpy.restore();
@@ -2204,7 +2204,7 @@ describe( 'Writer', () => {
 		it( 'should change document selection ranges', () => {
 			const range = new Range( new Position( root, [ 1 ] ), new Position( root, [ 2, 2 ] ) );
 
-			setSelection( range, true );
+			setSelection( range, { backward: true } );
 
 			expect( model.document.selection._ranges.length ).to.equal( 1 );
 			expect( model.document.selection._ranges[ 0 ].start.path ).to.deep.equal( [ 1 ] );
@@ -2566,9 +2566,9 @@ describe( 'Writer', () => {
 		} );
 	}
 
-	function setSelection( selectable, backwardSelectionOrOffset ) {
+	function setSelection( selectable, optionsOrPlaceOrOffset, options ) {
 		model.enqueueChange( batch, writer => {
-			writer.setSelection( selectable, backwardSelectionOrOffset );
+			writer.setSelection( selectable, optionsOrPlaceOrOffset, options );
 		} );
 	}