8
0
Pārlūkot izejas kodu

Chagned: Removed Selection markers API.
Changed: Added MarkerCollection#getMarkersAtPosition.
Changed: Conversion uses MarkerCollection#getMarkersAtPosition instead of Selection#getMarkers.

Szymon Cofalik 8 gadi atpakaļ
vecāks
revīzija
17109bbd2c

+ 4 - 1
packages/ckeditor5-engine/src/controller/editingcontroller.js

@@ -101,7 +101,10 @@ export default class EditingController {
 
 		// Convert model selection to view.
 		this._listener.listenTo( this.model, 'changesDone', () => {
-			this.modelToView.convertSelection( model.selection );
+			const selection = model.selection;
+			const markers = Array.from( model.markers.getMarkersAtPosition( selection.getFirstPosition() ) );
+
+			this.modelToView.convertSelection( selection, markers );
 			this.view.render();
 		}, { priority: 'low' } );
 

+ 8 - 5
packages/ckeditor5-engine/src/conversion/model-selection-to-view-converters.js

@@ -149,7 +149,9 @@ export function convertSelectionAttribute( elementCreator ) {
 			elementCreator.clone( true ) :
 			elementCreator( data.value, data, data.selection, consumable, conversionApi );
 
-		convertSelectionPosition( data.selection, conversionApi.viewSelection, viewElement, consumable, 'selectionAttribute:' + data.key );
+		const consumableName = 'selectionAttribute:' + data.key;
+
+		wrapCollapsedSelectionPosition( data.selection, conversionApi.viewSelection, viewElement, consumable, consumableName );
 	};
 }
 
@@ -173,12 +175,14 @@ export function convertSelectionMarker( elementCreator ) {
 			elementCreator.clone( true ) :
 			elementCreator( data, consumable, conversionApi );
 
-		convertSelectionPosition( data.selection, conversionApi.viewSelection, viewElement, consumable, 'selectionMarker:' + data.name );
+		const consumableName = 'selectionMarker:' + data.name;
+
+		wrapCollapsedSelectionPosition( data.selection, conversionApi.viewSelection, viewElement, consumable, consumableName );
 	};
 }
 
 // Helper function for `convertSelectionAttribute` and `convertSelectionMarker`, which perform similar task.
