Contribute to this guide

guideCKEditor 5 changelog

This is the CKEditor 5 changelog guide. Here you will find information about the most important changes introduced in the release, new features and bugfixes. Information about both major and minor breaking changes is available, too, if such were introduced. You can read more about breaking changes in CKEditor 5 in the Versioning policy guide.

You can find additional information about each release in the blog posts linked at the start of each entry.

This guide only provides the changelog information for the latest 3 releases of CKEditor 5. For older releases, refer to the changelog on GitHub.

# CKEditor 5 34.1.0 release

# Cloud Services compatibility

⚠️ Important message for CKEditor 5 Collaboration Server On-Premises users.

The new version of CKEditor 5 real-time collaboration is not compatible with the current version of CKEditor 5 Collaboration Server On-Premises (4.6.0).

Please wait for the new release of the CKEditor 5 Collaboration Server On-Premises solution and update the backend service first, before updating the CKEditor 5 packages.

# Features

  • engine: Improved the History API. You can find the changes summary in the related issue. Closes #11226. (commit)
  • list: Added support for the type attribute of the <ul> and <ol> elements in addition to the list-style-type style. Closes #11615. (commit)
  • real-time-collaboration: Introduced better support for revision history when editor bundle is used. This greatly reduced the number of calls and revision data passed to Cloud Services.
  • table: Added support for table column resizing, which allows to set the width of each column in a table using a resize handle. (commit)

# Bug fixes

  • code-block: Redundant text nodes should be removed from <pre> on upcast to avoid breaking the code block. Closes #11616. (commit)
  • engine: Attributes should not be set if a parent was converted into a collapsed range. Closes #11000. (commit)
  • engine: The elementToAttribute() upcast helper should consume an element itself while consuming its attribute. See #10800. (commit)
  • html-support: Extracted upcasting attributes of the figure view element to separate converters for the table, image and media integrations. Closes #11688. (commit)
  • html-support: The <div> elements should be upcast to container-like elements when there is a block among their descendants. Closes #11513. (commit)
  • html-support: Inline elements handled by a native editor plugin should not be handled by the GHS. Closes #10800, #10954. (commit)
  • html-support: Unlinking should remove a link even if there were some additional attributes handled by the GHS. See #10800. (commit)
  • language: Fixes the interference between TextPartLanguage and CodeBlock. Closes #11538, #11563. (commit)
  • mention: The mention UI should not show up when matching an existing mention following a white space. Closes #11400. (commit)
  • pagination: The PaginationLookup plugin should destroy parent class and stop listening to events from external emitters. Closes #1148.
  • paste-from-office: Fixes pasting multiple lines from Google Docs into a code block. (commit) Thanks to @skylerfenn!
  • restricted-editing: Standard editing mode post-fixers will no longer create marker operations with invalid base versions. Closes #11644. (commit)
  • revision-history: Incorrect HTML was generated from a revision if there was a space at the end of a block which lead to crashes when comparing multiple revisions.
  • style: The block style should be applied to all matching selected blocks. Closes #11582. (commit)
  • style: Inline style can be removed from an inline widget. Closes #11584. (commit)
  • style: Inline styles should not be enabled inside a code block. Closes #11581. (commit)
  • style: Container styles (for example, a block quote style) should be applied properly. Closes #11576. (commit)
  • style: A grid with styles should render properly with two styles in a row. Closes #11575. (commit)

# Other changes

  • engine: Exported some of the engine.View classes in index.js. (commit)
  • html-support: Introduced DataFilter#processViewAttributes() that is helpful when integrating the GHS with a custom feature. Closes #10827. (commit)
  • list: Copying content from a single list item should not wrap it with a list in the clipboard. Closes #11608. (commit)
  • real-time-collaboration: Revision dates will now be based on the server time instead of the local time.
  • revision-history: A revision date can now be updated on backend when the revision is saved using the revision history adapter. See the API reference for RevisionHistoryAdapter#updateRevisions to learn more.
  • watchdog: Improved the ContextWatchdog queueing mechanism. Closes #11664. (commit)
  • Updated translations. (commit, commit)

# CKEditor 5 34.0.0 release

# MAJOR BREAKING CHANGES

  • The Editor#isReadOnly property is now not editable directly. Starting this release, the property is controlled by Editor#enableReadOnlyMode( lockId ) and Editor#disableReadOnlyMode( lockId ), which allow changing the Editor#isReadOnly state by more than one feature without collisions. See the migration guide to learn more.

  • real-time-collaboration: The new version of CKEditor 5 real-time collaboration works only with the new CKEditor 5 Cloud Services backend. If you use the CKEditor 5 Cloud Services On-Premise solution, please update the backend service if you decide to update the CKEditor 5 packages.

