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.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)
# 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. UseBatch#isUndoable
,Batch#isLocal
,Batch#isUndo
andBatch#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 usesRevisionHistoryAdapter#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. UseBatch#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 andModel#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 inCommentThreadView
,CommentView
andSuggestionThreadView
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()
andAnnotations#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
andstart
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
andRevision#toVersion
. - revision-history: Introduced new methods in the
RevisionHistory
plugin:#addRevisionData()
,#getRevision()
,#getRevisions()
. - ui: Introduced the
InputNumberView
class and thecreateLabeledInputNumber()
helper for creating number inputs (see #10877). (commit) - ui: Introduced the
InputView
class for other inputs such asInputTextView
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. TheBatch
constructor andModel#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 inPageNavigatorView
. - 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
andreversed
list properties in the document build. Closes #11037. (commit) - comments: Renamed
CommentThreadView#_getTemplate()
to#getTemplate()
. RenamedCommentView#_getTemplate()
to#getTemplate()
. - list: Renamed the
ListStyle
plugin toListProperties
. 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 tofalse
. - revision-history: Renamed
Revision#data
toRevision#diffData
. TheRevision#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 inRevisionRepository#addRevision()
. - revision-history: Removed
RevisionTracker#isLocked
. - revision-history: Removed
RevisionTracker#updateRevision()
and added#update()
and#saveRevision()
instead. - revision-history:
RevisionTracker
no longer usesRevisionHistoryAdapter#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 totrue
. (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 totrue
. (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)
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.