-function convertSelectionPosition( modelSelection, viewSelection, viewElement, consumable, consumableName ) {
+function wrapCollapsedSelectionPosition( modelSelection, viewSelection, viewElement, consumable, consumableName ) {
 	if ( !modelSelection.isCollapsed ) {
 		return;
 	}
@@ -188,10 +192,9 @@ function convertSelectionPosition( modelSelection, viewSelection, viewElement, c
 	}
 
 	let viewPosition = viewSelection.getFirstPosition();
-	viewSelection.removeAllRanges();
-
 	viewPosition = viewWriter.wrapPosition( viewPosition, viewElement );
 
+	viewSelection.removeAllRanges();
 	viewSelection.addRange( new ViewRange( viewPosition, viewPosition ) );
 }
 

+ 11 - 9
packages/ckeditor5-engine/src/conversion/modelconversiondispatcher.js

@@ -308,20 +308,21 @@ export default class ModelConversionDispatcher {
 	 * @fires selection
 	 * @fires selectionAttribute
 	 * @param {module:engine/model/selection~Selection} selection Selection to convert.
+	 * @param {Array.<module:engine/model/markercollection~Marker>} markers Markers which contains selection.
 	 */
-	convertSelection( selection ) {
-		const consumable = this._createSelectionConsumable( selection );
+	convertSelection( selection, markers ) {
+		const consumable = this._createSelectionConsumable( selection, markers );
 
 		this.fire( 'selection', { selection }, consumable, this.conversionApi );
 
-		for ( let markerName of selection.getMarkers() ) {
+		for ( let marker of markers ) {
 			const data = {
 				selection: selection,
-				name: markerName
+				name: marker.name
 			};
 
-			if ( consumable.test( selection, 'selectionMarker:' + markerName ) ) {
-				this.fire( 'selectionMarker:' + markerName, data, consumable, this.conversionApi );
+			if ( consumable.test( selection, 'selectionMarker:' + marker.name ) ) {
+				this.fire( 'selectionMarker:' + marker.name, data, consumable, this.conversionApi );
 			}
 		}
 
@@ -408,15 +409,16 @@ export default class ModelConversionDispatcher {
 	 *
 	 * @private
 	 * @param {module:engine/model/selection~Selection} selection Selection to create consumable from.
+	 * @param {Iterable.<module:engine/model/markercollection~Marker>} markers Markers which contains selection.
 	 * @returns {module:engine/conversion/modelconsumable~ModelConsumable} Values to consume.
 	 */
-	_createSelectionConsumable( selection ) {
+	_createSelectionConsumable( selection, markers ) {
 		const consumable = new Consumable();
 
 		consumable.add( selection, 'selection' );
 
-		for ( let markerName of selection.getMarkers() ) {
-			consumable.add( selection, 'selectionMarker:' + markerName );
+		for ( let marker of markers ) {
+			consumable.add( selection, 'selectionMarker:' + marker.name );
 		}
 
 		for ( let key of selection.getAttributeKeys() ) {

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

@@ -236,7 +236,7 @@ export function stringify( node, selectionOrPositionOrRange = null ) {
 
 	// Convert model selection to view selection.
 	if ( selection ) {
-		modelToView.convertSelection( selection );
+		modelToView.convertSelection( selection, [] );
 	}
 
 	// Parse view to data string.

+ 7 - 55
packages/ckeditor5-engine/src/model/liveselection.js

@@ -33,8 +33,7 @@ const attrOpTypes = new Set(
  * * there is always a range in `LiveSelection` - even if no ranges were added there is a
  * {@link module:engine/model/liveselection~LiveSelection#_getDefaultRange "default range"} present in the selection,
  * * ranges added to this selection updates automatically when the document changes,
- * * attributes of `LiveSelection` are updated automatically according to selection ranges,
- * * markers containing `LiveSelection` are updated automatically according to selection ranges.
+ * * attributes of `LiveSelection` are updated automatically according to selection ranges.
  *
  * Since `LiveSelection` uses {@link module:engine/model/liverange~LiveRange live ranges}
  * and is updated when {@link module:engine/model/document~Document document}
@@ -74,36 +73,11 @@ export default class LiveSelection extends Selection {
 		 */
 		this._attributePriority = new Map();
 
-		/**
-		 * Keeps names of markers in which selection is placed.
-		 *
-		 * @private
-		 * @member {Set} module:engine/model/liveselection~LiveSelection#_markers
-		 */
-		this._markers = new Set();
-
-		// Whenever attribute operation is performed on document, update attributes and markers that contains this selection.
+		// Whenever attribute operation is performed on document, update selection attributes.
 		// This is not the most efficient way to update selection attributes, but should be okay for now.
 		this.listenTo( this._document, 'change', ( evt, type ) => {
 			if ( attrOpTypes.has( type ) ) {
 				this._updateAttributes( false );
-			} else if ( type == 'move' ) {
-				// The only case when `LiveSelection` range may end up in marker after document change
-				// is when the document fragment containing selection is moved into (or outside of) a marker.
-				this._updateMarkers();
-			}
-		} );
-
-		// Whenever marker is added or removed, update list of markers that contains this selection.
-		this.listenTo( this._document.markers, 'add', ( evt, marker ) => {
-			if ( marker.getRange().containsPosition( this.getFirstPosition() ) ) {
-				this.addMarker( marker.name );
-			}
-		} );
-
-		this.listenTo( this._document.markers, 'remove', ( evt, marker ) => {
-			if ( marker.getRange().containsPosition( this.getFirstPosition() ) ) {
-				this.removeMarker( marker.name );
 			}
 		} );
 	}
@@ -179,7 +153,7 @@ export default class LiveSelection extends Selection {
 	 */
 	addRange( range, isBackward = false ) {
 		super.addRange( range, isBackward );
-		this.refresh();
+		this.refreshAttributes();
 	}
 
 	/**
@@ -187,7 +161,7 @@ export default class LiveSelection extends Selection {
 	 */
 	removeAllRanges() {
 		super.removeAllRanges();
-		this.refresh();
+		this.refreshAttributes();
 	}
 
 	/**
@@ -195,7 +169,7 @@ export default class LiveSelection extends Selection {
 	 */
 	setRanges( newRanges, isLastBackward = false ) {
 		super.setRanges( newRanges, isLastBackward );
-		this.refresh();
+		this.refreshAttributes();
 	}
 
 	/**
@@ -257,12 +231,10 @@ export default class LiveSelection extends Selection {
 	}
 
 	/**
-	 * Removes all attributes from the selection and sets attributes according to the surrounding nodes. Refreshes list
-	 * of names of markers containing this selection.
+	 * Removes all attributes from the selection and sets attributes according to the surrounding nodes.
 	 */
-	refresh() {
+	refreshAttributes() {
 		this._updateAttributes( true );
-		this._updateMarkers();
 	}
 
 	/**
@@ -393,26 +365,6 @@ export default class LiveSelection extends Selection {
 	}
 
 	/**
-	 * Updates list of markers which contains this selection.
-	 *
-	 * A marker contains this selection if {@link module:engine/model/selection~Selection#getFirstPosition first position}
-	 * is inside that marker range.
-	 *
-	 * @protected
-	 */
-	_updateMarkers() {
-		this.clearMarkers();
-
-		const pos = this.getFirstPosition();
-
-		for ( let marker of this._document.markers ) {
-			if ( marker.getRange().containsPosition( pos ) ) {
-				this.addMarker( marker.name );
-			}
-		}
-	}
-
-	/**
 	 * Generates and returns an attribute key for selection attributes store, basing on original attribute key.
 	 *
 	 * @protected

+ 14 - 0
packages/ckeditor5-engine/src/model/markercollection.js

@@ -116,6 +116,20 @@ export default class MarkerCollection {
 	}
 
 	/**
+	 * Returns iterator that iterates over all markers, which ranges contain given {@link module:engine/model/position~Position position}.
+	 *
+	 * @param {module:engine/model/position~Position} position
+	 * @returns {Iterator.<~Marker>}
+	 */
+	*getMarkersAtPosition( position ) {
+		for ( let marker of this ) {
+			if ( marker.getRange().containsPosition( position ) ) {
+				yield marker;
+			}
+		}
+	}
+
+	/**
 	 * Destroys markers collection.
 	 */
 	destroy() {

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

@@ -49,14 +49,6 @@ export default class Selection {
 		 * @member {Map} module:engine/model/selection~Selection#_attrs
 		 */
 		this._attrs = new Map();
-
-		/**
-		 * List of markers in which the current selection is placed.
-		 *
-		 * @protected
-		 * @member {Set} module:engine/model/selection~Selection#_markers
-		 */
-		this._markers = new Set();
 	}
 
 	/**
@@ -551,45 +543,6 @@ export default class Selection {
 	}
 
 	/**
-	 * Returns iterator that iterates over names of all markers which contain this selection.
-	 *
-	 * **Note:** In case of `Selection`, you have to manage list of those markers on your own. Use {@link ~addMarker},
-	 * {@link ~removeMarker} and {@link ~clearMarkers} methods. {@link module:engine/model/liveselection~LiveSelection LiveSelection}
-	 * manages list of those markers on it's own.
-	 *
-	 * @returns {Iterator.<String>}
-	 */
-	getMarkers() {
-		return this._markers.values();
-	}
-
-	/**
-	 * Adds name of a marker which contains this selection.
-	 *
-	 * @param {String} markerName Marker name to add.
-	 */
-	addMarker( markerName ) {
-		this._markers.add( markerName );
-	}
-
-	/**
-	 * Removes name of a marker from the list of markers which contains this selection.
-	 *
-	 * @param {String} markerName Marker name to remove.
-	 * @returns {Boolean} `true` if marker name was on the list and was removed, `false` otherwise.
-	 */
-	removeMarker( markerName ) {
-		return this._markers.delete( markerName );
-	}
-
-	/**
-	 * Removes all names from the list of markers which contains this selection.
-	 */
-	clearMarkers() {
-		this._markers.clear();
-	}
-
-	/**
 	 * Returns the selected element. {@link module:engine/model/element~Element Element} is considered as selected if there is only
 	 * one range in the selection, and that range contains exactly one element.
 	 * Returns `null` if there is no selected element.

+ 4 - 4
packages/ckeditor5-engine/tests/conversion/buildmodelconverter.js

@@ -212,7 +212,7 @@ describe( 'Model converter builder', () => {
 
 			// Convert stuff.
 			dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
-			dispatcher.convertSelection( modelDoc.selection );
+			dispatcher.convertSelection( modelDoc.selection, [] );
 
 			// Check if view structure is ok.
 			expect( viewToString( viewRoot ) ).to.equal( '<div><em>foo</em></div>' );
@@ -226,7 +226,7 @@ describe( 'Model converter builder', () => {
 
 			// Change selection attribute, convert it.
 			modelDoc.selection.setAttribute( 'italic', 'i' );
-			dispatcher.convertSelection( modelDoc.selection );
+			dispatcher.convertSelection( modelDoc.selection, [] );
 
 			// Check if view structure has changed.
 			expect( viewToString( viewRoot ) ).to.equal( '<div><em>f</em><i></i><em>oo</em></div>' );
@@ -240,7 +240,7 @@ describe( 'Model converter builder', () => {
 
 			// Some more tests checking how selection attributes changes are converted:
 			modelDoc.selection.removeAttribute( 'italic' );
-			dispatcher.convertSelection( modelDoc.selection );
+			dispatcher.convertSelection( modelDoc.selection, [] );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><em>f</em><em>oo</em></div>' );
 			ranges = Array.from( viewSelection.getRanges() );
@@ -248,7 +248,7 @@ describe( 'Model converter builder', () => {
 			expect( ranges[ 0 ].start.offset ).to.equal( 1 );
 
 			modelDoc.selection.setAttribute( 'italic', 'em' );
-			dispatcher.convertSelection( modelDoc.selection );
+			dispatcher.convertSelection( modelDoc.selection, [] );
 
 			expect( viewToString( viewRoot ) ).to.equal( '<div><em>foo</em></div>' );
 			ranges = Array.from( viewSelection.getRanges() );

+ 16 - 10
packages/ckeditor5-engine/tests/conversion/model-selection-to-view-converters.js

@@ -223,7 +223,7 @@ describe( 'model-selection-to-view-converters', () => {
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
 				// Update selection attributes according to model.
-				modelSelection.refresh();
+				modelSelection.refreshAttributes();
 
 				// Remove view children manually (without firing additional conversion).
 				viewRoot.removeChildren( 0, viewRoot.childCount );
@@ -231,7 +231,9 @@ describe( 'model-selection-to-view-converters', () => {
 				// Convert model to view.
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
-				dispatcher.convertSelection( modelSelection );
+
+				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
 				expect( stringifyView( viewRoot, viewSelection, { showType: false } ) )
@@ -245,7 +247,7 @@ describe( 'model-selection-to-view-converters', () => {
 				modelSelection.setRanges( [ new ModelRange( ModelPosition.createAt( modelRoot, 3 ) ) ] );
 
 				// Update selection attributes according to model.
-				modelSelection.refresh();
+				modelSelection.refreshAttributes();
 
 				modelSelection.removeAttribute( 'bold' );
 
@@ -255,7 +257,9 @@ describe( 'model-selection-to-view-converters', () => {
 				// Convert model to view.
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
-				dispatcher.convertSelection( modelSelection );
+
+				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
 				expect( stringifyView( viewRoot, viewSelection, { showType: false } ) )
@@ -278,7 +282,9 @@ describe( 'model-selection-to-view-converters', () => {
 				// Convert model to view.
 				dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
 				dispatcher.convertMarker( 'addMarker', marker.name, marker.getRange() );
-				dispatcher.convertSelection( modelSelection );
+
+				const markers = Array.from( modelDoc.markers.getMarkersAtPosition( modelSelection.getFirstPosition() ) );
+				dispatcher.convertSelection( modelSelection, markers );
 
 				// Stringify view and check if it is same as expected.
 				expect( stringifyView( viewRoot, viewSelection, { showType: false } ) )
@@ -358,7 +364,7 @@ describe( 'model-selection-to-view-converters', () => {
 				const modelRange = ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 1 );
 				modelDoc.selection.setRanges( [ modelRange ] );
 
-				dispatcher.convertSelection( modelDoc.selection );
+				dispatcher.convertSelection( modelDoc.selection, [] );
 
 				expect( viewSelection.rangeCount ).to.equal( 1 );
 
@@ -383,7 +389,7 @@ describe( 'model-selection-to-view-converters', () => {
 				const modelRange = ModelRange.createFromParentsAndOffsets( modelRoot, 1, modelRoot, 1 );
 				modelDoc.selection.setRanges( [ modelRange ] );
 
-				dispatcher.convertSelection( modelDoc.selection );
+				dispatcher.convertSelection( modelDoc.selection, [] );
 
 				expect( viewSelection.rangeCount ).to.equal( 1 );
 
@@ -397,7 +403,7 @@ describe( 'model-selection-to-view-converters', () => {
 				dispatcher.on( 'selection', clearFakeSelection() );
 				viewSelection.setFake( true );
 
-				dispatcher.convertSelection( modelSelection );
+				dispatcher.convertSelection( modelSelection, [] );
 
 				expect( viewSelection.isFake ).to.be.false;
 			} );
@@ -585,7 +591,7 @@ describe( 'model-selection-to-view-converters', () => {
 		modelSelection.setRanges( [ new ModelRange( startPos, endPos ) ], isBackward );
 
 		// Update selection attributes according to model.
-		modelSelection.refresh();
+		modelSelection.refreshAttributes();
 
 		// And add or remove passed attributes.
 		for ( let key in selectionAttributes ) {
@@ -603,7 +609,7 @@ describe( 'model-selection-to-view-converters', () => {
 
 		// Convert model to view.
 		dispatcher.convertInsertion( ModelRange.createIn( modelRoot ) );
-		dispatcher.convertSelection( modelSelection );
+		dispatcher.convertSelection( modelSelection, [] );
 
 		// Stringify view and check if it is same as expected.
 		expect( stringifyView( viewRoot, viewSelection, { showType: false } ) ).to.equal( '<div>' + expectedView + '</div>' );

+ 9 - 6
packages/ckeditor5-engine/tests/conversion/modelconversiondispatcher.js

@@ -447,7 +447,7 @@ describe( 'ModelConversionDispatcher', () => {
 		it( 'should fire selection event', () => {
 			sinon.spy( dispatcher, 'fire' );
 
-			dispatcher.convertSelection( doc.selection );
+			dispatcher.convertSelection( doc.selection, [] );
 
 			expect( dispatcher.fire.calledWith(
 				'selection',
@@ -468,7 +468,7 @@ describe( 'ModelConversionDispatcher', () => {
 				expect( consumable.test( data.selection, 'selectionAttribute:italic' ) ).to.be.null;
 			} );
 
-			dispatcher.convertSelection( doc.selection );
+			dispatcher.convertSelection( doc.selection, [] );
 		} );
 
 		it( 'should fire attributes events for selection', () => {
@@ -480,7 +480,7 @@ describe( 'ModelConversionDispatcher', () => {
 					.setAttribute( ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ), 'italic', true );
 			} );
 
-			dispatcher.convertSelection( doc.selection );
+			dispatcher.convertSelection( doc.selection, [] );
 
 			expect( dispatcher.fire.calledWith( 'selectionAttribute:bold' ) ).to.be.true;
 			expect( dispatcher.fire.calledWith( 'selectionAttribute:italic' ) ).to.be.false;
@@ -499,7 +499,7 @@ describe( 'ModelConversionDispatcher', () => {
 					.setAttribute( ModelRange.createFromParentsAndOffsets( root, 4, root, 5 ), 'italic', true );
 			} );
 
-			dispatcher.convertSelection( doc.selection );
+			dispatcher.convertSelection( doc.selection, [] );
 
 			expect( dispatcher.fire.calledWith( 'selectionAttribute:bold' ) ).to.be.false;
 		} );
@@ -509,7 +509,8 @@ describe( 'ModelConversionDispatcher', () => {
 
 			sinon.spy( dispatcher, 'fire' );
 
-			dispatcher.convertSelection( doc.selection );
+			const markers = Array.from( doc.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
+			dispatcher.convertSelection( doc.selection, markers );
 
 			expect( dispatcher.fire.calledWith( 'selectionMarker:name' ) ).to.be.true;
 		} );
@@ -524,8 +525,10 @@ describe( 'ModelConversionDispatcher', () => {
 				consumable.consume( data.selection, 'selectionMarker:bar' );
 			} );
 
-			dispatcher.convertSelection( doc.selection );
+			const markers = Array.from( doc.markers.getMarkersAtPosition( doc.selection.getFirstPosition() ) );
+			dispatcher.convertSelection( doc.selection, markers );
 
+			expect( dispatcher.fire.calledWith( 'selectionMarker:foo' ) ).to.be.true;
 			expect( dispatcher.fire.calledWith( 'selectionMarker:bar' ) ).to.be.false;
 		} );
 	} );

+ 0 - 46
packages/ckeditor5-engine/tests/model/liveselection.js

@@ -790,52 +790,6 @@ describe( 'LiveSelection', () => {
 		} );
 	} );
 
-	describe( 'update list of names of markers that contain selection', () => {
-		it( 'on range change', () => {
-			doc.markers.set( 'name', Range.createFromParentsAndOffsets( root, 1, root, 4 ) );
-			doc.markers.set( 'name2', Range.createFromParentsAndOffsets( root, 4, root, 5 ) );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-
-			selection.setRanges( [ new Range( new Position( root, [ 2, 3 ] ) ) ] );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [ 'name' ] );
-
-			selection.setRanges( [ new Range( new Position( root, [ 0 ] ) ) ] );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-		} );
-
-		it( 'on marker change', () => {
-			selection.setRanges( [ new Range( new Position( root, [ 2, 3 ] ) ) ] );
-
-			doc.markers.set( 'name', Range.createFromParentsAndOffsets( root, 1, root, 4 ) );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [ 'name' ] );
-
-			doc.markers.remove( 'name' );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-		} );
-
-		it( 'on document change', () => {
-			doc.markers.set( 'name', Range.createFromParentsAndOffsets( root, 3, root, 5 ) );
-			selection.setRanges( [ new Range( new Position( root, [ 2, 3 ] ) ) ] );
-
-			doc.enqueueChanges( () => {
-				doc.batch().move( root.getChild( 2 ), Position.createAt( root, 4 ) );
-			} );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [ 'name' ] );
-
-			doc.enqueueChanges( () => {
-				doc.batch().move( root.getChild( 3 ), Position.createAt( root, 0 ) );
-			} );
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-		} );
-	} );
-
 	describe( '_getStoredAttributes', () => {
 		it( 'should return no values if there are no ranges in selection', () => {
 			let values = Array.from( selection._getStoredAttributes() );

+ 11 - 0
packages/ckeditor5-engine/tests/model/markercollection.js

@@ -167,6 +167,17 @@ describe( 'MarkerCollection', () => {
 		} );
 	} );
 
+	describe( 'getMarkersAtPosition', () => {
+		it( 'should return iterator iterating over all markers that contains given position', () => {
+			markers.set( 'a', range );
+			const markerB = markers.set( 'b', range2 );
+
+			const result = Array.from( markers.getMarkersAtPosition( Position.createAt( root, 1 ) ) );
+
+			expect( result ).to.deep.equal( [ markerB ] );
+		} );
+	} );
+
 	describe( 'destroy', () => {
 		it( 'should make MarkerCollection stop listening to all events and destroy all markers', () => {
 			const markerA = markers.set( 'a', range );

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

@@ -987,50 +987,6 @@ describe( 'Selection', () => {
 		} );
 	} );
 
-	describe( 'markers interface', () => {
-		it( 'getMarkers should not iterate over anything if no markers were added', () => {
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-		} );
-
-		it( 'addMarker should add marker name to the list of markers containing selection', () => {
-			selection.addMarker( 'name' );
-			selection.addMarker( 'name2' );
-			selection.addMarker( 'name' ); // Duplicates should be filtered.
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [ 'name', 'name2' ] );
-		} );
-
-		it( 'removeMarker should remove marker name from the list of markers containing selection', () => {
-			let result;
-
-			selection.addMarker( 'name' );
-			selection.addMarker( 'name2' );
-
-			result = selection.removeMarker( 'name' );
-
-			expect( result ).to.be.true;
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [ 'name2' ] );
-
-			result = selection.removeMarker( 'name2' );
-
-			expect( result ).to.be.true;
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-
-			result = selection.removeMarker( 'name2' );
-
-			expect( result ).to.be.false;
-		} );
-
-		it( 'clearMarkers should remove all marker names from the list of markers containing selection', () => {
-			selection.addMarker( 'name' );
-			selection.addMarker( 'name2' );
-
-			selection.clearMarkers();
-
-			expect( Array.from( selection.getMarkers() ) ).to.deep.equal( [] );
-		} );
-	} );
-
 	describe( 'getSelectedElement', () => {
 		let schema;