8
0
Просмотр исходного кода

Handle all model items in insertContent listener.

Piotrek Koszuliński 8 лет назад
Родитель
Сommit
f8caf61057
2 измененных файлов с 70 добавлено и 2 удалено
  1. 3 1
      packages/ckeditor5-list/src/converters.js
  2. 67 1
      packages/ckeditor5-list/tests/listengine.js

+ 3 - 1
packages/ckeditor5-list/src/converters.js

@@ -726,7 +726,9 @@ export function modelIndentPasteFixer( evt, [ content, selection ] ) {
 	// Check whether inserted content starts from a `listItem`. If it does not, it means that there are some other
 	// Check whether inserted content starts from a `listItem`. If it does not, it means that there are some other
 	// elements before it and there is no need to fix indents, because even if we insert that content into a list,
 	// elements before it and there is no need to fix indents, because even if we insert that content into a list,
 	// that list will be broken.
 	// that list will be broken.
-	let item = content.getChild( 0 );
+	// Note: we also need to handle singular elements because inserting item with indent 0 into 0,1,[],2
+	// would create incorrect model.
+	let item = content.is( 'documentFragment' ) ? content.getChild( 0 ) : content;
 
 
 	if ( item.is( 'listItem' ) ) {
 	if ( item.is( 'listItem' ) ) {
 		// Get a reference list item. Inserted list items will be fixed according to that item.
 		// Get a reference list item. Inserted list items will be fixed according to that item.

+ 67 - 1
packages/ckeditor5-list/tests/listengine.js

@@ -8,6 +8,8 @@ import ListCommand from '../src/listcommand';
 
 
 import ModelDocumentFragment from '@ckeditor/ckeditor5-engine/src/model/documentfragment';
 import ModelDocumentFragment from '@ckeditor/ckeditor5-engine/src/model/documentfragment';
 import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
 import ModelPosition from '@ckeditor/ckeditor5-engine/src/model/position';
+import ModelElement from '@ckeditor/ckeditor5-engine/src/model/element';
+import ModelText from '@ckeditor/ckeditor5-engine/src/model/text';
 import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 import ViewPosition from '@ckeditor/ckeditor5-engine/src/view/position';
 
 
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 import Paragraph from '@ckeditor/ckeditor5-paragraph/src/paragraph';
@@ -3034,7 +3036,71 @@ describe( 'ListEngine', () => {
 		} );
 		} );
 	} );
 	} );
 
 
-	describe( 'paste integration', () => {
+	describe( 'paste and insertContent integration', () => {
+		it( 'should be triggered on DataController#insertContent()', () => {
+			setModelData( modelDoc,
+				'<listItem type="bulleted" indent="0">A</listItem>' +
+				'<listItem type="bulleted" indent="1">B[]</listItem>' +
+				'<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
+			);
+
+			expect( getModelData( modelDoc ) ).to.equal(
+				'<listItem indent="0" type="bulleted">A</listItem>' +
+				'<listItem indent="1" type="bulleted">BX</listItem>' +
+				'<listItem indent="2" type="bulleted">Y[]</listItem>' +
+				'<listItem indent="2" type="bulleted">C</listItem>'
+			);
+		} );
+
+		// Just checking that it doesn't crash. #69
+		it( 'should work if an element is passed to DataController#insertContent()', () => {
+			setModelData( modelDoc,
+				'<listItem type="bulleted" indent="0">A</listItem>' +
+				'<listItem type="bulleted" indent="1">B[]</listItem>' +
+				'<listItem type="bulleted" indent="2">C</listItem>'
+			);
+
+			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>' +
+				'<listItem indent="1" type="bulleted">BX[]</listItem>' +
+				'<listItem indent="2" type="bulleted">C</listItem>'
+			);
+		} );
+
+		// Just checking that it doesn't crash. #69
+		it( 'should work if an element is passed to DataController#insertContent()', () => {
+			setModelData( modelDoc,
+				'<listItem type="bulleted" indent="0">A</listItem>' +
+				'<listItem type="bulleted" indent="1">B[]</listItem>' +
+				'<listItem type="bulleted" indent="2">C</listItem>'
+			);
+
+			editor.data.insertContent(
+				new ModelText( 'X' ),
+				modelDoc.selection
+			);
+
+			expect( getModelData( modelDoc ) ).to.equal(
+				'<listItem indent="0" type="bulleted">A</listItem>' +
+				'<listItem indent="1" type="bulleted">BX[]</listItem>' +
+				'<listItem indent="2" type="bulleted">C</listItem>'
+			);
+		} );
+
 		it( 'should fix indents of pasted list items', () => {
 		it( 'should fix indents of pasted list items', () => {
 			setModelData( modelDoc,
 			setModelData( modelDoc,
 				'<listItem type="bulleted" indent="0">A</listItem>' +
 				'<listItem type="bulleted" indent="0">A</listItem>' +