浏览代码

Changed: deleteContents uses RemoveDelta when merged element is empty.

Szymon Cofalik 9 年之前
父节点
当前提交
44ec00bc11

+ 8 - 1
packages/ckeditor5-engine/src/model/composer/deletecontents.js

@@ -52,7 +52,14 @@ export default function deleteContents( batch, selection, options = {} ) {
 				const mergePath = startPos.path.slice( 0, mergeDepth );
 				mergePath.push( startPos.path[ mergeDepth ] + 1 );
 
-				batch.merge( new Position( endPos.root, mergePath ) );
+				const mergePos = new Position( endPos.root, mergePath );
+				const nextNode = mergePos.nodeAfter;
+
+				if ( nextNode.childCount > 0 ) {
+					batch.merge( mergePos );
+				} else {
+					batch.remove( nextNode );
+				}
 			}
 		}
 	}

+ 15 - 0
packages/ckeditor5-engine/tests/model/composer/deletecontents.js

@@ -266,6 +266,21 @@ describe( 'Delete utils', () => {
 				'<heading1>[]</heading1>',
 				{ merge: true }
 			);
+
+			it( 'uses remove delta instead of merge delta if merged element is empty', () => {
+				setData( doc, '<paragraph>ab[cd</paragraph><paragraph>efgh]</paragraph>' );
+
+				const batch = doc.batch();
+				const spyMerge = sinon.spy( batch, 'merge' );
+				const spyRemove = sinon.spy( batch, 'remove' );
+
+				deleteContents( batch, doc.selection, { merge: true } );
+
+				expect( getData( doc ) ).to.equal( '<paragraph>ab[]</paragraph>' );
+
+				expect( spyMerge.called ).to.be.false;
+				expect( spyRemove.called ).to.be.true;
+			} );
 		} );
 
 		describe( 'in element selections scenarios', () => {