Bladeren bron

Disable forwardDelete on exception end.

Maciej Gołaszewski 6 jaren geleden
bovenliggende
commit
be30a7d0fe

+ 11 - 2
packages/ckeditor5-restricted-editing/src/restrictededitingediting.js

@@ -28,7 +28,7 @@ export default class RestrictedEditingEditing extends Plugin {
 		super( editor );
 
 		this._alwaysEnabled = new Set( [ 'undo', 'redo' ] );
-		this._allowedInException = new Set( [ 'bold', 'italic', 'link', 'input', 'delete' ] );
+		this._allowedInException = new Set( [ 'bold', 'italic', 'link', 'input', 'delete', 'forwardDelete' ] );
 	}
 
 	/**
@@ -102,7 +102,16 @@ export default class RestrictedEditingEditing extends Plugin {
 		const commands = this._getCommandNamesToToggle( editor, this._allowedInException )
 			.filter( name => this._allowedInException.has( name ) )
 			.filter( name => {
-				if ( name == 'delete' && marker.getRange().start.isEqual( editor.model.document.selection.focus ) ) {
+				const selection = editor.model.document.selection;
+				const markerRange = marker.getRange();
+
+				if ( name == 'delete' && markerRange.start.isEqual( selection.focus ) ) {
+					exceptionDisable.push( name );
+
+					return false;
+				}
+
+				if ( name == 'forwardDelete' && selection.isCollapsed && markerRange.end.isEqual( selection.focus ) ) {
 					exceptionDisable.push( name );
 
 					return false;

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

@@ -462,6 +462,99 @@ describe( 'RestrictedEditingEditing', () => {
 			} );
 		} );
 
+		describe( 'forwardDelete', () => {
+			beforeEach( () => {
+				editor.commands.add( 'forwardDelete', buildFakeCommand( editor ) );
+			} );
+
+			it( 'should be disabled when caret is outside exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 1 );
+				} );
+
+				expect( editor.commands.get( 'forwardDelete' ).isEnabled ).to.be.false;
+			} );
+
+			it( 'should be enabled when caret is inside exception marker (not touching boundaries)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 5 );
+				} );
+
+				expect( editor.commands.get( 'forwardDelete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be enabled when caret is inside exception marker (start boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 4 );
+				} );
+
+				expect( editor.commands.get( 'forwardDelete' ).isEnabled ).to.be.true;
+			} );
+
+			it( 'should be disabled when caret is inside exception marker (end boundary)', () => {
+				model.change( writer => {
+					writer.setSelection( firstParagraph, 7 );
+				} );
+
+				expect( editor.commands.get( 'forwardDelete' ).isEnabled ).to.be.false;
+			} );
+
+			it( 'should be disabled for non-collapsed selection that expands over exception marker', () => {
+				model.change( writer => {
+					writer.setSelection( writer.createRange(
+						writer.createPositionAt( firstParagraph, 0 ),
+						writer.createPositionAt( firstParagraph, 5 )
+					) );
+				} );
+
+				expect( editor.commands.get( 'forwardDelete' ).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( 'forwardDelete' ).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( 'forwardDelete' ).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( 'forwardDelete' ).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( 'forwardDelete' ).isEnabled ).to.be.true;
+			} );
+		} );
+
 		describe( 'other', () => {
 			beforeEach( () => {
 				editor.commands.add( 'other', buildFakeCommand( editor ) );