Procházet zdrojové kódy

Modify selection before removing content.

Maciej Gołaszewski před 6 roky
rodič
revize
4d106eacaf

+ 18 - 0
packages/ckeditor5-restricted-editing/src/restrictededitingmodeediting.js

@@ -162,6 +162,24 @@ export default class RestrictedEditingModeEditing extends Plugin {
 		doc.registerPostFixer( extendMarkerOnTypingPostFixer( editor ) );
 		doc.registerPostFixer( resurrectCollapsedMarkerPostFixer( editor ) );
 
+		editor.model.on( 'deleteContent', ( evt, args ) => {
+			// console.log( 'bofore:deleteContent', evt.stop() );
+			const [ selection, ] = args;
+
+			const marker = getMarkerAtPosition( editor, selection.focus ) || getMarkerAtPosition( editor, selection.anchor );
+
+			if ( !marker ) {
+				evt.stop();
+				return;
+			}
+
+			const intersection = marker.getRange().getIntersection( selection.getFirstRange() );
+
+			const allowedToDelete = model.createSelection( intersection );
+
+			args.splice( 0, 1, allowedToDelete );
+		}, { priority: 'high' } );
+
 		setupExceptionHighlighting( editor );
 	}
 

+ 37 - 1
packages/ckeditor5-restricted-editing/tests/restrictededitingmodeediting.js

@@ -19,7 +19,7 @@ import RestrictedEditingModeEditing from './../src/restrictededitingmodeediting'
 import RestrictedEditingModeNavigationCommand from '../src/restrictededitingmodenavigationcommand';
 
 describe( 'RestrictedEditingModeEditing', () => {
-	let editor;
+	let editor, model;
 
 	testUtils.createSinonSandbox();
 
@@ -348,6 +348,32 @@ describe( 'RestrictedEditingModeEditing', () => {
 		} );
 	} );
 
+	describe.only( 'post-fixer', () => {
+		beforeEach( async () => {
+			editor = await VirtualTestEditor.create( { plugins: [ Paragraph, Typing, RestrictedEditingModeEditing ] } );
+			model = editor.model;
+		} );
+
+		afterEach( () => {
+			return editor.destroy();
+		} );
+
+		it( 'should not allow to change text outside restricted area', () => {
+			setModelData( model, '<paragraph>[]foofoo bar baz</paragraph>' );
+			const firstParagraph = model.document.getRoot().getChild( 0 );
+
+			addExceptionMarker( 3, 9, firstParagraph );
+
+			model.change( writer => {
+				writer.setSelection( firstParagraph, 6 );
+			} );
+
+			editor.execute( 'delete', { unit: 'word' } );
+
+			assertEqualMarkup( getModelData( model ), '<paragraph>foo[] bar baz</paragraph>' );
+		} );
+	} );
+
 	describe( 'clipboard', () => {
 		let model, viewDoc;
 
@@ -873,4 +899,14 @@ describe( 'RestrictedEditingModeEditing', () => {
 			sinon.assert.calledOnce( domEvtDataStub.stopPropagation );
 		} );
 	} );
+
+	function addExceptionMarker( start, end = start, parent, id = 1 ) {
+		model.change( writer => {
+			writer.addMarker( `restrictedEditingException:${ id }`, {
+				range: writer.createRange( writer.createPositionAt( parent, start ), writer.createPositionAt( parent, end ) ),
+				usingOperation: true,
+				affectsData: true
+			} );
+		} );
+	}
 } );