Ver Fonte

Fix handling enter key on object elements in widget.

Maciej Gołaszewski há 7 anos atrás
pai
commit
4a16eccaf1

+ 2 - 2
packages/ckeditor5-widget/src/widget.js

@@ -270,14 +270,14 @@ export default class Widget extends Plugin {
 		const modelSelection = model.document.selection;
 		const objectElement = modelSelection.getSelectedElement();
 
-		if ( objectElement && model.schema.isObject( objectElement ) ) {
+		if ( objectElement && model.schema.isObject( objectElement ) && !model.schema.isInline( objectElement ) ) {
 			model.change( writer => {
 				let position = writer.createPositionAt( objectElement, isBackwards ? 'before' : 'after' );
 				const paragraph = writer.createElement( 'paragraph' );
 
 				// Split the parent when inside a block element.
 				// https://github.com/ckeditor/ckeditor5/issues/1529
-				if ( !model.schema.isLimit( objectElement.parent ) ) {
+				if ( model.schema.isBlock( objectElement.parent ) ) {
 					const paragraphLimit = model.schema.findAllowedParent( position, paragraph );
 
 					position = writer.split( position, paragraphLimit ).position;

+ 34 - 0
packages/ckeditor5-widget/tests/widget.js

@@ -55,6 +55,11 @@ describe( 'Widget', () => {
 				model.schema.register( 'editable', {
 					allowIn: [ 'widget', '$root' ]
 				} );
+				model.schema.register( 'inline-widget', {
+					allowWhere: '$text',
+					isObject: true,
+					isInline: true
+				} );
 
 				// Image feature.
 				model.schema.register( 'image', {
@@ -90,6 +95,14 @@ describe( 'Widget', () => {
 							return toWidget( div, viewWriter, { label: 'element label' } );
 						}
 					} )
+					.elementToElement( {
+						model: 'inline-widget',
+						view: ( modelItem, viewWriter ) => {
+							const span = viewWriter.createContainerElement( 'span' );
+
+							return toWidget( span, viewWriter );
+						}
+					} )
 					.elementToElement( {
 						model: 'nested',
 						view: ( modelItem, viewWriter ) => viewWriter.createEditableElement( 'figcaption', { contenteditable: true } )
@@ -761,6 +774,27 @@ describe( 'Widget', () => {
 					'<allowP><disallowP><widget></widget></disallowP><paragraph>[]</paragraph><disallowP></disallowP></allowP>'
 				);
 			} );
+
+			test(
+				'should do nothing if selected is inline object',
+				'<paragraph>foo[<inline-widget></inline-widget>]bar</paragraph>',
+				keyCodes.enter,
+				'<paragraph>foo[]bar</paragraph>'
+			);
+
+			test(
+				'should insert a paragraph after the selected widget inside an element that is not a block upon Enter',
+				'<blockQuote>[<widget></widget>]</blockQuote>',
+				keyCodes.enter,
+				'<blockQuote><widget></widget><paragraph>[]</paragraph></blockQuote>'
+			);
+
+			test(
+				'should insert a paragraph before the selected widget inside an element that is not a block upon Shift+Enter',
+				'<blockQuote>[<widget></widget>]</blockQuote>',
+				{ keyCode: keyCodes.enter, shiftKey: true },
+				'<blockQuote><paragraph>[]</paragraph><widget></widget></blockQuote>'
+			);
 		} );
 
 		function test( name, data, keyCodeOrMock, expected, expectedView ) {