CKEditor 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 thelist-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 thetable
,image
andmedia
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
andCodeBlock
. 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 inindex.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 byEditor#enableReadOnlyMode( lockId )
andEditor#disableReadOnlyMode( lockId )
, which allow changing theEditor#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 theAttributeElement
elements can wrap any view element (according to positions). Make sure that you are not wrapping any of theContainerElement
elements by accident by not checking the target in the converter. These would previously get wrapped by theAttributeElement
element which would immediately be removed by theContainerElement
element within it so there would be no visible effect. - engine: The handling of
Tab
andShift+Tab
keystrokes have been switched to the'tab'
view document event across the project. If your integration usesKeystrokeHandler
forTab
key handling, we recommend you migrate to the'tab'
event to avoid unpredicted errors. - engine: If your integration uses the
Model#insertContent()
andfindOptimalInsertionRange()
methods to insert widgets into the content, we recommend you migrate your code to theModel#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 modelSchema
(see #11197). (commit) - engine: Introduced the
TabObserver
observer that allows listening to pressing down theTab
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 theInsertParagraph
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 themergeViewElementAttributes()
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
andShift+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 forinsert
andremove
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 (thedata
that provides more context to the element creator callback). (commit) - engine: The
isAllowedInsideAttributeElement
option was removed, from now onAttributeElements
are allowed to wrap any view element. (commit) - engine: The
ConversionApi
provided by theUpcastDispatcher
was extended by an additionalkeepEmptyElement()
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 theinsertMedia()
helper that allows for insertingmedia
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 ofWatchdog
. (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 byEditingController#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 ofDowncastConversionApi
are created at the start of conversion. - engine: Support for the
triggerBy
option for downcast helpers was removed and replaced with the newelementToStructure()
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()
andconvertAttributes()
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 defaultfigure>caption
markup in the data pipeline (it outputs the table astable>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 ofWriter#updateMarker()
for marker reconversion purposes. Implemented theEditingController#reconvertItem()
method to replaceDiffer#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 usedconvertInsert()
. 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 theconfig.initialData
value based on the first parameter ifinitialData
has not been set in the editor configuration. As a result, plugins can now easily read and modify the editor initial data. (commit)
Every day, we work hard to keep our documentation complete. Have you spotted an outdated information? Is something missing? Please report it via our issue tracker.