Skip to content

Commit

Permalink
Merge pull request #9657 from ckeditor/i/9622-b
Browse files Browse the repository at this point in the history
Internal (engine): Fixed new marker-to-data conversion inside code blocks.
  • Loading branch information
niegowski authored May 10, 2021
2 parents 4500b92 + 39b1a90 commit f6e48bb
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 4 deletions.
14 changes: 10 additions & 4 deletions packages/ckeditor5-engine/src/conversion/downcasthelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -966,12 +966,18 @@ function handleMarkerBoundary( range, isStart, conversionApi, data, viewMarkerDa

const viewElement = conversionApi.mapper.toViewElement( modelElement );

insertMarkerAsAttribute( viewElement, isStart, isBefore, conversionApi, data, viewMarkerData );
} else {
const viewPosition = conversionApi.mapper.toViewPosition( modelPosition );
// On rare circumstances, the model element could be not mapped to any view element and that would cause an error.
// One of those situations is a soft break inside code block.
if ( viewElement ) {
insertMarkerAsAttribute( viewElement, isStart, isBefore, conversionApi, data, viewMarkerData );

insertMarkerAsElement( viewPosition, isStart, conversionApi, data, viewMarkerData );
return;
}
}

const viewPosition = conversionApi.mapper.toViewPosition( modelPosition );

insertMarkerAsElement( viewPosition, isStart, conversionApi, data, viewMarkerData );
}

// Helper function for `insertMarkerData()` that marks a marker boundary in the view as an attribute on a view element.
Expand Down
32 changes: 32 additions & 0 deletions packages/ckeditor5-engine/tests/conversion/downcasthelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -2611,6 +2611,38 @@ describe( 'DowncastHelpers', () => {
expectResult( '<p>Foo</p><p>Bar</p>' );
} );

// Fix for a bug that happens for soft breaks in code blocks.
// In that case, soft break model element is not converted to a view element.
it( 'default conversion, over model element not mapped to the view', () => {
downcastHelpers.markerToData( { model: 'group' } );

model.schema.register( 'customElement', { inheritAllFrom: '$block' } );

controller.downcastDispatcher.on( 'insert:customElement', ( evt, data, conversionApi ) => {
const viewText = conversionApi.writer.createText( 'A' );
const viewPosition = conversionApi.mapper.toViewPosition( data.range.start );

conversionApi.writer.insert( viewPosition, viewText );
} );

// <paragraph> added so it can store selection, otherwise it throws.
setModelData( model, '<paragraph></paragraph><customElement></customElement>' );

model.change( writer => {
const range = writer.createRangeOn( root.getChild( 1 ) );

writer.addMarker( 'group:foo:bar:baz', { range, usingOperation: false } );
} );

expectResult( '<p></p><group-start name="foo:bar:baz"></group-start>A<group-end name="foo:bar:baz"></group-end>' );

model.change( writer => {
writer.removeMarker( 'group:foo:bar:baz' );
} );

expectResult( '<p></p>A' );
} );

it( 'can be overwritten using converterPriority', () => {
downcastHelpers.markerToData( {
model: 'group'
Expand Down

0 comments on commit f6e48bb

Please sign in to comment.