# MINOR BREAKING CHANGES

  • engine: The isAllowedInsideAttributeElement option has been removed, so the AttributeElement elements can wrap any view element (according to positions). Make sure that you are not wrapping any of the ContainerElement elements by accident by not checking the target in the converter. These would previously get wrapped by the AttributeElement element which would immediately be removed by the ContainerElement element within it so there would be no visible effect.
  • engine: The handling of Tab and Shift+Tab keystrokes have been switched to the 'tab' view document event across the project. If your integration uses KeystrokeHandler for Tab key handling, we recommend you migrate to the 'tab' event to avoid unpredicted errors.
  • engine: If your integration uses the Model#insertContent() and findOptimalInsertionRange() methods to insert widgets into the content, we recommend you migrate your code to the Model#insertObject() method for best results. This is particularly relevant for compatibility with the document lists feature (see #11198).
  • html-support: The $htmlSection, $htmlObjectBlock, and $htmlObjectInline element types are no longer available for custom elements registered via theregisterBlockElement() method to inherit from. Please use $container, $blockObject, and $inlineObject instead (see #11197).

# Features

  • core: Introduced the lock mechanism for the Editor#isReadOnly property. The read-only mode can now be separately enabled and disabled by multiple features, which allow for proper control without conflicts between features. Closes #10496. (commit)
  • core: MultiCommand now allows setting the priority (the order) of registered subcommands. Closes #11083. (commit)
  • engine: Added the new Model#insertObject() method for inserting elements defined as objects by model schema (see #11198). (commit)
  • engine: Introduced the inheritable $container, $blockObject, and $inlineObject element types in the model Schema (see #11197). (commit)
  • engine: Introduced the TabObserver observer that allows listening to pressing down the Tab key in the specified context. (commit)
  • engine: Added the new Schema#getAttributesWithProperty() method that retrieves attributes from a node which has a given property (see #11198). (commit)
  • engine: Added the new Schema#setAllowedAttributes() method that validates whether attributes are allowed on a given element before setting them (see #11198). (commit)
  • html-support: Changes to GHS model attributes will be reflected in the editing view (see #5700). (commit)
  • html-support: Added support for document list in the GeneralHtmlSupport feature. Closes #11454, #11359, #11358. (commit)
  • list: Introducing the document list feature (multiple blocks per list item). Closes #2973, #10812. (commit)
  • list: Introducing the document list properties feature (list styles, start index, reversed list). Closes #11065. (commit)
  • paragraph: Added an optional options.attributes parameter to the InsertParagraph command that allows setting attributes on a created paragraph (see #11198). (commit)
  • style: Implemented the configurable style feature with the style UI dropdown. Closes #5700. (commit)
  • theme-lark: Implemented a .ck-reset_all-excluded CSS class that excludes certain elements from CSS reset. Closes #11451. (commit)

# Bug fixes

  • engine: Marker changes sometimes did not trigger change:data event which resulted in errors in features using markers (for example, annotations not showing up in the sidebar). (commit)
  • html-support: GHS should not convert already consumed inline elements (e.g. handled by other editor features). Closes #11447. (commit)
  • html-support: Prevent the TypeError error in the mergeViewElementAttributes() function. Closes #10657, #11450, #11477. (commit)
  • html-support: Skip inline image upcast conversion inside not supported element. Closes #10703. (commit)
  • image: The image upcast converter should consume the [src] attribute. Closes #11530. (commit)
  • link: The link decorators should be converted on block images only once (should not wrap block image with an additional link). (commit)
  • list: Soft enter (Shift+Enter) is no longer captured by the document list enter key listener, allowing to insert soft breaks in empty list items. Closes #11539. (commit)
  • list: The view list split converter should not fire if the change was already consumed. Closes #11490. (commit)
  • list: List properties should remain the same after a paragraph following a list is toggled into a list item. Closes #11408. (commit)
  • pagination: Fixed updating pagination lines after resizing the editing root ancestor.
  • revision-history: Editor will not get stuck if the revision diff data could not be loaded due to an error when opening or using the revision viewer.

# Other changes

  • code-block: The handling of Tab and Shift+Tab keystrokes switched to the 'tab' view document event and now respects the event context. (commit)
  • core: The Editor#isReadOnly property is now marked as read-only. (commit)
  • engine: The Differ change entries for insert and remove types are extended with a map of attributes that were set while inserting an element or that belonged to an element that got removed. (commit)
  • engine: The DowncastHelpers are passing an additional parameter to the creator functions (the data that provides more context to the element creator callback). (commit)
  • engine: The isAllowedInsideAttributeElement option was removed, from now on AttributeElements are allowed to wrap any view element. (commit)
  • engine: The ConversionApi provided by the UpcastDispatcher was extended by an additional keepEmptyElement() method that marks an element that was created during splitting a model element that should not get removed on conversion even if it is empty. (commit)
  • engine: Improved model.TreeWalker#next() efficiency. See ckeditor/ckeditor5#11463. (commit)
  • html-support: Updated default schema definitions for various elements taking advantage of the $container, $blockObject, and $inlineObject elements in model schema (see #11197). (commit)
  • media-embed: Added the optional findOptimalPosition parameter to the insertMedia() helper that allows for inserting media model element without breaking the content (see #11198). (commit)
  • revision-history: Improved revision history performance for large documents in the following areas: editor initialization time, revision saving time and revision comparison time.
  • revision-history: The @ckeditor/ckeditor5-revision-history package exposes the DLL build.
  • table: Exports PlainTableOutput plugin from the table package. Closes #11516. (commit)
  • watchdog: Improved performance of the getSubNodes() utility of Watchdog. (commit)
  • Updated translations. (commit, commit)
  • CKEditor 5 uses PostCSS@8 now. Closes #11460. (commit)

# CKEditor 5 33.0.0 release

# MAJOR BREAKING CHANGES

  • engine: Removed the Differ#refreshItem() method from the public API. Replaced by EditingController#reconvertItem() (see #10659).
  • engine: The downcast dispatcher will throw an error if any of the model items were not consumed while converting. Read the conversion-model-consumable-not-consumed error documentation for more information.
  • engine: The DowncastDispatcher#conversionApi property is no longer available. The instances of DowncastConversionApi are created at the start of conversion.
  • engine: Support for the triggerBy option for downcast helpers was removed and replaced with the new elementToStructure() options.
  • list: The ListEditing, ListUI, ListStyleEditing, ListStyleUI, TodoListEditing, TodoListUI plugins were moved to their dedicated subdirectories (list, liststyle, todolist).

# MINOR BREAKING CHANGES

  • image: Image caption utilities were converted to the ImageCaptionUtils plugin.
  • table: The downcast converters of the table feature were rewritten with the use of elementToStructure() and the re-conversion mechanism. See #10502.
  • table: The table selection utilities were moved to the TableUtils plugin.
  • config.initialData will now always be set, even if it is not passed in the editor configuration.

# Features

  • engine: The DowncastWriter#createContainerElement() method should accept a list of children so that bigger view structures can be created in one call. Closes #10714. (commit)
  • engine: The elementToElement() downcast helper will log a console warning if multiple elements have been created. Closes #10610. (commit)
  • engine: The downcast dispatcher will throw an error if any of the model items were not consumed while converting. Closes #10377. (commit)
  • engine: Introduced the convertItem(), convertChildren() and convertAttributes() methods in the downcast conversion API interface. (commit)
  • engine: Added support for reconversion in the DowncastHelpers#elementToElement() downcast helper. Closes #10359. (commit)
  • engine: Added the DowncastHelpers#elementToStructure() downcast helper with reconversion support. Closes #10358. (commit)
  • engine: It is now possible to trigger a nested conversion while downcasting an element. (commit)
  • engine: The DeleteCommand was changed to delete the whole multi-character emoji at once. Closes #6504. (commit)
  • engine: Introduced Marker#getData(). (commit)
  • html-support: Added the <style> element support in the General HTML Support feature. Closes #11104. (commit)
  • table: Introduced the PlainTableOutput plugin to override the default figure>caption markup in the data pipeline (it outputs the table as table>caption). Closes: #10892. (commit)

# Bug fixes

  • engine: Setting a marker to the same range it was will no longer trigger the change:data event. This will prevent unnecessary autosave callbacks. Closes #9901. (commit)
  • html-support: Prevent the removal of the <script> and <style> elements when they are the only content in the editor. Closes #11247. (commit)
  • image: Always create new instances of the default options for the ImageStyle plugin. Closes #11328. (commit)
  • table: Prevent the plain table output converter from interfering with other features’ caption converters. Closes #11394. (commit)
  • Fixed the “Unknown option --dev” error when building DLL files with the development mode enabled. Closes #11170. (commit)

# Other changes

  • engine: Implemented the EditingController#reconvertMarker() method to be used instead of Writer#updateMarker() for marker reconversion purposes. Implemented the EditingController#reconvertItem() method to replace Differ#refreshItem(). Closes #10659. (commit)
  • engine: The conversion events for attribute and child nodes are fired by the lowest priority handler for the insert event instead of the DowncastDispatcher itself. Closes #10376. (commit)
  • engine: Events are fired by the DowncastDispatcher even if they were previously consumed. It is the conversion handler’s responsibility to check if it can be consumed or if it has already been consumed by other converters. (commit)
  • engine: The DowncastDispatcher#convert() method was introduced as a replacement for the previously used convertInsert(). The new method not only handles the nodes conversion but also the markers. (commit)
  • engine: The <style> element will not interfere with the editing experience. See #11104. (commit)
  • font: Moved the utilities functions to plugins to make them available in DLLs. (commit)
  • list: The ckeditor5-list package was restructured into subdirectories. Closes #10811. (commit)
  • list: The downcast conversion should consume the downcasted attributes. (commit)
  • table: Table downcast conversion was migrated to the elementToStructure() downcast helper. Closes #10502. (commit)
  • Updated translations. (commit)
  • Editor.create() will now set the config.initialData value based on the first parameter if initialData has not been set in the editor configuration. As a result, plugins can now easily read and modify the editor initial data. (commit)