소스 검색

Enable commands when selection touches the marker range.

Maciej Gołaszewski 6 년 전
부모
커밋
82eac667ff

+ 15 - 4
packages/ckeditor5-restricted-editing/src/restrictededitingediting.js

@@ -66,16 +66,15 @@ export default class RestrictedEditingEditing extends Plugin {
 		const selection = editor.model.document.selection;
 
 		this.listenTo( selection, 'change', () => {
-			if ( !selection.isCollapsed ) {
+			if ( selection.rangeCount > 1 ) {
 				this._disableCommands( editor );
 
 				return;
 			}
 
-			const marker = Array.from( editor.model.markers.getMarkersAtPosition( selection.focus ) )
-				.find( marker => marker.name.startsWith( 'restricted-editing-exception:' ) );
+			const marker = this._getMarker( editor, selection );
 
-			if ( !marker ) {
+			if ( !marker || !marker.getRange().containsRange( selection.getFirstRange(), true ) ) {
 				this._disableCommands( editor );
 
 				return;
@@ -85,6 +84,18 @@ export default class RestrictedEditingEditing extends Plugin {
 		} );
 	}
 
+	_getMarker( editor, selection ) {
+		for ( const marker of this.editor.model.markers ) {
+			const markerRange = marker.getRange();
+
+			if ( markerRange.containsPosition( selection.focus ) || markerRange.end.isEqual( selection.focus ) ) {
+				if ( marker.name.startsWith( 'restricted-editing-exception:' ) ) {
+					return marker;
+				}
+			}
+		}
+	}
+
 	_enableCommands( editor ) {
 		const commands = this._getCommandsToToggle( editor, this._allowedInException );
 

+ 44 - 0
packages/ckeditor5-restricted-editing/tests/restrictededitingediting.js

@@ -301,6 +301,50 @@ describe( 'RestrictedEditingEditing', () => {
 
 				expect( editor.commands.get( 'input' ).isEnabled ).to.be.false;
 			} );
+
+			it( 'should be enabled for non-collapsed selection that is fully contained inside exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 5 ),
+						writer.createPositionAt( firstParagraph, 6 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'input' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection inside exception marker (start position on marker boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 4 ),
+						writer.createPositionAt( firstParagraph, 6 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'input' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection inside exception marker (end position on marker boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 5 ),
+						writer.createPositionAt( firstParagraph, 7 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'input' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled for non-collapsed selection is equal to exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 4 ),
+						writer.createPositionAt( firstParagraph, 7 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'input' ).isEnabled ).to.be.true;
+			} );
 		} );
 
 		describe( 'bold', () => {