Skip to content
This repository was archived by the owner on Jun 26, 2020. It is now read-only.

Commit 8a8842b

Browse files
authoredFeb 21, 2019
Merge pull request #75 from ckeditor/t/ckeditor5/1555
Fix: Editor crashes after Enter key on an image that is inside a blockquote. Closes ckeditor/ckeditor5#1555.
2 parents dad101f + 6dc95c4 commit 8a8842b

File tree

2 files changed

+47
-5
lines changed

2 files changed

+47
-5
lines changed
 

‎src/widget.js

+13-5
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ export default class Widget extends Plugin {
150150
*/
151151
_onKeydown( eventInfo, domEventData ) {
152152
const keyCode = domEventData.keyCode;
153-
const isForward = keyCode == keyCodes.delete || keyCode == keyCodes.arrowdown || keyCode == keyCodes.arrowright;
153+
const isForward = keyCode == keyCodes.arrowdown || keyCode == keyCodes.arrowright;
154154
let wasHandled = false;
155155

156156
// Checks if the keys were handled and then prevents the default event behaviour and stops
@@ -268,16 +268,16 @@ export default class Widget extends Plugin {
268268
_handleEnterKey( isBackwards ) {
269269
const model = this.editor.model;
270270
const modelSelection = model.document.selection;
271-
const objectElement = modelSelection.getSelectedElement();
271+
const selectedElement = modelSelection.getSelectedElement();
272272

273-
if ( objectElement && model.schema.isObject( objectElement ) ) {
273+
if ( shouldInsertParagraph( selectedElement, model.schema ) ) {
274274
model.change( writer => {
275-
let position = writer.createPositionAt( objectElement, isBackwards ? 'before' : 'after' );
275+
let position = writer.createPositionAt( selectedElement, isBackwards ? 'before' : 'after' );
276276
const paragraph = writer.createElement( 'paragraph' );
277277

278278
// Split the parent when inside a block element.
279279
// https://github.com/ckeditor/ckeditor5/issues/1529
280-
if ( !model.schema.isLimit( objectElement.parent ) ) {
280+
if ( model.schema.isBlock( selectedElement.parent ) ) {
281281
const paragraphLimit = model.schema.findAllowedParent( position, paragraph );
282282

283283
position = writer.split( position, paragraphLimit ).position;
@@ -451,3 +451,11 @@ function isChild( element, parent ) {
451451

452452
return Array.from( element.getAncestors() ).includes( parent );
453453
}
454+
455+
// Checks if enter key should insert paragraph. This should be done only on elements of type object (excluding inline objects).
456+
//
457+
// @param {module:engine/model/element~Element} element And element to check.
458+
// @param {module:engine/model/schema~Schema} schema
459+
function shouldInsertParagraph( element, schema ) {
460+
return element && schema.isObject( element ) && !schema.isInline( element );
461+
}

‎tests/widget.js

+34
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,11 @@ describe( 'Widget', () => {
5555
model.schema.register( 'editable', {
5656
allowIn: [ 'widget', '$root' ]
5757
} );
58+
model.schema.register( 'inline-widget', {
59+
allowWhere: '$text',
60+
isObject: true,
61+
isInline: true
62+
} );
5863

5964
// Image feature.
6065
model.schema.register( 'image', {
@@ -90,6 +95,14 @@ describe( 'Widget', () => {
9095
return toWidget( div, viewWriter, { label: 'element label' } );
9196
}
9297
} )
98+
.elementToElement( {
99+
model: 'inline-widget',
100+
view: ( modelItem, viewWriter ) => {
101+
const span = viewWriter.createContainerElement( 'span' );
102+
103+
return toWidget( span, viewWriter );
104+
}
105+
} )
93106
.elementToElement( {
94107
model: 'nested',
95108
view: ( modelItem, viewWriter ) => viewWriter.createEditableElement( 'figcaption', { contenteditable: true } )
@@ -761,6 +774,27 @@ describe( 'Widget', () => {
761774
'<allowP><disallowP><widget></widget></disallowP><paragraph>[]</paragraph><disallowP></disallowP></allowP>'
762775
);
763776
} );
777+
778+
test(
779+
'should do nothing if selected is inline object',
780+
'<paragraph>foo[<inline-widget></inline-widget>]bar</paragraph>',
781+
keyCodes.enter,
782+
'<paragraph>foo[]bar</paragraph>'
783+
);
784+
785+
test(
786+
'should insert a paragraph after the selected widget inside an element that is not a block upon Enter',
787+
'<blockQuote>[<widget></widget>]</blockQuote>',
788+
keyCodes.enter,
789+
'<blockQuote><widget></widget><paragraph>[]</paragraph></blockQuote>'
790+
);
791+
792+
test(
793+
'should insert a paragraph before the selected widget inside an element that is not a block upon Shift+Enter',
794+
'<blockQuote>[<widget></widget>]</blockQuote>',
795+
{ keyCode: keyCodes.enter, shiftKey: true },
796+
'<blockQuote><paragraph>[]</paragraph><widget></widget></blockQuote>'
797+
);
764798
} );
765799

766800
function test( name, data, keyCodeOrMock, expected, expectedView ) {

0 commit comments

Comments
 (0)
This repository has been archived.