- #13609: [Edge] Fixed: The browser crashes when switching to the source mode. Thanks to Andrew Williams and Mark Smeed!
- PR#201: Fixed: Buttons in the toolbar configurator cause form submission. Thanks to colemanw!
#13422: Fixed: A monospaced font should be used in the
<textarea>element storing editor configuration in the toolbar configurator.
- #13494: Fixed: Error thrown in the toolbar configurator if plugin requirements are not met.
- #13409: Fixed: List elements incorrectly merged when pressing Backspace or Delete.
- #13434: Fixed: Dialog state indicator broken in Right–To–Left environments.
- #13460: [IE8] Fixed: Copying inline widgets is broken when Advanced Content Filter is disabled.
- #13495: [Firefox, IE] Fixed: Text is not word-wrapped in the Paste dialog window.
#13528: [Firefox@Windows] Fixed: Content copied from Microsoft Word and other external applications is pasted as a plain text. Removed the
CKEDITOR.plugins.clipboard.isHtmlInExternalDataTransferproperty as the check must be dynamic.
DataTransfer.getData()should work consistently in all browsers and should not strip valuable content. Fixed pasting tables from Microsoft Excel on Chrome.
#13468: [IE] Fixed: Binding drag&drop
dataTransferdoes not work if
textdata was set in the meantime.
- #13451: [IE8-9] Fixed: One drag&drop operation may affect following ones.
- #13184: Fixed: Web page reloaded after a drop on editor UI.
- #13129 Fixed: Block widget blurred after a drop followed by an undo.
- #13397: Fixed: Drag&drop of a widget inside its nested widget crashes the editor.
editor.getSnapshot()may return a non-string value.
- #13419: Fixed: The Auto Link plugin does not encode double quotes in URLs.
- #13420: Fixed: The Auto Embed plugin ignores encoded characters in URL parameters.
- #13410: Fixed: Error thrown in the Auto Embed plugin when undoing right after pasting a link.
- #13566: Fixed: Suppressed notifications in the Media Embed Base plugin.
- #11616: [Chrome] Fixed: Resizing the editor while it is not displayed breaks the editable. Fixes also #9160 and#9715.
- #11376: [IE11] Fixed: Loss of text when pasting bulleted lists from Microsoft Word.
- #13143: [Edge] Fixed: Focus lost when opening the panel.
- #13387: [Edge] Fixed: "Permission denied" error thrown when loading the editor with developer tools open.
- #13574: [Edge] Fixed: "Permission denied" error thrown when opening editor dialog windows.
- #13441: [Edge] Fixed: The Clipboard plugin breaks the state of Undo commands after a paste.
- #13554: [Edge] Fixed: Paste dialog's iframe does not receive focus on show.
- #13440: [Edge] Fixed: Unable to paste a widget.
#13304: Added support for passing DOM elements to
config.sharedSpaces. Thanks to Undergrounder!
- #13215: Added ability to cancel fetching a resource by the Embed plugins.
#13213: Added the
dialog#setState()method and used it in the Embed dialog to indicate that a resource is being loaded.
#13337: Added the
repository.onWidget()method — a convenient way to listen to widget events through therepository.
- #13214: Added support for pasting links that convert into embeddable resources on the fly.
- #13334: Fixed: Error after nesting widgets and playing with undo/redo.
#13118: Fixed: The
editor.getSelectedHtml()method throws an error when called in the source mode.
- #13158: Fixed: Error after canceling a dialog when creating a widget.
- #13197: Fixed: Linked inline Enhanced Image alignment class is not transferred to the widget wrapper.
- #13199: Fixed: Semantic Embed does not support widget classes.
- #13003: Fixed: Anchors are uploaded when moving them by drag and drop.
- #13032: Fixed: When upload is done, notification update should be marked as important.
#13300: Fixed: The
internalCommitargument in the Image dialog seems to be never used.
- #13036: Fixed: Notifications are moved 10px to the right.
- #13280: [IE8] Fixed: Undo after inline widget drag&drop throws an error.
- #13186: Fixed: Content dropped into a nested editable is not filtered by Advanced Content Filter.
- #13140: Fixed: Error thrown when dropping a block widget right after itself.
- #13176: [IE8] Fixed: Errors on drag&drop of embed widgets.
- #13015: Fixed: Dropping an image file on Enhanced Image causes a page reload.
- #13080: Fixed: Ugly notification shown when the response contains HTML content.
- #13011: [IE8] Fixed: Anchors are duplicated on drag&drop in specific locations.
#13105: Fixed: Various issues related to
- #11976: [Chrome] Fixed: Copy&paste and drag&drop lists from Microsoft Word.
#13128: Fixed: Various issues with cloning element IDs:
- Fixed the default behavior of
range.extractContents()methods which now clone IDs similarly to their native counterparts.
cloneIdarguments to the above methods,
element.breakParent(). Mind the default values and special behavior in the
- Fixed issues where IDs were lost on copy&paste and drag&drop.
- Fixed the default behavior of
- Toolbar configurators:
- #13185: Fixed: Wrong position of the suggestion box if there is not enough space below the caret.
- #13138: Fixed: The "Toggle empty elements" button label is unclear.
- #13136: Fixed: Autocompleter is far too intrusive.
- #13133: Fixed: Tab leaves the editor.
config.removeButtonsis ignored by the advanced toolbar configurator.
- #13119: Improved compatibility of editor skins (Moono and Kama) with external web page style sheets.
- Toolbar configurators:
CKEDITOR.env.isCompatiblea blacklist rather than a whitelist. More about the change in theBrowser Compatibility guide.
CKEDITOR.fileTools.UploadRepositoryand changed all related properties.
- #13279: Reviewed CSS vendor prefixes.
#13454: Removed unused
lang.image.alertUrltoken from the Image plugin.
Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode.
An upgrade is highly recommended!
- #12899: Fixed: Corrected wrong tag ending for horizontal box definition in the Dialog User Interface plugin. Thanks to mizafish!
- #13254: Fixed: Cannot outdent block after indent when using the Div Editing Area plugin. Thanks to Jonathan Cottrill!
#13268: Fixed: Documentation for
CKEDITOR.dom.textis incorrect. Thanks to Ben Kiefer!
- #12739: Fixed: Link loses inline styles when edited without the Advanced Tab for Dialogs plugin. Thanks to Віталій Крутько!
#13292: Fixed: Protection pattern does not work in attribute in self-closing elements with no space before
/>. Thanks to Віталій Крутько!
PR#192: Fixed: Variable name typo in the Dialog User Interface plugin which caused
CKEDITOR.ui.dialog.radiovalidation to not work. Thanks to Florian Ludwig!
#13232: [Safari] Fixed: The
element.appendText()method does not work properly for empty elements.
#13233: Fixed: HTMLDataProcessor can process
#12796: Fixed: The Indent List plugin unwraps parent
<li>elements. Thanks to Andrew Stucki!
#12885: Added missing
- #11982: Fixed: Bullet added in a wrong position after the Enter key is pressed in a nested list.
- #13027: Fixed: Keyboard navigation in dialog windows with multiple tabs not following IBM CI 162 instructions orARIA Authoring Practices.
- #12256: Fixed: Basic styles classes are lost when pasting from Microsoft Word if basic styles were configured to use classes.
- #12729: Fixed: Incorrect structure created when merging a block into a list item on Backspace and Delete.
- #13031: [Firefox] Fixed: No more line breaks in source view since Firefox 36.
- #13131: Fixed: The Code Snippet plugin cannot be used without the IFrame Editing Area plugin.
#9086: Fixed: Invalid ARIA property used on paste area
- #13164: Fixed: Error when inserting a hidden field.
#13155: Fixed: Incorrect Line Utilities positioning when
<body>has a margin.
- #13351: Fixed: Link lost when editing a linked image with the Link tab disabled. This also fixed a bug when inserting an image into a fully selected link would throw an error (#12847).
- #13344: [WebKit/Blink] Fixed: It is possible to remove or change editor content in read-only mode.
#12844 and #13103: Upgraded the testing environment to Bender.js
#12930: Because of licensing issues,
truncated-mathjax/is now removed from the
bender.config.mathJaxLibPathmust be configured manually in order to run Mathematical Formulas plugin tests.
- #13266: Added more shades of gray in the Color Dialog window. Thanks to mizafish!
Clipboard (copy&paste, drag&drop) and file uploading features and improvements (#11437).
- Support for dropping and pasting files into the editor was introduced. Through a set of new facades for native APIs it is now possible to easily intercept and process inserted files.
- File upload tools were introduced in order to simplify controlling the loading, uploading and handling server response, properly handle new upload configuration options, etc.
- Image upload widget was introduced to upload dropped images. A base class for the upload widget was exposed, too, to make it simple to create new types of upload widgets which can handle any type of dropped file, show the upload progress and update the content when the process is done. It also handles editing and undo/redo operations when a file is being uploaded and integrates with the notification aggregator to show progress and success or error.
- All drag and drop operations were integrated with the editor. All dropped content is passed through the
editor#pasteevent and a set of new editor events was introduced —
- The Data Transfer facade was introduced to unify access to data in various types and files. Data Transfer is now always available in the
- Switched from the pastebin to using the native clipboard access whenever possible. This solved many issues related to pastebin such as unnecessary scrolling or data loss. Additionally, on copy and cut from the editor the clipboard data is set. Therefore, on paste the editor has access to clean data, undisturbed by the browsers.
- Drag and drop of inline and block widgets was integrated with the standard clipboard APIs. By listening to drag events you will thus be notified about widgets, too. This opens a possibility to filter pasted and dropped widgets.
editor#pasteevent can have the
rangeparameter so it is possible to change the paste position in the listener or paste in the not selectable position. Also the
editor.insertHtml()method now accepts
rangeas an additional parameter.
#11621: A configurable paste filter was introduced. The filter is by default turned to
'semantic-content'on Webkit and Blink for all pasted content coming from external sources because of the low quality of HTML that these engines put into the clipboard. Internal and cross-editor paste is safe due to the change explained in the previous point.
Other changes and related fixes:
- #12095: On drag and copy of widgets the same method is used to get selected HTML as in the normal case. Thanks to that styles applied to inline widgets are not lost.
#11219: Fixed: Dragging a captioned image does not fire the
- #9554: [Webkit Mac] Fixed: Editor scrolls on paste.
- #9898: [Webkit&Divarea] Fixed: Pasting causes undesirable scrolling.
- #11993: [Chrome] Fixed: Pasting content scrolls the document.
- #12613: Show the user that they can not drop on editor UI (toolbar, bottom bar).
- #12851: [Blink/Webkit] Fixed: Formatting disappears when pasting content into cells.
#12914: Fixed: Copy/Paste of table broken in
Browser support for related features varies significantly (see http://caniuse.com/clipboard).
- File APIs needed to operate and file upload is not supported in Internet Explorer 9 and below.
- Only Chrome and Safari on Mac OS support setting custom data items in the clipboard, so currently it is possible to recognize the origin of the copied content in these browsers only. All drag and drop operations can be identified thanks to the new Data Transfer facade.
- No Internet Explorer browser supports the standard clipboard API which results in small glitches like where only plain text can be dropped from outside the editor. Thanks to the new Data Transfer facade, internal and cross-editor drag and drop supports the full range of data.
- Direct access to clipboard could only be implemented in Chrome, Safari on Mac OS, Opera and Firefox. In other browsers the pastebin must still be used.
#12875: Samples and toolbar configuration tools.
- The old set of samples shipped with every CKEditor package was replaced with a shiny new single-page sample. This change concluded a long term plan which started from introducing the CKEditor SDK and CKEditor Functionality Overview section in the documentation which essentially redefined the old samples.
- Toolbar configurators with live previews were introduced. They will be shipped with every CKEditor package and are meant to help in configuring toolbar layouts.
#10931: Added support for nesting widgets. It is now possible to insert one widget into another widget's nested editable. Note that unless nested editable's allowed content is defined precisely, starting from CKEditor 4.5 some widget buttons may become enabled. This feature is not supported in IE8. Included issues:
- #12018: Fixed and reviewed: Nested widgets garbage collection.
- #12024: [Firefox] Fixed: Outline is extended to the left by unpositioned drag handlers.
- #12006: Fixed: Drag and drop of nested block widgets.
#12008: Fixed various cases of inserting a single non-editable element using the
editor.insertHtml()method. Fixes pasting a widget with a nested editable inside another widget's nested editable.
#11636: Introduced new, UX-focused, methods for getting selected HTML and deleting it —
#12416: Added the
widget.definition.upcastPriorityproperty which gives more control over widget upcasting order to the widget author.
#12036: Initialize the editor in read-only mode when the
<textarea>element has a
resizeevent passes the current dimensions in its data.
config.image2_prefillDimensionsto make pre-filling
heightconfigurable for the Enhanced Image.
- #12746: Added a new configuration option to hide the Enhanced Image resizer.
#12150: Exposed the
is*widget helper functions (see the static methods).
#12448: Introduced the
#12143: Added the
config.floatSpacePreferRightconfiguration option that switches the alignment of the floating toolbar. Thanks to InvisibleBacon!
#10986: Added support for changing dialog input and textarea text directions by using the Shift+Alt+Home/End keystrokes. The direction is stored in the value of the input by prepending the
\u202Bmarker to it. Read more in the documentation. Thanks to edithkk!
- #12770: Added support for passing widget's startup data as a widget command's argument. Thanks to Rebrov Boris and Tieme van Veen!
#11583: Added support for the HTML5
requiredattribute in various form elements. Thanks to Steven Busse!
- #12858: Basic Spartan browser compatibility. Full compatibility will be introduced later, because at the moment Spartan is still too unstable to be used for tests and we see many changes from version to version.
config.mathJaxLibraryoption does not default to the MathJax CDN any more. It needs to be configured to enable (http://ckeditor.com/cke4/addon/mathjax) plugin now.
#13069: Fixed inconsistencies between
rangeparameter is used. Now, the
editor.insertElement()method works on a higher level, what means that it saves undo snapshots and sets selection after insertion. Use the
editable.insertElementIntoRange()method directly for the pre 4.5.0 behavior of
alert()directly whenever possible. When the notification plugin is loaded the notifications system is used automatically. Otherwise, the native
- #8024: Swapped behavior of the Split Cell Vertically and Horizontally features to be more intuitive. Thanks to kevinisagit!
#10903: Performance improvements for the
dom.element.hasClass()methods. Note: The previous implementation allowed passing multiple classes to
addClass()although it was only a side effect of that implementation. The new implementation does not allow this.
- #11856: jQuery adapter throw a meaningful error if CKEditor or jQuery is not loaded.
range.cloneContents()should not change the DOM in order to not affect selection.
dom.element.getChild()should not modify a passed array.
- #12503: [Blink/Webkit] Fixed: Incorrect result of select all and Backspace or Delete.
#13001: [Firefox] Fixed: The
<br />filler is placed in the wrong position by the
range.fixBlockmethod due to Firefox quirky behavior.
- #13101: [IE8] Fixed: IE8 prepends colons to HTML5 element names when cloning them.