Răsfoiți Sursa

Merge branch 'master' into t/ckeditor5/447

Piotrek Koszuliński 8 ani în urmă
părinte
comite
cdfd123b04

+ 4 - 2
packages/ckeditor5-list/src/converters.js

@@ -102,8 +102,10 @@ export function modelViewRemove( evt, data, consumable, conversionApi ) {
 		return;
 	}
 
-	const viewPosition = conversionApi.mapper.toViewPosition( data.sourcePosition );
-	const viewItem = viewPosition.nodeAfter.is( 'li' ) ? viewPosition.nodeAfter : viewPosition.nodeAfter.getChild( 0 );
+	let viewPosition = conversionApi.mapper.toViewPosition( data.sourcePosition );
+	viewPosition = viewPosition.getLastMatchingPosition( value => !value.item.is( 'li' ) );
+
+	const viewItem = viewPosition.nodeAfter;
 
 	// 1. Break the container after and before the list item.
 	// This will create a view list with one view list item -- the one that changed type.

+ 64 - 16
packages/ckeditor5-list/tests/listengine.js

@@ -3046,14 +3046,16 @@ describe( 'ListEngine', () => {
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			editor.data.insertContent(
-				parseModel(
-					'<listItem type="bulleted" indent="0">X</listItem>' +
-					'<listItem type="bulleted" indent="1">Y</listItem>',
-					modelDoc.schema
-				),
-				modelDoc.selection
-			);
+			modelDoc.enqueueChanges( () => {
+				editor.data.insertContent(
+					parseModel(
+						'<listItem type="bulleted" indent="0">X</listItem>' +
+						'<listItem type="bulleted" indent="1">Y</listItem>',
+						modelDoc.schema
+					),
+					modelDoc.selection
+				);
+			} );
 
 			expect( getModelData( modelDoc ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
@@ -3071,10 +3073,12 @@ describe( 'ListEngine', () => {
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			editor.data.insertContent(
-				new ModelElement( 'listItem', { type: 'bulleted', indent: '0' }, 'X' ),
-				modelDoc.selection
-			);
+			modelDoc.enqueueChanges( () => {
+				editor.data.insertContent(
+					new ModelElement( 'listItem', { type: 'bulleted', indent: '0' }, 'X' ),
+					modelDoc.selection
+				);
+			} );
 
 			expect( getModelData( modelDoc ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
@@ -3091,10 +3095,12 @@ describe( 'ListEngine', () => {
 				'<listItem type="bulleted" indent="2">C</listItem>'
 			);
 
-			editor.data.insertContent(
-				new ModelText( 'X' ),
-				modelDoc.selection
-			);
+			modelDoc.enqueueChanges( () => {
+				editor.data.insertContent(
+					new ModelText( 'X' ),
+					modelDoc.selection
+				);
+			} );
 
 			expect( getModelData( modelDoc ) ).to.equal(
 				'<listItem indent="0" type="bulleted">A</listItem>' +
@@ -3345,6 +3351,48 @@ describe( 'ListEngine', () => {
 			expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
 				.to.equal( '<ul><li>Foo<span></span><ul><li>Xxx</li><li>Yyy</li></ul></li></ul>' );
 		} );
+
+		describe( 'remove converter should properly handle ui elements', () => {
+			let uiElement, liFoo, liBar;
+
+			beforeEach( () => {
+				editor.setData( '<ul><li>Foo</li><li>Bar</li></ul>' );
+				liFoo = modelRoot.getChild( 0 );
+				liBar = modelRoot.getChild( 1 );
+
+				uiElement = new ViewUIElement( 'span' );
+			} );
+
+			it( 'ui element before <ul>', () => {
+				// Append ui element before <ul>.
+				viewRoot.insertChildren( 0, [ uiElement ] );
+
+				modelDoc.batch().remove( liFoo );
+
+				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
+					.to.equal( '<span></span><ul><li>Bar</li></ul>' );
+			} );
+
+			it( 'ui element before first <li>', () => {
+				// Append ui element before <ul>.
+				viewRoot.getChild( 0 ).insertChildren( 0, [ uiElement ] );
+
+				modelDoc.batch().remove( liFoo );
+
+				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
+					.to.equal( '<ul><span></span><li>Bar</li></ul>' );
+			} );
+
+			it( 'ui element in the middle of list', () => {
+				// Append ui element before <ul>.
+				viewRoot.getChild( 0 ).insertChildren( 1, [ uiElement ] );
+
+				modelDoc.batch().remove( liBar );
+
+				expect( getViewData( editor.editing.view, { withoutSelection: true } ) )
+					.to.equal( '<ul><li>Foo</li><span></span></ul>' );
+			} );
+		} );
 	} );
 
 	function getViewPosition( root, path ) {