diff --git a/packages/ckeditor5-list/src/list/converters.ts b/packages/ckeditor5-list/src/list/converters.ts index 050dba45f45..4b50fe86e35 100644 --- a/packages/ckeditor5-list/src/list/converters.ts +++ b/packages/ckeditor5-list/src/list/converters.ts @@ -349,6 +349,11 @@ export function listItemDowncastConverter( return; } + const options = { + ...conversionApi.options, + dataPipeline + }; + // Use positions mapping instead of mapper.toViewElement( listItem ) to find outermost view element. // This is for cases when mapping is using inner view element like in the code blocks (pre > code). const viewElement = findMappedViewElement( listItem, mapper, model )!; @@ -360,10 +365,10 @@ export function listItemDowncastConverter( unwrapListItemBlock( viewElement, writer ); // Insert custom item marker. - const viewRange = insertCustomMarkerElements( listItem, viewElement, strategies, writer, { dataPipeline } ); + const viewRange = insertCustomMarkerElements( listItem, viewElement, strategies, writer, options ); // Then wrap them with the new list wrappers (UL, OL, LI). - wrapListItemBlock( listItem, viewRange, strategies, writer, conversionApi.options ); + wrapListItemBlock( listItem, viewRange, strategies, writer, options ); }; } diff --git a/packages/ckeditor5-list/src/listformatting/listitemboldintegration.ts b/packages/ckeditor5-list/src/listformatting/listitemboldintegration.ts index 695af10b6d2..e1ac5821886 100644 --- a/packages/ckeditor5-list/src/listformatting/listitemboldintegration.ts +++ b/packages/ckeditor5-list/src/listformatting/listitemboldintegration.ts @@ -8,6 +8,7 @@ */ import { Plugin } from 'ckeditor5/src/core.js'; +import { env } from 'ckeditor5/src/utils.js'; import { ListEditing } from '../list/listediting.js'; import type { ListFormatting } from '../listformatting.js'; @@ -58,9 +59,14 @@ export class ListItemBoldIntegration extends Plugin { scope: 'item', attributeName: 'listItemBold', - setAttributeOnDowncast( writer, value, viewElement ) { + setAttributeOnDowncast( writer, value, viewElement, options ) { if ( value ) { writer.addClass( 'ck-list-marker-bold', viewElement ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + if ( env.isSafari && !( options && options.dataPipeline ) ) { + writer.setStyle( '--ck-content-list-marker-dummy-bold', '0', viewElement ); + } } } } ); diff --git a/packages/ckeditor5-list/src/listformatting/listitemfontsizeintegration.ts b/packages/ckeditor5-list/src/listformatting/listitemfontsizeintegration.ts index b11a49b4fd0..43416e5ce11 100644 --- a/packages/ckeditor5-list/src/listformatting/listitemfontsizeintegration.ts +++ b/packages/ckeditor5-list/src/listformatting/listitemfontsizeintegration.ts @@ -9,6 +9,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import type { ViewElement } from 'ckeditor5/src/engine.js'; +import { env } from 'ckeditor5/src/utils.js'; import { _normalizeFontSizeOptions } from '@ckeditor/ckeditor5-font'; import { ListEditing } from '../list/listediting.js'; @@ -62,7 +63,7 @@ export class ListItemFontSizeIntegration extends Plugin { scope: 'item', attributeName: 'listItemFontSize', - setAttributeOnDowncast( writer, value: string, viewElement ) { + setAttributeOnDowncast( writer, value: string, viewElement, options ) { if ( value ) { const fontSizeOption = normalizedFontSizeOptions.find( option => option.model == value ); @@ -73,6 +74,11 @@ export class ListItemFontSizeIntegration extends Plugin { } else if ( fontSizeOption.view.classes ) { writer.addClass( `ck-list-marker-font-size-${ value }`, viewElement ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + if ( env.isSafari && !( options && options.dataPipeline ) ) { + writer.setStyle( '--ck-content-list-marker-dummy-font-size', '0', viewElement ); + } } } else { writer.addClass( 'ck-list-marker-font-size', viewElement ); diff --git a/packages/ckeditor5-list/src/listformatting/listitemitalicintegration.ts b/packages/ckeditor5-list/src/listformatting/listitemitalicintegration.ts index 3398b2a5ee9..1bb5e5db689 100644 --- a/packages/ckeditor5-list/src/listformatting/listitemitalicintegration.ts +++ b/packages/ckeditor5-list/src/listformatting/listitemitalicintegration.ts @@ -8,6 +8,7 @@ */ import { Plugin } from 'ckeditor5/src/core.js'; +import { env } from 'ckeditor5/src/utils.js'; import { ListEditing } from '../list/listediting.js'; import type { ListFormatting } from '../listformatting.js'; @@ -58,9 +59,14 @@ export class ListItemItalicIntegration extends Plugin { scope: 'item', attributeName: 'listItemItalic', - setAttributeOnDowncast( writer, value, viewElement ) { + setAttributeOnDowncast( writer, value, viewElement, options ) { if ( value ) { writer.addClass( 'ck-list-marker-italic', viewElement ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + if ( env.isSafari && !( options && options.dataPipeline ) ) { + writer.setStyle( '--ck-content-list-marker-dummy-italic', '0', viewElement ); + } } } } ); diff --git a/packages/ckeditor5-list/tests/listformatting/listitemboldintegration.js b/packages/ckeditor5-list/tests/listformatting/listitemboldintegration.js index a2b9051972b..a8ecd0f3396 100644 --- a/packages/ckeditor5-list/tests/listformatting/listitemboldintegration.js +++ b/packages/ckeditor5-list/tests/listformatting/listitemboldintegration.js @@ -15,6 +15,7 @@ import { ClipboardPipeline } from '@ckeditor/ckeditor5-clipboard/src/clipboardpi import { testUtils } from '@ckeditor/ckeditor5-core/tests/_utils/utils.js'; import { _setModelData, _getModelData, _stringifyModel } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; import { _getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view.js'; +import { env } from 'ckeditor5/src/utils.js'; import { stubUid } from '../list/_utils/uid.js'; import { ListEditing } from '../../src/list/listediting.js'; @@ -336,6 +337,35 @@ describe( 'ListItemBoldIntegration', () => { '' ); } ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + it( 'should add dummy style for a Safari glitch (in editing pipeline only)', () => { + sinon.stub( env, 'isSafari' ).value( true ); + + _setModelData( model, + '' + + '<$text bold="true">foo' + + '' + ); + + expect( _getViewData( view, { withoutSelection: true } ) ).to.equal( + '' + ); + + expect( editor.getData( { skipListItemIds: true } ) ).to.equalMarkup( + '' + ); + } ); } ); describe( 'upcast', () => { diff --git a/packages/ckeditor5-list/tests/listformatting/listitemfontsizeintegration.js b/packages/ckeditor5-list/tests/listformatting/listitemfontsizeintegration.js index 5317d357873..8e208408218 100644 --- a/packages/ckeditor5-list/tests/listformatting/listitemfontsizeintegration.js +++ b/packages/ckeditor5-list/tests/listformatting/listitemfontsizeintegration.js @@ -15,6 +15,7 @@ import { ClipboardPipeline } from '@ckeditor/ckeditor5-clipboard'; import { testUtils } from '@ckeditor/ckeditor5-core/tests/_utils/utils.js'; import { _setModelData, _getModelData, _stringifyModel } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; import { _getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view.js'; +import { env } from 'ckeditor5/src/utils.js'; import { stubUid } from '../list/_utils/uid.js'; import { ListEditing } from '../../src/list/listediting.js'; @@ -372,6 +373,35 @@ describe( 'ListItemFontSizeIntegration', () => { '' ); } ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + it( 'should add dummy style for a Safari glitch (in editing pipeline only)', () => { + sinon.stub( env, 'isSafari' ).value( true ); + + _setModelData( model, + '' + + '<$text fontSize="tiny">foo' + + '' + ); + + expect( _getViewData( view, { withoutSelection: true } ) ).to.equal( + '' + ); + + expect( editor.getData( { skipListItemIds: true } ) ).to.equalMarkup( + '' + ); + } ); } ); describe( 'upcast', () => { diff --git a/packages/ckeditor5-list/tests/listformatting/listitemitalicintegration.js b/packages/ckeditor5-list/tests/listformatting/listitemitalicintegration.js index 33bce2e3e2a..0540b889131 100644 --- a/packages/ckeditor5-list/tests/listformatting/listitemitalicintegration.js +++ b/packages/ckeditor5-list/tests/listformatting/listitemitalicintegration.js @@ -15,6 +15,7 @@ import { ClipboardPipeline } from '@ckeditor/ckeditor5-clipboard'; import { testUtils } from '@ckeditor/ckeditor5-core/tests/_utils/utils.js'; import { _setModelData, _getModelData, _stringifyModel } from '@ckeditor/ckeditor5-engine/src/dev-utils/model.js'; import { _getViewData } from '@ckeditor/ckeditor5-engine/src/dev-utils/view.js'; +import { env } from 'ckeditor5/src/utils.js'; import { stubUid } from '../list/_utils/uid.js'; import { ListEditing } from '../../src/list/listediting.js'; @@ -336,6 +337,35 @@ describe( 'ListItemItalicIntegration', () => { '' ); } ); + + // See: https://github.com/ckeditor/ckeditor5/issues/18790. + it( 'should add dummy style for a Safari glitch (in editing pipeline only)', () => { + sinon.stub( env, 'isSafari' ).value( true ); + + _setModelData( model, + '' + + '<$text italic="true">foo' + + '' + ); + + expect( _getViewData( view, { withoutSelection: true } ) ).to.equal( + '' + ); + + expect( editor.getData( { skipListItemIds: true } ) ).to.equalMarkup( + '' + ); + } ); } ); describe( 'upcast', () => {