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.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)

# CKEditor 5 32.0.0 release

# MAJOR BREAKING CHANGES

  • engine: Batch#type was deprecated. It will always return the 'default' value and reading it will log a warning in the console. Use Batch#isUndoable, Batch#isLocal, Batch#isUndo and Batch#isTyping instead.
  • revision-history: Multiple changes to Revision properties were introduced that impact revision history integrations. Introduced #fromRevision and #toRevision properties. Renamed #data to #diffData. The #isLocked property was removed. These changes have an impact on what data should be saved in your database and how the revision history plugin should be integrated. Please refer to the migration guide and the API documentation to learn more about these changes.
  • revision-history: The RevisionHistoryAdapter interface has changed. Also, RevisionTracker no longer uses RevisionHistoryAdapter#getRevisions() to fetch revisions during the editor initialization. You should add revisions data in your integration plugin. Please refer to the migration guide and the documentation to learn how to update your revision history integration.
  • revision-history: RevisionTracker#updateRevision() was removed while the #update() and #saveRevision() methods have been introduced instead. This may have an impact on your revision history integration (e.g. with autosave). Please refer to the migration guide and the documentation to learn how to update your revision history integration.
  • typing: Input#isInput() was removed. Use Batch#isTyping instead.
  • Upgraded the minimal versions of Node.js to 14.0.0 due to the end of LTS.

# MINOR BREAKING CHANGES

  • engine: The string value for the Batch type and Model#enqueueChange() is now deprecated. Using a string value will log a warning in the console. Use an object value instead. For more information, refer to the API documentation.
  • revision-history: RevisionTracker#isLocked was removed.
  • revision-history: The flow for saving and updating a revision has changed. See the documentation to learn what it looks like after the changes.
  • The previously named #_getTemplate() methods in CommentThreadView, CommentView and SuggestionThreadView were renamed to #getTemplate(). These methods are used in annotations customization when changing the default templates.

# Features

  • autosave: Autosave#save() will now return a promise that is resolved when the autosave callback has finished. (commit)
  • comments: Introduced Annotation#refreshVisibility() and Annotations#refreshVisibility() that refresh the visibility of the annotations based on the visibility of their target elements.
  • comments: Introduced the Annotation#isVisible observable property that allows controlling the visibility of the annotation.
  • html-support: Added support for the <script> elements. Closes #10891. (commit)
  • list: Implemented the numbered list properties UI. Closes #10877. (commit)
  • list: Added support for reversed lists and list start index (reversed and start HTML attributes). Closes #10673. (commit)
  • mention: The mention plugin now allows searching mentions that include space characters. Closes #9741. (commit)
  • paste-from-office: Added support for start index in ordered lists. Closes #11043. (commit)
  • revision-history: Introduced Revision#fromVersion and Revision#toVersion.
  • revision-history: Introduced new methods in the RevisionHistory plugin: #addRevisionData(), #getRevision(), #getRevisions().
  • ui: Introduced the InputNumberView class and the createLabeledInputNumber() helper for creating number inputs (see #10877). (commit)
  • ui: Introduced the InputView class for other inputs such as InputTextView to inherit from (see #10877). (commit)
  • utils: Introduced the isVisible() helper to detect whether DOM elements are visible to the user in the DOM (see #10877). (commit)
  • Replaced Batch#type with a set of flags: Batch#isUndoable, Batch#isLocal, Batch#isUndo, Batch#isTyping which better represent the batch type. The Batch constructor and Model#enqueueChange() now expect an object. Closes #10967. (commit)

# Bug fixes

  • comments: DOM listeners will be detached when destroying annotation collections, which prevents memory leaks.
  • engine: HTMLDataProcessor#toView() should preserve leading non-layout elements while loading partial HTML. Closes #11110. (commit)
  • list: The list properties feature will no longer crash when removing content from the last list item which is next to a non-list element. Closes #8642. (commit)
  • pagination: The page number input view should not stretch. Used InputNumberView to render the page number input in PageNavigatorView.
  • revision-history: Fixed a crash when a revision contained overlapping suggestions.
  • revision-history: Fixed a crash when content selected by triple-click was copied and pasted into the editor.
  • track-changes: Fixed a crash that was happening during real-time editing when one of the users used Enter inside a suggestion.
  • typing: Fixed an editor crash when an unrecognized transformation was provided in the configuration (as a string). (commit)
  • watchdog: Prevented EditorWatchdog from crashing during the editor destruction process when one of the plugins tries to change the data at that moment. Closes #10643. (commit)

# Other changes

  • autosave: The Autosave plugin will now ignore changes coming from remote clients during real-time collaboration. Closes #9233. (commit)
  • build-decoupled-document: Enabled the startIndex and reversed list properties in the document build. Closes #11037. (commit)
  • comments: Renamed CommentThreadView#_getTemplate() to #getTemplate(). Renamed CommentView#_getTemplate() to #getTemplate().
  • list: Renamed the ListStyle plugin to ListProperties. Closes #10964. (commit)
  • real-time-collaboration: Collaboration updates will now be sent with shorter delays after they are rejected. This should allow for a better user experience when multiple users are typing at the same time.
  • real-time-collaboration: The RealTimeCollaborationClient#offset property is now private.
  • real-time-collaboration: The real-time collaboration feature will now create batches with the #isLocal flag set to false.
  • revision-history: Renamed Revision#data to Revision#diffData. The Revision#isLocked property was removed.
  • revision-history: The RevisionHistoryAdapter interface has changed. Removed #getRevisions(), #updateRevision() and #addRevision(). Added #updateRevisions().
  • revision-history: The revision history UI will now be blocked if the editor is in read-only mode.
  • revision-history: Added the index parameter in RevisionRepository#addRevision().
  • revision-history: Removed RevisionTracker#isLocked.
  • revision-history: Removed RevisionTracker#updateRevision() and added #update() and #saveRevision() instead.
  • revision-history: RevisionTracker no longer uses RevisionHistoryAdapter#getRevisions() to fetch revisions during the editor initialization.
  • revision-history: An error is now thrown when the revision history plugin configuration is missing.
  • revision-history: RevisionHistoryAdapter#getRevision() and #updateRevisions() now receive the #channelId parameter.
  • track-changes: Renamed SuggestionThreadView#_getTemplate() to #getTemplate().
  • typing: The typing feature will now create batches with the #isTyping property set to true. (commit)
  • ui: FocusCycler should skip elements that are invisible to the user (see #10877). (commit)
  • undo: The undo feature will now create batches with the #isUndo property set to true. (commit)
  • users: The anonymous user will now be added to the Users plugin automatically when the editor initializes.
  • Updated translations. (commit, commit)
  • Updated the required version of Node.js to 14. Closes #10972. (commit)
  • Project migration to webpack 5. Closes #10668. (commit)