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

Merge pull request #82 from ckeditor/t/70

Fix: Editor will no longer crash when spellchecker corrects a word inside list item in a certain scenario. Closes #70.
Piotrek Koszuliński 8 лет назад
Родитель
Сommit
518217f836

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

@@ -356,10 +356,11 @@ export function viewModelConverter( evt, data, consumable, conversionApi ) {
 
 		// 2. Handle `listItem` model element attributes.
 		data.indent = data.indent ? data.indent : 0;
+		listItem.setAttribute( 'indent', data.indent );
 
-		const type = data.input.parent.name == 'ul' ? 'bulleted' : 'numbered';
+		// Set 'bulleted' as default. If this item is pasted into a context,
+		const type = data.input.parent && data.input.parent.name == 'ol' ? 'numbered' : 'bulleted';
 		listItem.setAttribute( 'type', type );
-		listItem.setAttribute( 'indent', data.indent );
 
 		// 3. Handle `<li>` children.
 		data.context.push( listItem );

+ 49 - 0
packages/ckeditor5-list/tests/listengine.js

@@ -3265,6 +3265,55 @@ describe( 'ListEngine', () => {
 				editor.data.insertContent( new ModelDocumentFragment(), modelDoc.selection );
 			} ).not.to.throw();
 		} );
+
+		it( 'should correctly handle item that is pasted without its parent', () => {
+			setModelData( modelDoc,
+				'<paragraph>Foo</paragraph>' +
+				'<listItem type="numbered" indent="0">A</listItem>' +
+				'<listItem type="numbered" indent="1">B</listItem>' +
+				'[]' +
+				'<paragraph>Bar</paragraph>'
+			);
+
+			const clipboard = editor.plugins.get( 'Clipboard' );
+
+			clipboard.fire( 'inputTransformation', {
+				content: parseView( '<li>X</li>' )
+			} );
+
+			expect( getModelData( modelDoc ) ).to.equal(
+				'<paragraph>Foo</paragraph>' +
+				'<listItem indent="0" type="numbered">A</listItem>' +
+				'<listItem indent="1" type="numbered">B</listItem>' +
+				'<listItem indent="1" type="numbered">X[]</listItem>' +
+				'<paragraph>Bar</paragraph>'
+			);
+		} );
+
+		it( 'should correctly handle item that is pasted without its parent #2', () => {
+			setModelData( modelDoc,
+				'<paragraph>Foo</paragraph>' +
+				'<listItem type="numbered" indent="0">A</listItem>' +
+				'<listItem type="numbered" indent="1">B</listItem>' +
+				'[]' +
+				'<paragraph>Bar</paragraph>'
+			);
+
+			const clipboard = editor.plugins.get( 'Clipboard' );
+
+			clipboard.fire( 'inputTransformation', {
+				content: parseView( '<li>X<ul><li>Y</li></ul></li>' )
+			} );
+
+			expect( getModelData( modelDoc ) ).to.equal(
+				'<paragraph>Foo</paragraph>' +
+				'<listItem indent="0" type="numbered">A</listItem>' +
+				'<listItem indent="1" type="numbered">B</listItem>' +
+				'<listItem indent="1" type="numbered">X</listItem>' +
+				'<listItem indent="2" type="bulleted">Y[]</listItem>' +
+				'<paragraph>Bar</paragraph>'
+			);
+		} );
 	} );
 
 	describe( 'other', () => {