Sfoglia il codice sorgente

Merge pull request #1707 from ckeditor/t/1706

Fix: Model#deleteContent will not throw anymore if the passed selection is in the graveyard root. Closes #1706.
Piotrek Koszuliński 6 anni fa
parent
commit
8b4cc05353

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

@@ -60,6 +60,13 @@ export default function deleteContent( model, selection, options = {} ) {
 		return;
 	}
 
+	const selRange = selection.getFirstRange();
+
+	// If the selection is already removed, don't do anything.
+	if ( selRange.root.rootName == '$graveyard' ) {
+		return;
+	}
+
 	const schema = model.schema;
 
 	model.change( writer => {
@@ -71,7 +78,6 @@ export default function deleteContent( model, selection, options = {} ) {
 			return;
 		}
 
-		const selRange = selection.getFirstRange();
 		const startPos = selRange.start;
 		const endPos = LivePosition.fromPosition( selRange.end, 'toNext' );
 

+ 23 - 0
packages/ckeditor5-engine/tests/model/utils/deletecontent.js

@@ -29,6 +29,29 @@ describe( 'DataController utils', () => {
 			} );
 		} );
 
+		it( 'should not do anything if the selection is already in graveyard', () => {
+			model = new Model();
+			doc = model.document;
+
+			const gy = model.document.graveyard;
+
+			gy._appendChild( new Element( 'paragraph' ) );
+
+			const baseVersion = model.document.baseVersion;
+
+			model.change( writer => {
+				sinon.spy( writer, 'remove' );
+
+				const selection = writer.createSelection( writer.createRangeIn( gy ) );
+
+				deleteContent( model, selection );
+
+				expect( writer.remove.called ).to.be.false;
+			} );
+
+			expect( model.document.baseVersion ).to.equal( baseVersion );
+		} );
+
 		describe( 'in simple scenarios', () => {
 			beforeEach( () => {
 				model = new Model();