Still on Drupal 7? Security support for Drupal 7 ended on 5 January 2025. Please visit our Drupal 7 End of Life resources page to review all of your options.
This lays out what remains to be done after #3231364: Add CKEditor 5 module to Drupal core lands in Drupal core.
This plan was originally taken from the IS at #2966864: Add optional support for CKEditor 5 in D9 so we can remove CKE 4 from Drupal 10, and after that from #3201824: Roadmap to core.
Roadmap to Stable
- ✅ Ensure that sites can update from using CKE4 to CKE5 safely when using no contributed CKEditor modules
- Currently none
- ✅ Ensure contrib modules can do everything: translations, automatic upgrade path from CKE4..
- Currently none
- ✅ Ensure CKE5 equivalent plugins of CKE4 generate/support equivalent markup
- Currently none
- ✅ Ensure CKE5 functionality matches that of Drupal core's CKE4:
- Currently none
- ✅ Documentation gates:
- Currently none
- ✅ Theming CKEditor 5
- Currently none
- ✅ Accessibility
- Currently none
- ✅ Test coverage, reliability and maintainability matching or exceeding CKEditor 4's:
- Currently none
- ✅ Low-hanging fruit major UX improvements over CKEditor 4:
- Currently none
- Superior configuration UX:
- Currently none.
- ✅ Performance
- Currently none.
- ✅ #3307186: Mark CKEditor 5 stable
Roadmap after Stable
- Upstream Drupal improvements that would simplify or improve CKEditor 5:
- #3226673: API addition: \Drupal\editor\Plugin\EditorPluginInterface::getDefaultSettings() should accept old Editor + Format to generate smart defaults
- #3231322: Fix a @todo: move a form alteration to the CKEditor 5 plugin's subform definition
- #3231341: Deprecate EditorLinkDialog, EditorImageDialog and EditorMediaDialog in Drupal 10.1 for removal in Drupal 11
- #3231342: [PP-2] Introduce ConfigEntityForm to standardize use of validation constraints for config entities
- #3231347: Add Editor::setFilterformat()
- #3231354: [PP-1] [META] Discuss: merge the Editor config entity into the FilterFormat config entity
- #3246260: Simplify CKEditor5ImageController once #2940383 lands
- #3263668: Re-enable inline form errors in assessActiveTextEditorAfterBuild function → blocked on Vertical Tabs bug: #2911932: Correct vertical tab does not focus on form validation
- #3269101: [PP-1] Ensure enabled CKEditor 5 plugins remain available by calculating corresponding dependencies → blocked on Text Editor module bug: #2950795: CKEditor 5 plugin module dependency not added to text format configuration
- Obsoleteness of upgrade path in Drupal 11:
- Performance:
- Media improvements
- #3196593: Ease the transition to Media: save image uploads in CKEditor 5 as media entities when media is enabled? (or module specific solution if core issue won't land)
- #3073901: Determine an upgrade path from CKEditor image button to media library (or module specific solution if core issue won't land)
- Low-hanging fruit major UX improvements over CKEditor 4:
- Superior configuration UX:
- Maintainability:
- Accessibility:
Completed
This section mimics the structure of the above sections.
💯 Roadmap to Alpha
- ✅ Create the ckeditor5 module
- ✅ Create an @Editor PHP plugin with the ID ckeditor5.
- ✅ Create a Drupal.editors JS plugin with the ID ckeditor5.
- ✅ Getting CKE5 (CKEditor 5) to load at all on the /node/add/article form.
- ✅ #3201820: Manually test that CKE 5 can be used in off-canvas
- ✅ Enable a Drupal + CKE5 ecosystem
- ✅ A CKE5 configuration UI
- ✅ Ensure Quick Edit integration works
- ✅ Evaluate CK4 plugins and match features
- ✅ #3201821: Add JavaScript test coverage for CKE 5
- ✅ #3206686: IE11 warning for CKE5 in Drupal 9
💯 Roadmap to Beta
- ✅ #3215506: Plugins should be enableable based on toolbar configuration
- ✅ Ensure filter_html's HTML restrictions are respected inside CKE5 — tackled in #3201637: Figure out how to prevent data loss during upgrade/migration path
- ✅ #3206687: Toolbar UI accessibility review
- ✅ #3201641: Improve the HTML filter configuration UX
- Enable translation features for CKEditor 5
Roadmap to Stable
- Ensure that sites can update from using CKE4 to CKE5 safely when using no contributed CKEditor modules
- #3291744: Ensure Editor config entities using CKEditor 4 only store plugins settings for actually enabled plugins
- Ensure that Arbitrary HTML is not lost: #3216021: Automatically use CKE5's General HTML Support feature on text formats without any TYPE_HTML_RESTRICTOR filter + add `sourceEditing` button
- #3201637: Figure out how to prevent data loss during upgrade/migration path
- #3216015: Generate CKEditor 5 configuration based on pre-existing text format configuration
- #3245079: Automatic upgrade path always enables all <h*> tags when only >=1 was enabled before
- #3245320: Automatic upgrade path always disables image uploads — in the UI
- #3228464: API for contrib projects to load CKEditor translations
- #3227822: [GHS] Ensure GHS works with our custom plugins, to allow adding additional attributes
- #3268174: Bug in CKE 4 → 5 upgrade path "format" does not always map to "heading", it could map to "codeBlock" too, or both, or neither
- #3269868: [drupalImage] Some Image attributes are lost in edge cases where image upcasts into inline image
- #3273527: Upgrade path never configures the ckeditor5_heading plugin to allow <h1>
- #3273312: Upgrading from CKEditor 4 for a text format that has FilterInterface::TYPE_MARKUP_LANGUAGE filters enabled
- #3268318: [drupalMedia] <a> with GHS allowed attributes downcast wraps data-caption with <a>
- #3230230: Enable table captions; override CKE5's default downcast to generate <table><caption></table> instead of <figure><table><figcaption></figure>
- #3268311: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5
- #3272516: Deprecate FilterInterface::getHTMLRestrictions()' forbidden_tags functionality
- #3273510: CKEditor 5 crash when multiple alignment buttons are activated due to duplicate configuration thanks to #3259593: Alignment being available as separate buttons AND in dropdown is confusing
- #3247634: [upstream] [drupalImage] Unlinking linked inline images while GHS is enabled: wrapping <a> is impossible to remove
- #3271418: [upstream] [drupalMedia] Linked media wrapped with <div> doesn't upcast correctly
- #3274651: Impossible to enable <ol type> or <ul type> with GHS: switch to List's successor, DocumentList
- #3276217: [drupalMedia] add tests to confirm GHS attributes are retained in linked media
- #3273983: Do not assume that plugin supporting <tag attr> also supports <tag> in SourceEditingRedundantTags and upgrade path
- #3290810: Remove updates added prior to 9.4.0 (9.4.4 for ckeditor) and add 9.4.0 database dumps
- #3268306: [GHS] Custom/unofficial HTML tags not retained: <drupal-media>, <drupal-entity>, <foobar>
- Ensure contrib modules can do everything: translations, automatic upgrade path from CKE4 …
- #3226335: Follow-up for #3216015: allow contrib & custom Drupal modules providing CKEditor 4 plugins to specify their CKEditor 5 equivalents + settings to be migrated
- #3228778: Drupal-specific CKEditor 5 plugins should be able to use Drupal's JS translation API: Drupal.t()
- #3245723: Follow-up for #3201637: omitting PrimitiveTypeConstraint violations for filter settings is implemented too broadly
- #3245807: DX: allow contrib modules to subclass \Drupal\Tests\ckeditor5\Kernel\ValidatorsTest
- #3274278: Migrate "codetag" contrib CKEditor 4 plugin to built-in equivalent in core's CKEditor 5
- #3273325: CKE5 and contrib: better "next action" description on upgrade path messages
- Ensure CKE5 equivalent plugins of CKE4 generate/support equivalent markup: #3222801: [META] Ensure CKE5 equivalent plugins of CKE4 generate/support equivalent markup
- Infra: #3215466: Attribute values not accounted for in CKEditor5PluginManager::getProvidedElements
- Infra: #3207660: Allow using a subset of the tags supported by the enabled CKEditor 5 plugins
- #3222851: <cite>
- #3222847: <img width height>
- #3222838: Configure basicStyles.Italic to output <em> instead of <i>
- #3222842: <a hreflang> + <blockquote cite>
- #3222847: <img width height>
- #3220293: Make all supported heading types visible in the UI
- #3222840: <ol start>
- #3222852: <dl> <dt> <dd> by introducing "Manually editable HTML tags" configuration on Source Editing
- #3224256: <h* id> (or more generically: <$block id>)
- #3222808: Follow-up for #3201646: markup in image captions is lost
- #3228346: Follow-up for #3222852: revert ineditable attributes (<blockquote cite> and <a hreflang>) now that Source Editing plugin can handle arbitrary elements & attributes
- #3246168: Images are not linkable through UI; already linked images are unlinked (data loss!)
- #3246169: Embedded media are not linkable through UI; already linked embedded media are unlinked (data loss!)
- #3259493: [GHS] Unable to limit attribute values: ::allowedElementsStringToHtmlSupportConfig() does not generate configuration that CKEditor 5 expects
- #3246365: [drupalMedia] Show the Image Media's default alt text that is being overridden
- #3260853: [GHS] Partial wildcard attributes (<foo data-*>, <foo *-bar-*>, <foo *-bar>) and attribute values (<h2 id="jump-*">) not yet supported
- #3260869: Resolve mismatch between <$block> interpretation by CKEditor 5 and Drupal
- #3268860: Elements wrapping <drupal-media> are not retained
- #3268307: $block wildcard resolves into a superset of the actual $block tags
- Ensure CKE5 functionality matches that of Drupal core's CKE4:
- #3201646: Add support for image caption (<img data-caption>)
- #3211050: Add "Alignment" plugin
- #3211125: Add "Block Indentation" plugin, but only allow list indentation
- #3211282: Add plugins which are provided as a part of essential plugin: Undo/Redo
- #3211610: Add "Horizontal line" plugin.
- #3227871: Add ckeditor5-paste-from-office to allow pasting from Microsoft Office & Google Docs
- #3227875: Add ckeditor5-remove-format to allow removing formatting from pasted content
- #3227890: Add ckeditor5-special-characters to allow inserting special characters for users that do not know the native picker
- #3247246: Attribute value encoding not compatible with Xss::filter()
- #3248448: Dialog loading text is unstyled
- #3260554: [drupalMedia] Support alignment on <drupal-media>
- #3246380: [drupalMedia] Media previews do not update after alt text was modified
- #3224652: [drupalImage] Add ckeditor5-image's imageresize plugin to allow image resizing
- #3246385: [drupalMedia] Support captions on <drupal-media>
- #3264775: [drupalMedia] Toolbar should be visible when element inside <drupalMedia> is focused
- #3264727: [drupalMedia|drupalImage] Allow removing data-align in the UI, and making an image inline
- #3245950: [upstream] <script> tag support in GHS
- #3256566: [upstream] <style> tag support in GHS
- #3263384: Add ckeditor5-code-block package and CodeBlock plugin
- #3245720: [drupalMedia] Support choosing a view mode for <drupal-media>
- #3276974: [drupalMedia] Media View Modes don't work if alignment not enabled
- #3269657: [drupalMedia] The CKEditor 4 → 5 upgrade path for the media_embed filter should not forcefully allow the `data-view-mode` attribute on `<drupal-media>`
- #3274937: Get CKEditor 5 to work in (modal) dialogs
- #3222797: Upgrade path from CKEditor 4's StylesCombo to CKEditor 5's Style
- #3301631: Regression with CKEditor 35.0.1 and modal dialogs
- #3294908: Configuration overlaps between Styles and other CKE5 plugins
- #3222756: Allow using images from external source
- ✅ Documentation gates:
- #3205654: ckeditor5_hook_help()
- #3201186: Create ckeditor5.api.php (the core equivalent of README.md) + CKEditor5PluginDefinition::toArray()
- #3243850: hook_ckeditor5_plugin_info_alter()'s example sets ['drupal']['config'], but that's not one of the documented definition properties
- #3248430: Improve Drupal.ckeditor5 documentation
- #3248425: Ensure that all classes and functions in Drupal-specific CKEditor 5 plugins are documented
- Theming CKEditor 5
- Accessibility
- #1872206: Improve CKEditor toolbar configuration accessibility
- #3218252: Toolbar configuration fieldset aria cleanup
- #3218260: Safari focus outline on buttons leaves artifacts after blur
- #3207451: Toolbar UI Button size accessibility
- #3238257: Fragment link pointing to <textarea> should be redirected to CKEditor 5 instance when CKEditor 5 replaced that textarea
- #3245735: Follow-up for #3222852: validation errors are not associated with the correct form element
- #3258030: Text fields using CKEditor 5 do not get visual error indicator
- #3258668: Extraneous closing parentheses and curly brace in visually-hidden button description text
- #3231321: Improve keyboard accessibility in a particular edge case
- #3261942: Compatibility issues with inline form errors
- #3218297: Voiceover + Safari reads aria-describedby twice when focusing toolbar button
- #3248440: [drupalMedia] Media embed attributes are rendered in container div in editing view
- #3239423: Toolbar UI accessibility review: round 2
- #3270112: Excessive aria-live announcing from ckeditor5-admin-help-message live region
- #3270110: Toolbar config items missing "press arrow to do {x}" instructions for screenreaders
- #3270108: Editor does not load when using Edge + WHCM
- #3222757: [drupalImage] Make image alt text required or strongly encouraged
- #3306216: Contrast perception issues with icons including low-opacity fills
- #3283800: [upstream] CKE5 dropdowns keyboard support
- #3283801: [upstream] CKE5 dropdown focus handling is not fully accessible
- #3283803: [upstream] CKE5 toggleable toolbar items not enough contrast
- #3283804: [upstream] CKE5 dropdown screenreader support
- #3283802: Update CKEditor 5 to 35.3.2 to fix voice control/IME on some platforms
- Test coverage, reliability and maintainability matching or exceeding CKEditor 4's:
- #3206522: Add FunctionalJavascript test coverage for media library
- #3201641: Improve the HTML filter configuration UX
- #3228920: Improve internal consistency: consistent variable names and return type syntax
- #3231327: Plugin definition DX: validate ckeditor5.drupal.elements items
- #3231362: Refactor ImageUpload's ::validateImageUploadSettings() into the proper validate and submit methods
- #3228505: Plugin definition DX: automatically check for plugin definitions whether their ::getDefaultSettings() matches the config schema
- #3243867: ckeditor5_module_implements_alter() looks like it has incorrect logic
- #3245400: Add an @throws PHPDoc everywhere exceptions are thrown
- #3246280: Defense in depth: add anti-CSRF token to this module's routes
- #3246521: Make plugin.manager.ckeditor4to5upgrade.plugin a private service
- #3246524: Make more (all?) classes @internal
- #3247711: Simplify and accelerate builds: update our use of the CKEditor 5 DLL manifest
- #3248188: Plugin definition DX: validate drupal.conditions
- #3248423: Decide how CKEditor 5-provided types should be referenced
- #3259174: Add missing CKE5 SmartDefaultSettings test coverage (wildcard tag with unsupported attribute)
- #3228334: Refactor HTMLRestrictionsUtilities to a HtmlRestrictions value object
- #3206523: Add FunctionalJavascript test coverage for image upload
- #3267721: Add DrupalCI step for ensuring that CKEditor 5 build files are build correctly
- #3231337: [drupalMedia] Remove manual dataDowncast from DrupalMediaEditing
- #3231328: SmartDefaultSettings should select the CKE5 plugin that minimizes creation of HTML restriction supersets
- #3228580: Follow-up for #3222852: additional test coverage for real-time validation race conditions
- #3265626: Changes to "Manually editable HTML tags" lost if form is submitted without triggering AJAX
- #3231334: Global attributes (<* lang> and <* dir="ltr rtl">): validation + support (fix data loss)
- #3229078: Unit tests for all @CKEditor5Plugin plugin classes
- #3247683: Disable CKEditor 5's automatic link decorators (in Drupal filters should be used instead)
- #3268983: [regression] FilterHtml throws Unsupported operand types error when * used in tag attribute
- Low-hanging fruit major UX improvements over CKEditor 4:
- Superior configuration UX:
- #3201641: Improve the HTML filter configuration UX
- #3216015: Generate CKEditor 5 configuration based on pre-existing text format configuration
- #3226694: Follow-up for #3216015: refactor SmartDefaultSettings to return messages rather than sending them
- #3248177: Language toolbar item cannot be removed from the toolbar
- #3259443: Plugin settings do not appear when a configurable plugin is added AFTER removing all buttons
- #3261585: Remove IE11 warning for CKEditor 5 in Drupal 10, since Drupal 10 does not support IE anyway
- #3260857: Expand SourceEditingRedundantTagsConstraintValidator to also check attributes and attribute values
- #3261943: Confusing behavior after pressing "Apply changes to allowed tags" with invalid value
- #3228691: Restrict allowed additional attributes to prevent self XSS
- #3245967: Messages upon switching to CKEditor 5 are overwhelming
- Performance
- ✅ Moving things into core that can only happen once it is in core:
After stable:
- Upstream Drupal improvements that would simplify or improve CKEditor 5:
- Maintainability:
- #3275237: Don't convert, instead use response.entity_type in DrupalImageUploadEditing
Comments
Comment #2
wim leersAdded:
Comment #3
wim leersDocumentation gates are complete as of yesterday.
Comment #4
wim leersis done.
Added #3228505: Plugin definition DX: automatically check for plugin definitions whether their ::getDefaultSettings() matches the config schema to .
Comment #5
wim leers#3226335: Follow-up for #3216015: allow contrib & custom Drupal modules providing CKEditor 4 plugins to specify their CKEditor 5 equivalents + settings to be migrated and #3226694: Follow-up for #3216015: refactor SmartDefaultSettings to return messages rather than sending them landed yesterday, together they make the 4-to-5 upgrade path entirely possible and testable!
Comment #6
wim leersFix parent issue 😅
Comment #7
wim leersLong overdue for another roadmap update. Many dozens of issues fixed since then. Not focusing on what's been done, but on the work we identified.
Edge cases:
#3239376: [unbreak tests] SA-CORE-2021-009 broke tests, #3244911: Automatic upgrade path failing when CKEditor 4 has the StylesCombo plugin configured, #3245387: CKEditor5 has an empty settingsForm() method that neither inherits from nor is called by anything, #3245390: CKEditor5::validatePair() and CKEditor5PluginManager::getPluginConfiguration() throw inconsistent exception types, #3245772: Update CKEditor5AllowedTagsTest following the commit of #2763075 into Drupal 9.3, #3246448: Fix cspell & phpcs failures caused by both becoming more strict, #3246647: Filter settings are not removed when a filter is disabled, #3246955: Harden drupal-media by namespacing model attributes
Added:
Post-stable, Upstream improvements that would simplify or improve CKEditor 5:
Comment #8
lauriiiAdding issues discovered during FEFM review to the roadmap:
Comment #9
wim leersComment #10
andypostit needs some fixes for PHP 8.1 https://www.drupal.org/pift-ci-job/2235570
Comment #11
larowlanCan you open a critical for that @andypost
Comment #12
andypostFiled child issue #3249240: HTMLRestrictionsUtilities:: providedElementsAttributes() causes deprecations on PHP 8.1
Comment #13
wim leers#3249240: HTMLRestrictionsUtilities:: providedElementsAttributes() causes deprecations on PHP 8.1 has been fixed since.
#3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration was not in here yet, and IMHO is pretty damn important! Added that to .
Comment #15
mglamanMaybe I missed it, so apologies if I did, but is there an issue to track making CKEditor5 the default for Drupal 10 in the Standard installation, or is that not the plan?
Comment #16
xjmComment #17
wim leers#15: there's no separate issue for that.
ckeditor.module
will be removed from Drupal 10. As part of removing that module, we'll also need to change the Standard install profile to useckeditor5.module
instead.I'd swear such an issue already existed, but I cannot find it right now. Maybe @xjm knows? 🤞
Comment #18
wim leersTwo new stable-blockers discovered:
Comment #19
wim leers#3228778: Drupal-specific CKEditor 5 plugins should be able to use Drupal's JS translation API: Drupal.t() landed, which means that only two issues remain under :
Comment #20
wim leersLanded:
New and landed:
Comment #21
catchTook a look at the issue summary to see how we're doing. There are more done issues than outstanding which is great. Is it worth moving the done issues to a 'done' dump at the bottom, so it's easier to scan the outstanding issues at the top? I don't dare do this without floating it first since it'd be a pain to put them all back again.
Comment #22
wim leersAdded #3263384: Add ckeditor5-code-block package and CodeBlock plugin to .
#21: Agreed — @tim.plunkett is going to have a go at that 😊
Comment #23
tim.plunkettAttempted to reorganize the roadmap.
Comment #24
tim.plunkettMissed a spot
Comment #25
wim leersThanks, @tim.plunkett!
Comment #26
wim leers#3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration falls in the "performance" bucket.
Comment #27
gábor hojtsyFixing an item that was not expanded in the Completed section.
Comment #28
wim leers#3228334: Refactor HTMLRestrictionsUtilities to a HtmlRestrictions value object landed.
Comment #29
wim leersAdded two new stable blocking bugs:
Comment #30
wim leersTwo more finished:
Comment #31
wim leersThree outdated (irrelevant now or done in other issue):
Comment #32
wim leers#3246188: Vertical tabs auto collapse on viewports smaller than 1360px on certain configuration actions is a Claro bug, not a CKEditor 5 issue.
Removing it from this roadmap.
Comment #33
wim leers#29 added two new major stable blocking bugs. But there are more that we created in the past few weeks. (More to follow tomorrow, but here's what I gathered so far.)
Comment #34
wim leers#3248440: [drupalMedia] Media embed attributes are rendered in container div in editing view landed.
Comment #35
wim leers#3259493: [GHS] Unable to limit attribute values: ::allowedElementsStringToHtmlSupportConfig() does not generate configuration that CKEditor 5 expects just landed and was still missing here. It also unblocks #3260853: [GHS] Partial wildcard attributes (<foo data-*>, <foo *-bar-*>, <foo *-bar>) and attribute values (<h2 id="jump-*">) not yet supported and #3260869: Resolve mismatch between <$block> interpretation by CKEditor 5 and Drupal, both of which were missing from the roadmap.
Comment #36
wim leers#3246385: [drupalMedia] Support captions on <drupal-media> landed!
Comment #37
wim leers#3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration is blocked on #3232810: [PP-1] Allow setting aggregation groups for js files in library definitions, which is an
asset library system
component issue, notckeditor5.module
.A key part was split off from #3224261: #3264512: Enable aggregation for CKEditor 5 assets. This already improves front-end performance significantly: from "bad" to "good". #3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration will get us from "good" to "optimal".
Therefore I propose moving #3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration from stable blocking to post-stable. @nod_, @catch, @lauriii: thoughts?
Comment #38
nod_+1 for post-stable, it's "good enough" right now.
Comment #39
catchAgreed with making #3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration nice-to-have. The two asset system issues will be a massive improvement, but ckeditor5 relying on core's existing asset aggregation is fine for stable.
Comment #40
wim leers👍, moved #3224261: [PP-2] Front-end performance: concatenate CKEditor 5 JS assets for every unique configuration to post-stable!
Comment #41
wim leers#3246365: [drupalMedia] Show the Image Media's default alt text that is being overridden landed!
Comment #42
wim leersI was the only person advocating for
to be stable blockers. I advocated for that for a long time:
but … the Standard install profile still has not enabled
media
by default, let alonemedia_library
😔😔😔It makes no sense to block CKEditor 5 becoming stable on something that is A) a separate concern, B) has lingered for many years.
So moved this to "post-stable".
Comment #43
wim leersYay, #3227822: [GHS] Ensure GHS works with our custom plugins, to allow adding additional attributes landed, which was the last remaining item under ! 🥳
Comment #44
wim leers6 days ago, in #33, I wrote: — well, consider today that "tomorrow" 😅
Roughly 50% of the remaining open issues created since the beginning of 2022 are not stable blocking, and the remaining ~50% are. I added those to the roadmap here — they are:
Comment #45
wim leers#3260853: [GHS] Partial wildcard attributes (<foo data-*>, <foo *-bar-*>, <foo *-bar>) and attribute values (<h2 id="jump-*">) not yet supported landed!
Comment #46
wim leers#3264775: [drupalMedia] Toolbar should be visible when element inside <drupalMedia> is focused landed!
Comment #47
wim leers#3264727: [drupalMedia|drupalImage] Allow removing data-align in the UI, and making an image inline landed!
Comment #48
wim leers#3260032: CKEditor 5 adds ie11.user.warnings library to every page, triggering a FOUC even for anonymous users landed!
EDIT: and that was the last https://www.drupal.org/about/core/policies/core-change-policies/drupal-c....
issue! 🥳 AFAICT this means we now meet the Drupal core "Performance" gate:Comment #49
wim leers#3194084: Support functionality equivalent to ckeditor_stylesheets landed!
Comment #50
wim leers#3245950: [upstream] <script> tag support in GHS is fixed thanks to #3261600: Update to CKEditor5 v32.0.0 having landed!
Comment #51
wim leersJust realized that #3248430: Improve Drupal.ckeditor5 documentation is in the wrong bucket; it belongs under IMHO.
Comment #52
wim leersNew #3268174: Bug in CKE 4 → 5 upgrade path "format" does not always map to "heading", it could map to "codeBlock" too, or both, or neither — discovered in #3263384: Add ckeditor5-code-block package and CodeBlock plugin.
issue:Comment #53
wim leers@lauriii discovered a critical bug unfortunately: #3268306: [GHS] Custom/unofficial HTML tags not retained: <drupal-media>, <drupal-entity>, <foobar>.
Comment #54
wim leers@lauriii discovered two more bugs: #3268318: [drupalMedia] <a> with GHS allowed attributes downcast wraps data-caption with <a> + #3268311: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5.
Comment #55
wim leersJust triaged all remaining issues with @lauriii.
We updated a few issues with comments or improved titles.
#3248425: Ensure that all classes and functions in Drupal-specific CKEditor 5 plugins are documented should've been under
And we identified X issues that should no longer be stable blockers:
We didn't go through
because we felt it'd be important to have a with us to do that.@lauriii will start working on #3268311: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5 now because we identified that as the highest risk/highest uncertainty one that remains.
Comment #56
wim leers#3248430: Improve Drupal.ckeditor5 documentation landed!
Comment #57
wim leers#3256566: [upstream] <style> tag support in GHS is done thanks to #3269064: Update to CKEditor 5 v33.0.0. #3230230: Enable table captions; override CKE5's default downcast to generate <table><caption></table> instead of <figure><table><figcaption></figure> is now unblocked.
Comment #58
wim leers#3268174: Bug in CKE 4 → 5 upgrade path "format" does not always map to "heading", it could map to "codeBlock" too, or both, or neither landed!
Comment #59
wim leers#3267721: Add DrupalCI step for ensuring that CKEditor 5 build files are build correctly was missing from the roadmap … but it just landed!
Comment #60
wim leersComment #61
wim leers#3260869: Resolve mismatch between <$block> interpretation by CKEditor 5 and Drupal is finally in!
But … @lauriii identified #3268307: $block wildcard resolves into a superset of the actual $block tags as an additional stable blocker, so that now takes its place. Fortunately it's a lot simpler.
Comment #62
wim leers@lauriii found another data loss stable blocker: #3269868: [drupalImage] Some Image attributes are lost in edge cases where image upcasts into inline image.
Comment #63
bnjmnmComment #64
wim leersLanded:
Comment #65
tim.plunkettMoving two issues from Stable to Post-Stable
Comment #66
wim leers#3270108: Editor does not load when using Edge + WHCM and #3259443: Plugin settings do not appear when a configurable plugin is added AFTER removing all buttons landed.
Comment #67
wim leersMade a mistake in #66.
Comment #68
catchOne question on the upgrade path, apart from ckeditor4, what happens if you try to add editor support to an existing format that doesn't have an editor enabled?
Also, what happens when you switch formats from a format without an editor enabled, to ckeditor5?
Comment #69
wim leersSmartDefaultSettings
computes a CKEditor 5 configuration matching the text format's HTML restrictions, to ensure we support a superset. See thefilter_only__filter_html
test case in\Drupal\Tests\ckeditor5\Kernel\SmartDefaultSettingsTest::provider()
for an example.Same thing as happens when switching to CKEditor 4, thanks to #2099741: Protect WYSIWYG Editors from XSS Without Destroying User Data 😊
Comment #70
catchAhh OK on #3239012: [11.x] Remove the CKEditor 4 upgrade path
SmartDefaultSettings
is mentioned, but it's just removing a ckeditor4-specific method, so the rest stays and that's makes this all work. Thanks!Comment #71
wim leersWell, that became more nuanced in the meantime 😅 See #3239012-8: [11.x] Remove the CKEditor 4 upgrade path, and more importantly, see #3270831: Make the CKEditor 4 → 5 upgrade path work even when the CKEditor 4 module is removed! 🤓 😄
Comment #72
wim leers#3263384: Add ckeditor5-code-block package and CodeBlock plugin landed.
Comment #73
wim leers#3261585: Remove IE11 warning for CKEditor 5 in Drupal 10, since Drupal 10 does not support IE anyway landed.
Comment #74
wim leers#3268860: Elements wrapping <drupal-media> are not retained landed!
Comment #75
wim leers@lauriii found another upstream critical data loss bug: #3271418: [upstream] [drupalMedia] Linked media wrapped with <div> doesn't upcast correctly.
Comment #76
wim leers#3269868: [drupalImage] Some Image attributes are lost in edge cases where image upcasts into inline image landed!
Comment #77
wim leers#3260857: Expand SourceEditingRedundantTagsConstraintValidator to also check attributes and attribute values landed!
Comment #78
wim leers#3268307: $block wildcard resolves into a superset of the actual $block tags landed.
Comment #79
wim leers#3231336: Simplify HtmlRestrictions and FundamentalCompatibilityConstraintValidator now that "forbidden tags" are deprecated is no longer a stable blocker due to #3272516: Deprecate FilterInterface::getHTMLRestrictions()' forbidden_tags functionality.
Comment #80
wim leers#3222757: [drupalImage] Make image alt text required or strongly encouraged landed! The last accessibility stable blocker!
Comment #81
wim leersHappy to report that I discovered #3228580: Follow-up for #3222852: additional test coverage for real-time validation race conditions has been irrelevant for many months, ever since #3228477: CKEditor5PluginConfigurableInterface should extend PluginFormInterface and ConfigurableInterface instead of adding ::settingsForm() happened! It just was never a high enough priority to investigate. But with few issues remaining, it made sense today :)
Comment #82
wim leers#3230230: Enable table captions; override CKE5's default downcast to generate <table><caption></table> instead of <figure><table><figcaption></figure> is in the wrong bucket.
Same for #3247634: [upstream] [drupalImage] Unlinking linked inline images while GHS is enabled: wrapping <a> is impossible to remove, #3268318: [drupalMedia] <a> with GHS allowed attributes downcast wraps data-caption with <a> and #3268311: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5
All four belong in the
bucket.Moved them.
Comment #83
wim leers#3222756: Allow using images from external source is also in the wrong bucket: the markup is supported already (i.e. it is not lost), we're just lacking the UX to create images that are externally hosted ("hotlinked").
(This is a very bad practice, but we should ensure that existing content doesn't break.)
Comment #84
wim leers#3261599: Use CKEditor 5's native <ol start> support (and also support <ol reversed>) is also in the wrong bucket: the markup is supported already, and editable already. But instead of requiring users to go to "Source Editing" today (just like in CKEditor 4, actually!), we should allow them to use the native functionality instead.
So, moved to
.Comment #85
wim leersFinally, #3228691: Restrict allowed additional attributes to prevent self XSS is also in the wrong bucket: this is purely a thing to improve the configuration UX and overall security — you can configure CKEditor 4 to allow self-XSS, but once this lands, you won't be able to anymore. Which means that it'll only be possible to self-XSS if already there are no HTML restrictions, i.e. when using the text format.
Therefore, moving to
.Consequently, the
bucket is done, which more closely reflects reality: all of the markup that could be edited with CKE4 can already be edited with CKE5 today! 🤓🥳🚀 ****** With the exception of a few upstream critical data loss bugs that only manifest in very specific circumstances, listed in the
bucket.Comment #86
wim leers#3269657: [drupalMedia] The CKEditor 4 → 5 upgrade path for the media_embed filter should not forcefully allow the `data-view-mode` attribute on `<drupal-media>` was split off from #3245720: [drupalMedia] Support choosing a view mode for <drupal-media>, but it's an essential follow-up. So adding to the roadmap :)
Comment #87
wim leers#3268983: [regression] FilterHtml throws Unsupported operand types error when * used in tag attribute is a bug introduced by #3228334: Refactor HTMLRestrictionsUtilities to a HtmlRestrictions value object 😬
Comment #88
wim leersNew stable blockers discovered (so far…) at Drupal Dev Days Ghent 2022:
🥳 Better to know about these now rather than months from now!
Comment #89
wim leersComment #90
wim leersNew stable blockers, both relating to the upgrade path for contrib modules:
Comment #91
wim leersOops, that first one should have been #3274278: Migrate "codetag" contrib CKEditor 4 plugin to built-in equivalent in core's CKEditor 5 of course.
Comment #92
wim leersOne more stable blocker discovered: #3274937: Get CKEditor 5 to work in (modal) dialogs.
Comment #93
wim leers#3268318: [drupalMedia] <a> with GHS allowed attributes downcast wraps data-caption with <a> is fixed, which is possible now that we've done #3269651: Update Drupal 9.3.x to CKEditor 5 v34.0.0 along with other un-backported issues 👍
Comment #94
wim leers#3274651: Impossible to enable <ol type> or <ul type> with GHS: switch to List's successor, DocumentList is another stable blocker that was discovered at DDD: it results in losing the
type
attribute on either<ol>
or<ul>
.Comment #95
wim leers#3245720: [drupalMedia] Support choosing a view mode for <drupal-media> just landed, which means #3269657: [drupalMedia] The CKEditor 4 → 5 upgrade path for the media_embed filter should not forcefully allow the `data-view-mode` attribute on `<drupal-media>` is now unblocked!
Comment #96
wim leers#3274278: Migrate "codetag" contrib CKEditor 4 plugin to built-in equivalent in core's CKEditor 5 landed!
Comment #97
wim leers#3273325: CKE5 and contrib: better "next action" description on upgrade path messages just landed!
Comment #98
lauriiiAdded #3276217: [drupalMedia] add tests to confirm GHS attributes are retained in linked media to the roadmap.
Comment #99
wim leers#3230230: Enable table captions; override CKE5's default downcast to generate <table><caption></table> instead of <figure><table><figcaption></figure> and #3261943: Confusing behavior after pressing "Apply changes to allowed tags" with invalid value landed!
Comment #100
wim leers@bnjmnm just found a new stable-blocking bug: #3238333: Roadmap to CKEditor 5 stable in Drupal 9 👍
Comment #101
wim leersObviously the link in #100 was wrong 🙈 It should've been #3276974: [drupalMedia] Media View Modes don't work if alignment not enabled.
Comment #102
wim leersGood news: #3268311: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5 has been fixed upstream, and we got the fix thanks to #3274767: Update to CKEditor 5 v34.0.0. We still had that issue to write an explicit test, but per #3268311-14: [upstream] [drupalMedia] GHS-enabled markup in data-caption crashes CKEditor 5, that is not possible. One less stable blocker! 🥳
Comment #103
wim leers#3231334: Global attributes (<* lang> and <* dir="ltr rtl">): validation + support (fix data loss) landed :)
Comment #104
wim leers#3248425: Ensure that all classes and functions in Drupal-specific CKEditor 5 plugins are documented just landed!
Comment #105
wim leers#3229078: Unit tests for all @CKEditor5Plugin plugin classes and #3261599: Use CKEditor 5's native <ol start> support (and also support <ol reversed>) landed 👍
And non-stable blocker #3277405: Update @ckeditor/ckeditor5-list to v34.0.1 also landed, which means that stable blocker #3274651: Impossible to enable <ol type> or <ul type> with GHS: switch to List's successor, DocumentList is now unblocked 🥳
Comment #106
wim leersI did another round of
ckeditor5.module
issue queue triaging. Results:Comment #107
wim leers#3276974: [drupalMedia] Media View Modes don't work if alignment not enabled landed!
Comment #108
wim leers#3228691: Restrict allowed additional attributes to prevent self XSS landed 🚀
Comment #109
wim leersMoved it to the wrong place 🙈
Comment #110
wim leers#3272516: Deprecate FilterInterface::getHTMLRestrictions()' forbidden_tags functionality landed!
Comment #111
wim leers#3269657: [drupalMedia] The CKEditor 4 → 5 upgrade path for the media_embed filter should not forcefully allow the `data-view-mode` attribute on `<drupal-media>` landed 👍
Comment #112
wim leers#3259593: Alignment being available as separate buttons AND in dropdown is confusing landed, which means #3273510: CKEditor 5 crash when multiple alignment buttons are activated due to duplicate configuration no longer occurs! Marking it as fixed :)
Comment #114
wim leers#3277438: Update to CKEditor 5 v34.1.0 allowed us to mark 2 stable blockers as done! 🥳
🥳
10 stable blockers remain, of which 2 are blocked on upstream.
Comment #115
wim leers#3274651: Impossible to enable <ol type> or <ul type> with GHS: switch to List's successor, DocumentList landed!
Comment #116
wim leers#3276217: [drupalMedia] add tests to confirm GHS attributes are retained in linked media landed.
Comment #117
wim leers5 new stable blockers, all for accessibility. Thanks @bnjmnm for triaging https://github.com/ckeditor/ckeditor5/labels/domain%3Aaccessibility:
Comment #118
wim leers#3247683: Disable CKEditor 5's automatic link decorators (in Drupal filters should be used instead) and #3273983: Do not assume that plugin supporting <tag attr> also supports <tag> in SourceEditingRedundantTags and upgrade path landed! That means #3222797: Upgrade path from CKEditor 4's StylesCombo to CKEditor 5's Style is now unblocked 👍
Comment #119
wim leers#3274937: Get CKEditor 5 to work in (modal) dialogs is in!
Comment #120
bnjmnmComment #121
xjmI tagged the outstanding children directly, but also tagging the parent in case more issues surface.
Comment #122
catchComment #123
tim.plunkettComment #124
catchComment #125
catchComment #126
catchComment #127
catchComment #128
catchComment #129
feuerwagenComment #130
catchComment #131
wim leers#3290810: Remove updates added prior to 9.4.0 (9.4.4 for ckeditor) and add 9.4.0 database dumps landed.
Comment #132
wim leersAdded #3294908: Configuration overlaps between Styles and other CKE5 plugins.
Comment #133
wim leers#3294908: Configuration overlaps between Styles and other CKE5 plugins landed!
Comment #134
wim leers#3268306: [GHS] Custom/unofficial HTML tags not retained: <drupal-media>, <drupal-entity>, <foobar> landed 👍
Comment #135
bnjmnmComment #136
wim leers#3306216: Contrast perception issues with icons including low-opacity fills landed!
Comment #137
wim leers#3222756: Allow using images from external source landed ✔️
Comment #138
xjmThe only outstanding stable blocker is the dictation issue, which will not be fixed until at least the end of September. The D10 beta release window OTOH is September 12-16.
This issue has been discussed among the release managers, CKEditor 5 contributors, accessibility maintainers, and CKSource maintainers. Summary:
I notice we are missing an issue for the actual step of marking the module stable. I will file it. :)
Comment #139
xjmPosted #3307186: Mark CKEditor 5 stable.
Comment #140
xjmComment #141
wim leersFixed thanks to #3306153: Update CKEditor 5 to 35.1.0 landing:
That only leaves #3283802: Update CKEditor 5 to 35.3.2 to fix voice control/IME on some platforms, but per @xjm in #138, that need not block marking CKEditor 5 as stable in #3307186: Mark CKEditor 5 stable!
Comment #142
wim leersCKEditor 5 is now stable!
See #3307186-32: Mark CKEditor 5 stable.
🚀
P.S.: @lauriii even wrote a haiku for the occasion:
👏
Comment #144
puspanjalim CreditAttribution: puspanjalim as a volunteer commentedIs CKEditor 5 compatible with Drupal 7.x?
Comment #145
damienmckennaThis D9 issue was already closed almost two months ago, questions about D7 are not relevant here.
Please look at this project if you want to discuss CKEditor 5 in D7: http://drupal.org/project/ckeditor
Comment #146
effulgentsia CreditAttribution: effulgentsia at Acquia commentedNo, it's not, and it's not in scope for it to be added to Drupal 7 core. Drupal 7 core doesn't include any rich text editor.
One could attempt to write a contrib module that adds CKEditor 5 to a Drupal 7 site, whether as its own module, or to try to do that as an editor option in https://www.drupal.org/project/wysiwyg. However, this would be a lot of work. Currently, Drupal 7's EOL date is Nov. 2023, and CKEditor 4 will continue to be supported until then, so I don't know what factors would need to come together for someone (or a team of several people) to do that work. You might be interested in following this wysiwyg issue or this backdrop issue, though neither seems very far along yet.
Comment #147
wim leersFinal update: #3283802: Update CKEditor 5 to 35.3.2 to fix voice control/IME on some platforms landed a week ago! 😊