8
0
Просмотр исходного кода

Merge branch 'master' into i/5597

Aleksander Nowodzinski 5 лет назад
Родитель
Сommit
9eae505a05
38 измененных файлов с 409 добавлено и 180 удалено
  1. 13 0
      packages/ckeditor5-core/CHANGELOG.md
  2. 2 1
      packages/ckeditor5-core/lang/contexts.json
  3. 25 0
      packages/ckeditor5-core/lang/translations/th.po
  4. 17 17
      packages/ckeditor5-core/package.json
  5. 110 45
      packages/ckeditor5-core/src/context.js
  6. 4 4
      packages/ckeditor5-core/src/contextplugin.js
  7. 49 53
      packages/ckeditor5-core/src/editor/editor.js
  8. 6 6
      packages/ckeditor5-core/src/plugin.js
  9. 13 13
      packages/ckeditor5-core/src/plugincollection.js
  10. 4 7
      packages/ckeditor5-core/tests/_utils-tests/articlepluginset.js
  11. 1 0
      packages/ckeditor5-core/tests/_utils/memory.js
  12. 1 0
      packages/ckeditor5-core/tests/_utils/utils.js
  13. 101 0
      packages/ckeditor5-core/tests/context.js
  14. 24 8
      packages/ckeditor5-core/tests/editor/editor.js
  15. 8 1
      packages/ckeditor5-core/tests/editor/utils/attachtoform.js
  16. 3 2
      packages/ckeditor5-core/tests/editor/utils/dataapimixin.js
  17. 6 3
      packages/ckeditor5-core/tests/editor/utils/elementapimixin.js
  18. 2 0
      packages/ckeditor5-core/tests/editor/utils/securesourceelement.js
  19. 1 1
      packages/ckeditor5-core/tests/manual/formsubmit.js
  20. 1 1
      packages/ckeditor5-core/tests/manual/pendingactions.js
  21. 1 1
      packages/ckeditor5-core/tests/manual/readonly.js
  22. 1 1
      packages/ckeditor5-core/tests/pendingactions.js
  23. 1 1
      packages/ckeditor5-core/theme/icons/align-bottom.svg
  24. 1 1
      packages/ckeditor5-core/theme/icons/align-center.svg
  25. 1 1
      packages/ckeditor5-core/theme/icons/align-justify.svg
  26. 1 1
      packages/ckeditor5-core/theme/icons/align-left.svg
  27. 1 1
      packages/ckeditor5-core/theme/icons/align-middle.svg
  28. 1 1
      packages/ckeditor5-core/theme/icons/align-right.svg
  29. 1 1
      packages/ckeditor5-core/theme/icons/align-top.svg
  30. 1 1
      packages/ckeditor5-core/theme/icons/cancel.svg
  31. 1 1
      packages/ckeditor5-core/theme/icons/check.svg
  32. 1 1
      packages/ckeditor5-core/theme/icons/eraser.svg
  33. 1 1
      packages/ckeditor5-core/theme/icons/image.svg
  34. 1 1
      packages/ckeditor5-core/theme/icons/low-vision.svg
  35. 1 1
      packages/ckeditor5-core/theme/icons/pencil.svg
  36. 1 1
      packages/ckeditor5-core/theme/icons/pilcrow.svg
  37. 1 1
      packages/ckeditor5-core/theme/icons/quote.svg
  38. 1 1
      packages/ckeditor5-core/theme/icons/three-vertical-dots.svg

+ 13 - 0
packages/ckeditor5-core/CHANGELOG.md

@@ -1,6 +1,19 @@
 Changelog
 =========
 
+## [17.0.0](https://github.com/ckeditor/ckeditor5-core/compare/v16.0.0...v17.0.0) (2020-02-19)
+
+### Features
+
+* Introduced the concept of editor contexts and context plugins. Contexts provide a common, higher-level environment for solutions which use multiple editors and/or plugins that work outside an editor. Closes [ckeditor/ckeditor5#5891](https://github.com/ckeditor/ckeditor5/issues/5891). ([672e55e](https://github.com/ckeditor/ckeditor5-core/commit/672e55e))
+* Added vertical alignment icons. Moved horizontal alignment icons form `@ckeditor/ckeditor5-alignment` (see [ckeditor/ckeditor5-table#227](https://github.com/ckeditor/ckeditor5-table/issues/227)). ([ada4a79](https://github.com/ckeditor/ckeditor5-core/commit/ada4a79))
+* Introduced `Plugin#isEnabled`, `Plugin#forceDisabled()` and `Plugin#clearForceDisabled()`. ([7449450](https://github.com/ckeditor/ckeditor5-core/commit/7449450))
+
+### Other changes
+
+* Updated translations. ([6a2b584](https://github.com/ckeditor/ckeditor5-core/commit/6a2b584))
+
+
 ## [16.0.0](https://github.com/ckeditor/ckeditor5-core/compare/v15.0.0...v16.0.0) (2019-12-04)
 
 ### Other changes

+ 2 - 1
packages/ckeditor5-core/lang/contexts.json

@@ -1,4 +1,5 @@
 {
 	"Save": "Label for the Save button.",
-	"Cancel": "Label for the Cancel button."
+	"Cancel": "Label for the Cancel button.",
+	"Remove color": "The label used by a button next to the color palette in the color picker that removes the color (resets it to an empty value, example usages in font color or table properties)."
 }

+ 25 - 0
packages/ckeditor5-core/lang/translations/th.po

@@ -0,0 +1,25 @@
+# Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
+#
+#                                     !!! IMPORTANT !!!
+#
+#         Before you edit this file, please keep in mind that contributing to the project
+#                translations is possible ONLY via the Transifex online service.
+#
+#         To submit your translations, visit https://www.transifex.com/ckeditor/ckeditor5.
+#
+#                   To learn more, check out the official contributor's guide:
+#     https://ckeditor.com/docs/ckeditor5/latest/framework/guides/contributing/contributing.html
+#
+msgid ""
+msgstr ""
+"Language-Team: Thai (https://www.transifex.com/ckeditor/teams/11143/th/)\n"
+"Language: th\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+msgctxt "Label for the Save button."
+msgid "Save"
+msgstr "บันทึก"
+
+msgctxt "Label for the Cancel button."
+msgid "Cancel"
+msgstr "ยกเลิก"

+ 17 - 17
packages/ckeditor5-core/package.json

@@ -1,6 +1,6 @@
 {
   "name": "@ckeditor/ckeditor5-core",
-  "version": "16.0.0",
+  "version": "17.0.0",
   "description": "The core architecture of CKEditor 5 – the best browser-based rich text editor.",
   "keywords": [
     "ckeditor5-lib",
@@ -21,25 +21,25 @@
     "framework"
   ],
   "dependencies": {
-    "@ckeditor/ckeditor5-engine": "^16.0.0",
-    "@ckeditor/ckeditor5-utils": "^16.0.0",
+    "@ckeditor/ckeditor5-engine": "^17.0.0",
+    "@ckeditor/ckeditor5-utils": "^17.0.0",
     "lodash-es": "^4.17.10"
   },
   "devDependencies": {
-    "@ckeditor/ckeditor5-autoformat": "^16.0.0",
-    "@ckeditor/ckeditor5-basic-styles": "^16.0.0",
-    "@ckeditor/ckeditor5-block-quote": "^16.0.0",
-    "@ckeditor/ckeditor5-editor-classic": "^16.0.0",
-    "@ckeditor/ckeditor5-essentials": "^16.0.0",
-    "@ckeditor/ckeditor5-heading": "^16.0.0",
-    "@ckeditor/ckeditor5-image": "^16.0.0",
-    "@ckeditor/ckeditor5-indent": "^16.0.0",
-    "@ckeditor/ckeditor5-link": "^16.0.0",
-    "@ckeditor/ckeditor5-list": "^16.0.0",
-    "@ckeditor/ckeditor5-media-embed": "^16.0.0",
-    "@ckeditor/ckeditor5-paragraph": "^16.0.0",
-    "@ckeditor/ckeditor5-table": "^16.0.0",
-    "@ckeditor/ckeditor5-ui": "^16.0.0",
+    "@ckeditor/ckeditor5-autoformat": "^17.0.0",
+    "@ckeditor/ckeditor5-basic-styles": "^17.0.0",
+    "@ckeditor/ckeditor5-block-quote": "^17.0.0",
+    "@ckeditor/ckeditor5-editor-classic": "^17.0.0",
+    "@ckeditor/ckeditor5-essentials": "^17.0.0",
+    "@ckeditor/ckeditor5-heading": "^17.0.0",
+    "@ckeditor/ckeditor5-image": "^17.0.0",
+    "@ckeditor/ckeditor5-indent": "^17.0.0",
+    "@ckeditor/ckeditor5-link": "^17.0.0",
+    "@ckeditor/ckeditor5-list": "^17.0.0",
+    "@ckeditor/ckeditor5-media-embed": "^17.0.0",
+    "@ckeditor/ckeditor5-paragraph": "^17.0.0",
+    "@ckeditor/ckeditor5-table": "^17.0.0",
+    "@ckeditor/ckeditor5-ui": "^17.0.0",
     "eslint": "^5.5.0",
     "eslint-config-ckeditor5": "^2.0.0",
     "husky": "^1.3.1",

+ 110 - 45
packages/ckeditor5-core/src/context.js

@@ -8,34 +8,35 @@
  */
 
 import Config from '@ckeditor/ckeditor5-utils/src/config';
+import Collection from '@ckeditor/ckeditor5-utils/src/collection';
 import PluginCollection from './plugincollection';
 import Locale from '@ckeditor/ckeditor5-utils/src/locale';
 import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
 
 /**
- * Provides a common, higher level environment for solutions which use multiple {@link module:core/editor/editor~Editor editors}
- * or/and plugins that work outside of an editor. Use it instead of {@link module:core/editor/editor~Editor.create `Editor.create()`}
+ * Provides a common, higher-level environment for solutions that use multiple {@link module:core/editor/editor~Editor editors}
+ * or plugins that work outside the editor. Use it instead of {@link module:core/editor/editor~Editor.create `Editor.create()`}
  * in advanced application integrations.
  *
- * All configuration options passed to a `Context` will be used as default options for editor instances initialized in that context.
+ * All configuration options passed to a context will be used as default options for editor instances initialized in that context.
  *
- * {@link module:core/contextplugin~ContextPlugin `ContextPlugin`s} passed to a `Context` instance will be shared among all
- * editor instances initialized in that context. These will be the same plugin instances for all the editors.
+ * {@link module:core/contextplugin~ContextPlugin Context plugins} passed to a context instance will be shared among all
+ * editor instances initialized in this context. These will be the same plugin instances for all the editors.
  *
- * **Note:** `Context` can only be initialized with {@link module:core/contextplugin~ContextPlugin `ContextPlugin`s}
- * (e.g. [comments](https://ckeditor.com/collaboration/comments/)). Regular {@link module:core/plugin~Plugin `Plugin`s} require an
- * editor instance to work and cannot be added to a `Context`.
+ * **Note:** The context can only be initialized with {@link module:core/contextplugin~ContextPlugin context plugins}
+ * (e.g. [comments](https://ckeditor.com/collaboration/comments/)). Regular {@link module:core/plugin~Plugin plugins} require an
+ * editor instance to work and cannot be added to a context.
  *
- * **Note:** You can add `ContextPlugin` to an editor instance, though.
+ * **Note:** You can add a context plugin to an editor instance, though.
  *
- * If you are using multiple editor instances on one page and use any `ContextPlugin`s, create `Context` to share configuration and plugins
- * among those editors. Some plugins will use the information about all existing editors to better integrate between them.
+ * If you are using multiple editor instances on one page and use any context plugins, create a context to share the configuration and
+ * plugins among these editors. Some plugins will use the information about all existing editors to better integrate between them.
  *
- * If you are using plugins that do not require an editor to work (e.g. [comments](https://ckeditor.com/collaboration/comments/))
- * enable and configure them using `Context`.
+ * If you are using plugins that do not require an editor to work (e.g. [comments](https://ckeditor.com/collaboration/comments/)),
+ * enable and configure them using the context.
  *
- * If you are using only a single editor on each page use {@link module:core/editor/editor~Editor.create `Editor.create()`} instead.
- * In such case, `Context` instance will be created by the editor instance in a transparent way.
+ * If you are using only a single editor on each page, use {@link module:core/editor/editor~Editor.create `Editor.create()`} instead.
+ * In such case, a context instance will be created by the editor instance in a transparent way.
  *
  * See {@link module:core/context~Context.create `Context.create()`} for usage examples.
  */
@@ -43,18 +44,22 @@ export default class Context {
 	/**
 	 * Creates a context instance with a given configuration.
 	 *
-	 * Usually, not to be used directly. See the static {@link module:core/context~Context.create `create()`} method.
+	 * Usually not to be used directly. See the static {@link module:core/context~Context.create `create()`} method.
 	 *
-	 * @param {Object} [config={}] The context config.
+	 * @param {Object} [config={}] The context configuration.
 	 */
 	constructor( config ) {
 		/**
-		 * Holds all configurations specific to this context instance.
+		 * Stores all the configurations specific to this context instance.
 		 *
 		 * @readonly
 		 * @type {module:utils/config~Config}
 		 */
-		this.config = new Config( config );
+		this.config = new Config( config, this.constructor.defaultConfig );
+
+		const availablePlugins = this.constructor.builtinPlugins;
+
+		this.config.define( 'plugins', availablePlugins );
 
 		/**
 		 * The plugins loaded and in use by this context instance.
@@ -62,7 +67,7 @@ export default class Context {
 		 * @readonly
 		 * @type {module:core/plugincollection~PluginCollection}
 		 */
-		this.plugins = new PluginCollection( this );
+		this.plugins = new PluginCollection( this, availablePlugins );
 
 		const languageConfig = this.config.get( 'language' ) || {};
 
@@ -84,12 +89,12 @@ export default class Context {
 		this.t = this.locale.t;
 
 		/**
-		 * List of editors to which this context instance is injected.
+		 * A list of editors that this context instance is injected to.
 		 *
-		 * @private
-		 * @type {Set.<module:core/editor/editor~Editor>}
+		 * @readonly
+		 * @type {module:utils/collection~Collection}
 		 */
-		this._editors = new Set();
+		this.editors = new Collection();
 
 		/**
 		 * Reference to the editor which created the context.
@@ -104,10 +109,10 @@ export default class Context {
 	}
 
 	/**
-	 * Loads and initializes plugins specified in the config.
+	 * Loads and initializes plugins specified in the configuration.
 	 *
 	 * @returns {Promise.<module:core/plugin~LoadedPlugins>} A promise which resolves
-	 * once the initialization is completed providing an array of loaded plugins.
+	 * once the initialization is completed, providing an array of loaded plugins.
 	 */
 	initPlugins() {
 		const plugins = this.config.get( 'plugins' ) || [];
@@ -134,7 +139,7 @@ export default class Context {
 				 * @error context-initplugins-invalid-plugin
 				 */
 				throw new CKEditorError(
-					'context-initplugins-invalid-plugin: Only a plugin marked as a ContextPlugin is allowed to be used with a context.',
+					'context-initplugins-invalid-plugin: Only a plugin marked as a context plugin is allowed to be used with a context.',
 					null,
 					{ Plugin }
 				);
@@ -145,23 +150,23 @@ export default class Context {
 	}
 
 	/**
-	 * Destroys the context instance, and all editors used with the context.
-	 * Releasing all resources used by the context.
+	 * Destroys the context instance and all editors used with the context,
+	 * releasing all resources used by the context.
 	 *
 	 * @returns {Promise} A promise that resolves once the context instance is fully destroyed.
 	 */
 	destroy() {
-		return Promise.all( Array.from( this._editors, editor => editor.destroy() ) )
+		return Promise.all( Array.from( this.editors, editor => editor.destroy() ) )
 			.then( () => this.plugins.destroy() );
 	}
 
 	/**
 	 * Adds a reference to the editor which is used with this context.
 	 *
-	 * When the given editor has created the context then the reference to this editor will be stored
+	 * When the given editor has created the context, the reference to this editor will be stored
 	 * as a {@link ~Context#_contextOwner}.
 	 *
-	 * This method should be used only by the editor.
+	 * This method should only be used by the editor.
 	 *
 	 * @protected
 	 * @param {module:core/editor/editor~Editor} editor
@@ -179,7 +184,7 @@ export default class Context {
 			);
 		}
 
-		this._editors.add( editor );
+		this.editors.add( editor );
 
 		if ( isContextOwner ) {
 			this._contextOwner = editor;
@@ -188,16 +193,18 @@ export default class Context {
 
 	/**
 	 * Removes a reference to the editor which was used with this context.
-	 * When the context was created by the given editor then the context will be destroyed.
+	 * When the context was created by the given editor, the context will be destroyed.
 	 *
-	 * This method should be used only by the editor.
+	 * This method should only be used by the editor.
 	 *
 	 * @protected
 	 * @param {module:core/editor/editor~Editor} editor
-	 * @return {Promise} A promise that resolves once the editor is removed from the context or when the context has been destroyed.
+	 * @return {Promise} A promise that resolves once the editor is removed from the context or when the context was destroyed.
 	 */
 	_removeEditor( editor ) {
-		this._editors.delete( editor );
+		if ( this.editors.has( editor ) ) {
+			this.editors.remove( editor );
+		}
 
 		if ( this._contextOwner === editor ) {
 			return this.destroy();
@@ -207,12 +214,12 @@ export default class Context {
 	}
 
 	/**
-	 * Returns context configuration which will be copied to editors created using this context.
+	 * Returns the context configuration which will be copied to the editors created using this context.
 	 *
-	 * The configuration returned by this method has removed plugins configuration - plugins are shared with all editors
+	 * The configuration returned by this method has the plugins configuration removed &mdash; plugins are shared with all editors
 	 * through another mechanism.
 	 *
-	 * This method should be used only by the editor.
+	 * This method should only be used by the editor.
 	 *
 	 * @protected
 	 * @returns {Object} Configuration as a plain object.
@@ -233,14 +240,14 @@ export default class Context {
 	 * Creates and initializes a new context instance.
 	 *
 	 *		const commonConfig = { ... }; // Configuration for all the plugins and editors.
-	 *		const editorPlugins = [ ... ]; // Regular `Plugin`s here.
+	 *		const editorPlugins = [ ... ]; // Regular plugins here.
 	 *
 	 *		Context
 	 *			.create( {
-	 *				// Only `ContextPlugin`s here.
+	 *				// Only context plugins here.
 	 *				plugins: [ ... ],
 	 *
-	 *				// Configure language for all the editors (it cannot be overwritten).
+	 *				// Configure the language for all the editors (it cannot be overwritten).
 	 *				language: { ... },
 	 *
 	 *				// Configuration for context plugins.
@@ -268,14 +275,14 @@ export default class Context {
 	 *					{
 	 *						editorPlugins,
 	 *						context,
-	 *						toolbar: { ... } // You can overwrite context's configuration.
+	 *						toolbar: { ... } // You can overwrite the configuration of the context.
 	 *					}
 	 *				) );
 	 *
 	 *				return Promise.all( promises );
 	 *			} );
 	 *
-	 * @param {Object} [config] The context config.
+	 * @param {Object} [config] The context configuration.
 	 * @returns {Promise} A promise resolved once the context is ready. The promise resolves with the created context instance.
 	 */
 	static create( config ) {
@@ -286,3 +293,61 @@ export default class Context {
 		} );
 	}
 }
+
+/**
+ * An array of plugins built into the `Context` class.
+ *
+ * It is used in CKEditor 5 builds featuring `Context` to provide a list of context plugins which are later automatically initialized
+ * during the context initialization.
+ *
+ * They will be automatically initialized by `Context` unless `config.plugins` is passed.
+ *
+ *		// Build some context plugins into the Context class first.
+ *		Context.builtinPlugins = [ FooPlugin, BarPlugin ];
+ *
+ *		// Normally, you need to define config.plugins, but since Context.builtinPlugins was
+ *		// defined, now you can call create() without any configuration.
+ *		Context
+ *			.create()
+ *			.then( context => {
+ *				context.plugins.get( FooPlugin ); // -> An instance of the Foo plugin.
+ *				context.plugins.get( BarPlugin ); // -> An instance of the Bar plugin.
+ *			} );
+ *
+ * See also {@link module:core/editor/editor~Editor.builtinPlugins} and {@link module:core/context~Context.defaultConfig}.
+ *
+ * @static
+ * @member {Array.<Function>} module:core/context~Context.builtinPlugins
+ */
+
+/**
+ * The default configuration which is built into the `Context` class.
+ *
+ * It is used in CKEditor 5 builds featuring `Context` to provide the default configuration options which are later used during the
+ * context initialization.
+ *
+ *		Context.defaultConfig = {
+ *			foo: 1,
+ *			bar: 2
+ *		};
+ *
+ *		Context
+ *			.create()
+ *			.then( context => {
+ *				context.config.get( 'foo' ); // -> 1
+ *				context.config.get( 'bar' ); // -> 2
+ *			} );
+ *
+ *		// The default options can be overridden by the configuration passed to create().
+ *		Context
+ *			.create( { bar: 3 } )
+ *			.then( context => {
+ *				context.config.get( 'foo' ); // -> 1
+ *				context.config.get( 'bar' ); // -> 3
+ *			} );
+ *
+ * See also {@link module:core/editor/editor~Editor.defaultConfig} and {@link module:core/context~Context.builtinPlugins}.
+ *
+ * @static
+ * @member {Object} module:core/context~Context.defaultConfig
+ */

+ 4 - 4
packages/ckeditor5-core/src/contextplugin.js

@@ -18,11 +18,11 @@ import mix from '@ckeditor/ckeditor5-utils/src/mix';
  * work within one editor instance or with one or more editor instances that use a single context.
  * It is the context plugin's role to implement handling for both modes.
  *
- * A couple of rules for interaction between editor plugins and context plugins:
+ * There are a few rules for interaction between the editor plugins and context plugins:
  *
- * * a context plugin can require another context plugin,
- * * an {@link module:core/plugin~Plugin editor plugin} can require a context plugin,
- * * a context plugin MUST NOT require an {@link module:core/plugin~Plugin editor plugin}.
+ * * A context plugin can require another context plugin.
+ * * An {@link module:core/plugin~Plugin editor plugin} can require a context plugin.
+ * * A context plugin MUST NOT require an {@link module:core/plugin~Plugin editor plugin}.
  *
  * @implements module:core/plugin~PluginInterface
  * @mixes module:utils/observablemixin~ObservableMixin

+ 49 - 53
packages/ckeditor5-core/src/editor/editor.js

@@ -22,7 +22,7 @@ import mix from '@ckeditor/ckeditor5-utils/src/mix';
 import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
 
 /**
- * Class representing a basic, generic editor.
+ * The class representing a basic, generic editor.
  *
  * Check out the list of its subclasses to learn about specific editor implementations.
  *
@@ -30,12 +30,12 @@ import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
  * {@link module:editor-inline/inlineeditor~InlineEditor}) should extend this class. They can add their
  * own methods and properties.
  *
- * When you are implementing a plugin, then this editor represents the API
+ * When you are implementing a plugin, this editor represents the API
  * which your plugin can expect to get when using its {@link module:core/plugin~Plugin#editor} property.
  *
  * This API should be sufficient in order to implement the "editing" part of your feature
  * (schema definition, conversion, commands, keystrokes, etc.).
- * It does not define the editor UI, which is available only if the
+ * It does not define the editor UI, which is available only if
  * the specific editor implements also the {@link module:core/editor/editorwithui~EditorWithUI} interface
  * (as most editor implementations do).
  *
@@ -44,16 +44,16 @@ import CKEditorError from '@ckeditor/ckeditor5-utils/src/ckeditorerror';
  */
 export default class Editor {
 	/**
-	 * Creates a new instance of the Editor class.
+	 * Creates a new instance of the editor class.
 	 *
 	 * Usually, not to be used directly. See the static {@link module:core/editor/editor~Editor.create `create()`} method.
 	 *
-	 * @param {Object} [config={}] The editor config.
+	 * @param {Object} [config={}] The editor configuration.
 	 */
 	constructor( config = {} ) {
 		/**
 		 * The editor context.
-		 * When it is not provided through the configuration then the editor creates it.
+		 * When it is not provided through the configuration, the editor creates it.
 		 *
 		 * @protected
 		 * @type {module:core/context~Context}
@@ -61,10 +61,12 @@ export default class Editor {
 		this._context = config.context || new Context( { language: config.language } );
 		this._context._addEditor( this, !config.context );
 
-		const availablePlugins = this.constructor.builtinPlugins;
+		// Clone the plugins to make sure that the plugin array will not be shared
+		// between editors and make the watchdog feature work correctly.
+		const availablePlugins = Array.from( this.constructor.builtinPlugins || [] );
 
 		/**
-		 * Holds all configurations specific to this editor instance.
+		 * Stores all configurations specific to this editor instance.
 		 *
 		 *		editor.config.get( 'image.toolbar' );
 		 *		// -> [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ]
@@ -79,7 +81,7 @@ export default class Editor {
 		/**
 		 * The plugins loaded and in use by this editor instance.
 		 *
-		 *		editor.plugins.get( 'Clipboard' ); // -> instance of the Clipboard plugin.
+		 *		editor.plugins.get( 'Clipboard' ); // -> An instance of the clipboard plugin.
 		 *
 		 * @readonly
 		 * @member {module:core/plugincollection~PluginCollection}
@@ -121,11 +123,11 @@ export default class Editor {
 		 *
 		 * The editor is in one of the following states:
 		 *
-		 * * `initializing` - during the editor initialization (before {@link module:core/editor/editor~Editor.create `Editor.create()`})
-		 * finished its job,
-		 * * `ready` - after the promise returned by the {@link module:core/editor/editor~Editor.create `Editor.create()`}
-		 * method is resolved,
-		 * * `destroyed` - once the {@link #destroy `editor.destroy()`} method was called.
+		 * * `initializing` &ndash; During the editor initialization (before
+		 * {@link module:core/editor/editor~Editor.create `Editor.create()`}) finished its job.
+		 * * `ready` &ndash; After the promise returned by the {@link module:core/editor/editor~Editor.create `Editor.create()`}
+		 * method is resolved.
+		 * * `destroyed` &ndash; Once the {@link #destroy `editor.destroy()`} method was called.
 		 *
 		 * @observable
 		 * @member {'initializing'|'ready'|'destroyed'} #state
@@ -161,7 +163,7 @@ export default class Editor {
 
 		/**
 		 * The {@link module:engine/controller/datacontroller~DataController data controller}.
-		 * Used e.g. for setting and retrieving editor data.
+		 * Used e.g. for setting and retrieving the editor data.
 		 *
 		 * @readonly
 		 * @member {module:engine/controller/datacontroller~DataController}
@@ -179,9 +181,9 @@ export default class Editor {
 		this.editing.view.document.bind( 'isReadOnly' ).to( this );
 
 		/**
-		 * Conversion manager through which you can register model to view and view to model converters.
+		 * Conversion manager through which you can register model-to-view and view-to-model converters.
 		 *
-		 * See {@link module:engine/conversion/conversion~Conversion}'s documentation to learn how to add converters.
+		 * See the {@link module:engine/conversion/conversion~Conversion} documentation to learn how to add converters.
 		 *
 		 * @readonly
 		 * @member {module:engine/conversion/conversion~Conversion}
@@ -191,7 +193,7 @@ export default class Editor {
 		this.conversion.addAlias( 'editingDowncast', this.editing.downcastDispatcher );
 
 		/**
-		 * Instance of the {@link module:core/editingkeystrokehandler~EditingKeystrokeHandler}.
+		 * An instance of the {@link module:core/editingkeystrokehandler~EditingKeystrokeHandler}.
 		 *
 		 * It allows setting simple keystrokes:
 		 *
@@ -202,14 +204,14 @@ export default class Editor {
 		 *		editor.keystrokes.set( 'Ctrl+E', ( data, cancel ) => {
 		 *			console.log( data.keyCode );
 		 *
-		 *			// Prevent default (native) action and stop the underlying keydown event
+		 *			// Prevent the default (native) action and stop the underlying keydown event
 		 *			// so no other editor feature will interfere.
 		 *			cancel();
 		 *		} );
 		 *
-		 * Note: Certain, typing oriented keystrokes (like <kbd>Backspace</kbd> or <kbd>Enter</kbd>) are handled
-		 * by low level mechanism and trying to listen to them via the keystroke handler will not work reliably.
-		 * To handle those specific keystrokes see the events fired by the
+		 * Note: Certain typing-oriented keystrokes (like <kbd>Backspace</kbd> or <kbd>Enter</kbd>) are handled
+		 * by a low-level mechanism and trying to listen to them via the keystroke handler will not work reliably.
+		 * To handle these specific keystrokes, see the events fired by the
 		 * {@link module:engine/view/document~Document editing view document} (`editor.editing.view.document`).
 		 *
 		 * @readonly
@@ -220,14 +222,14 @@ export default class Editor {
 	}
 
 	/**
-	 * Loads and initializes plugins specified in the config.
+	 * Loads and initializes plugins specified in the configuration.
 	 *
 	 * @returns {Promise.<module:core/plugin~LoadedPlugins>} A promise which resolves
-	 * once the initialization is completed providing an array of loaded plugins.
+	 * once the initialization is completed, providing an array of loaded plugins.
 	 */
 	initPlugins() {
 		const config = this.config;
-		const plugins = config.get( 'plugins' ) || [];
+		const plugins = config.get( 'plugins' );
 		const removePlugins = config.get( 'removePlugins' ) || [];
 		const extraPlugins = config.get( 'extraPlugins' ) || [];
 
@@ -264,18 +266,18 @@ export default class Editor {
 				this.keystrokes.destroy();
 			} )
 			// Remove the editor from the context.
-			// When the context was created by this editor then then the context will be destroyed.
+			// When the context was created by this editor, the context will be destroyed.
 			.then( () => this._context._removeEditor( this ) );
 	}
 
 	/**
-	 * Executes specified command with given parameters.
+	 * Executes the specified command with given parameters.
 	 *
 	 * Shorthand for:
 	 *
 	 *		editor.commands.get( commandName ).execute( ... );
 	 *
-	 * @param {String} commandName Name of command to execute.
+	 * @param {String} commandName The name of the command to execute.
 	 * @param {*} [...commandParams] Command parameters.
 	 */
 	execute( ...args ) {
@@ -308,11 +310,11 @@ export default class Editor {
 mix( Editor, ObservableMixin );
 
 /**
- * Fired when {@link module:engine/controller/datacontroller~DataController#event:ready data} and all additional
+ * Fired when the {@link module:engine/controller/datacontroller~DataController#event:ready data} and all additional
  * editor components are ready.
  *
  * Note: This event is most useful for plugin developers. When integrating the editor with your website or
- * application you do not have to listen to `editor#ready` because when the promise returned by the static
+ * application, you do not have to listen to `editor#ready` because when the promise returned by the static
  * {@link module:core/editor/editor~Editor.create `Editor.create()`} event is resolved, the editor is already ready.
  * In fact, since the first moment when the editor instance is available to you is inside `then()`'s callback,
  * you cannot even add a listener to the `editor#ready` event.
@@ -333,29 +335,22 @@ mix( Editor, ObservableMixin );
  */
 
 /**
- * This error is thrown when a user tries to use a `<textarea>` element to create a non-classic editor in it.
+ * This error is thrown when trying to pass a `<textarea>` element to a `create()` function of an editor class.
  *
- * Textarea element represents a plain-text and cannot be used as a editable root element with included CKEditor5.
- * Content of an editor should be nicely present to the user and show him how it's going to looks like. Textarea element
- * doesn't support such behavior.
- *
- * Typically you can use a `div` for storing editor content instead:
+ * The only editor type which can be initialized on `<textarea>` elements is {@glink builds/guides/overview#classic-editor classic editor}.
+ * This editor hides the passed element and inserts its own UI next to it. Other types of editors reuse the passed element as their root
+ * editable element and therefore `<textarea>` is not appropriate for them. Use a `<div>` or another text container instead:
  *
  *		<div id="editor">
  *			<p>Initial content.</p>
  *		</div>
  *
- * Only {@glink builds/guides/overview#classic-editor Classic Editor} has implemented a special system, which
- * **replace** DOM element and load data from it
- * ({@link module:editor-classic/classiceditor~ClassicEditor.create more information}). All other editors
- * use an existing element, load data from it and make this element editable. Details about behaviour of each editor
- * might be found in an associated description of a `create` method of each editor.
- *
  * @error editor-wrong-element
  */
 
 /**
  * An array of plugins built into this editor class.
+ *
  * It is used in CKEditor 5 builds to provide a list of plugins which are later automatically initialized
  * during the editor initialization.
  *
@@ -370,29 +365,29 @@ mix( Editor, ObservableMixin );
  *		ClassicEditor
  *			.create( sourceElement )
  *			.then( editor => {
- *				editor.plugins.get( FooPlugin ); // -> instance of the Foo plugin
- *				editor.plugins.get( BarPlugin ); // -> instance of the Bar plugin
+ *				editor.plugins.get( FooPlugin ); // -> An instance of the Foo plugin.
+ *				editor.plugins.get( BarPlugin ); // -> An instance of the Bar plugin.
  *			} );
  *
  *		ClassicEditor
  *			.create( sourceElement, {
- *				// Don't initialize this plugins (note: it's defined by a string):
+ *				// Do not initialize these plugins (note: it is defined by a string):
  *				removePlugins: [ 'Foo' ]
  *			} )
  *			.then( editor => {
- *				editor.plugins.get( FooPlugin ); // -> undefined
- *				editor.config.get( BarPlugin ); // -> instance of the Bar plugin
+ *				editor.plugins.get( FooPlugin ); // -> Undefined.
+ *				editor.config.get( BarPlugin ); // -> An instance of the Bar plugin.
  *			} );
  *
  *		ClassicEditor
  *			.create( sourceElement, {
- *				// Load only this plugin. Can also be define by a string if
+ *				// Load only this plugin. It can also be defined by a string if
  *				// this plugin was built into the editor class.
  *				plugins: [ FooPlugin ]
  *			} )
  *			.then( editor => {
- *				editor.plugins.get( FooPlugin ); // -> instance of the Foo plugin
- *				editor.config.get( BarPlugin ); // -> undefined
+ *				editor.plugins.get( FooPlugin ); // -> An instance of the Foo plugin.
+ *				editor.config.get( BarPlugin ); // -> Undefined.
  *			} );
  *
  * See also {@link module:core/editor/editor~Editor.defaultConfig}.
@@ -402,8 +397,9 @@ mix( Editor, ObservableMixin );
  */
 
 /**
- * The default config which is built into the editor class.
- * It is used in CKEditor 5 builds to provide the default config options which are later used during editor initialization.
+ * The default configuration which is built into the editor class.
+ *
+ * It is used in CKEditor 5 builds to provide the default configuration options which are later used during the editor initialization.
  *
  *		ClassicEditor.defaultConfig = {
  *			foo: 1,
@@ -417,7 +413,7 @@ mix( Editor, ObservableMixin );
  *				editor.config.get( 'bar' ); // -> 2
  *			} );
  *
- *		// The default options can be overridden by the config passed to create().
+ *		// The default options can be overridden by the configuration passed to create().
  *		ClassicEditor
  *			.create( sourceElement, { bar: 3 } )
  *			.then( editor => {

+ 6 - 6
packages/ckeditor5-core/src/plugin.js

@@ -221,7 +221,7 @@ mix( Plugin, ObservableMixin );
  *
  * The name should reflect the constructor name.
  *
- * To keep the plugin class definition tight it is recommended to define this property as a static getter:
+ * To keep the plugin class definition tight, it is recommended to define this property as a static getter:
  *
  *		export default class ImageCaption {
  *			static get pluginName() {
@@ -241,11 +241,11 @@ mix( Plugin, ObservableMixin );
  */
 
 /**
- * The second stage (after plugin {@link #constructor}) of plugin initialization.
+ * The second stage (after plugin {@link #constructor}) of the plugin initialization.
  * Unlike the plugin constructor this method can be asynchronous.
  *
  * A plugin's `init()` method is called after its {@link module:core/plugin~PluginInterface.requires dependencies} are initialized,
- * so in the same order as constructors of these plugins.
+ * so in the same order as the constructors of these plugins.
  *
  * **Note:** This method is optional. A plugin instance does not need to have it defined.
  *
@@ -254,7 +254,7 @@ mix( Plugin, ObservableMixin );
  */
 
 /**
- * The third (and last) stage of plugin initialization. See also {@link #constructor} and {@link #init}.
+ * The third (and last) stage of the plugin initialization. See also {@link #constructor} and {@link #init}.
  *
  * **Note:** This method is optional. A plugin instance does not need to have it defined.
  *
@@ -272,7 +272,7 @@ mix( Plugin, ObservableMixin );
  */
 
 /**
- * A flag which defines if plugin is allowed or not allowed to be use directly by a {@link module:core/context~Context}.
+ * A flag which defines if a plugin is allowed or not allowed to be used directly by a {@link module:core/context~Context}.
  *
  * @static
  * @readonly
@@ -280,7 +280,7 @@ mix( Plugin, ObservableMixin );
  */
 
 /**
- * Array of loaded plugins.
+ * An array of loaded plugins.
  *
  * @typedef {Array.<module:core/plugin~PluginInterface>} module:core/plugin~LoadedPlugins
  */

+ 13 - 13
packages/ckeditor5-core/src/plugincollection.js

@@ -21,16 +21,16 @@ import mix from '@ckeditor/ckeditor5-utils/src/mix';
  */
 export default class PluginCollection {
 	/**
-	 * Creates an instance of the PluginCollection class.
+	 * Creates an instance of the plugin collection class.
 	 * Allows loading and initializing plugins and their dependencies.
-	 * Allows to provide a list of already loaded plugins, these plugins won't be destroyed along with this collection.
+	 * Allows to provide a list of already loaded plugins. These plugins will not be destroyed along with this collection.
 	 *
 	 * @param {module:core/editor/editor~Editor|module:core/context~Context} context
 	 * @param {Array.<Function>} [availablePlugins] Plugins (constructors) which the collection will be able to use
 	 * when {@link module:core/plugincollection~PluginCollection#init} is used with plugin names (strings, instead of constructors).
 	 * Usually, the editor will pass its built-in plugins to the collection so they can later be
 	 * used in `config.plugins` or `config.removePlugins` by names.
-	 * @param {Iterable.<Array>} contextPlugins List of already initialized plugins represented by a
+	 * @param {Iterable.<Array>} contextPlugins A list of already initialized plugins represented by a
 	 * `[ PluginConstructor, pluginInstance ]` pair.
 	 */
 	constructor( context, availablePlugins = [], contextPlugins = [] ) {
@@ -47,7 +47,7 @@ export default class PluginCollection {
 		this._plugins = new Map();
 
 		/**
-		 * Map of plugin constructors which can be retrieved by their names.
+		 * A map of plugin constructors that can be retrieved by their names.
 		 *
 		 * @protected
 		 * @type {Map.<String|Function,Function>}
@@ -72,7 +72,7 @@ export default class PluginCollection {
 			this._contextPlugins.set( PluginConstructor, pluginInstance );
 			this._contextPlugins.set( pluginInstance, PluginConstructor );
 
-			// To make it possible to require plugin by its name.
+			// To make it possible to require a plugin by its name.
 			if ( PluginConstructor.pluginName ) {
 				this._availablePlugins.set( PluginConstructor.pluginName, PluginConstructor );
 			}
@@ -146,11 +146,11 @@ export default class PluginCollection {
 	}
 
 	/**
-	 * Checks if plugin is loaded.
+	 * Checks if a plugin is loaded.
 	 *
-	 *		// Check if 'Clipboard' plugin was loaded.
+	 *		// Check if the 'Clipboard' plugin was loaded.
 	 *		if ( editor.plugins.has( 'Clipboard' ) ) {
-	 *			// Now use clipboard plugin instance:
+	 *			// Now use the clipboard plugin instance:
 	 *			const clipboard = editor.plugins.get( 'Clipboard' );
 	 *
 	 *			// ...
@@ -237,7 +237,7 @@ export default class PluginCollection {
 					 * This is a generic error logged to the console when a JavaSript error is thrown during the initialization
 					 * of one of the plugins.
 					 *
-					 * If you correctly handled the promise returned by the editor's `create()` method (like shown below)
+					 * If you correctly handled the promise returned by the editor's `create()` method (like shown below),
 					 * you will find the original error logged to the console, too:
 					 *
 					 *		ClassicEditor.create( document.getElementById( 'editor' ) )
@@ -283,11 +283,11 @@ export default class PluginCollection {
 
 						if ( PluginConstructor.isContextPlugin && !RequiredPluginConstructor.isContextPlugin ) {
 							/**
-							 * If a plugin is a `ContextPlugin` all plugins it requires should also be a `ContextPlugin`,
-							 * instead of `Plugin`. In other words, if one plugin can be used in the `Context`,
-							 * all its requirements also should be ready to be used in the`Context`. Note that context
+							 * If a plugin is a context plugin, all plugins it requires should also be context plugins
+							 * instead of plugins. In other words, if one plugin can be used in the context,
+							 * all its requirements should also be ready to be used in the context. Note that the context
 							 * provides only a part of the API provided by the editor. If one plugin needs a full
-							 * editor API, all plugins which require it, are considered as plugins which need a full
+							 * editor API, all plugins which require it are considered as plugins that need a full
 							 * editor API.
 							 *
 							 * @error plugincollection-context-required

+ 4 - 7
packages/ckeditor5-core/tests/_utils-tests/articlepluginset.js

@@ -29,18 +29,15 @@ import normalizeHtml from '@ckeditor/ckeditor5-utils/tests/_utils/normalizehtml'
 describe( 'ArticlePluginSet', () => {
 	let editor, editorElement;
 
-	beforeEach( () => {
+	beforeEach( async () => {
 		editorElement = document.createElement( 'div' );
 		document.body.appendChild( editorElement );
 
-		return ClassicTestEditor.create( editorElement, { plugins: [ ArticlePluginSet ] } )
-			.then( newEditor => {
-				editor = newEditor;
-			} );
+		editor = await ClassicTestEditor.create( editorElement, { plugins: [ ArticlePluginSet ] } );
 	} );
 
-	afterEach( () => {
-		editor.destroy();
+	afterEach( async () => {
+		await editor.destroy();
 
 		editorElement.remove();
 	} );

+ 1 - 0
packages/ckeditor5-core/tests/_utils/memory.js

@@ -147,6 +147,7 @@ function collectMemoryStats() {
 // 		google-chrome -js-flags="--expose-gc"
 //
 function skipIfNoGarbageCollector() {
+	// eslint-disable-next-line mocha/no-top-level-hooks
 	before( function() {
 		if ( !window.gc ) {
 			this.skip();

+ 1 - 0
packages/ckeditor5-core/tests/_utils/utils.js

@@ -34,6 +34,7 @@ const utils = {
 	 */
 
 	createSinonSandbox() {
+		// eslint-disable-next-line mocha/no-top-level-hooks
 		afterEach( () => {
 			utils.sinon.restore();
 		} );

+ 101 - 0
packages/ckeditor5-core/tests/context.js

@@ -49,6 +49,26 @@ describe( 'Context', () => {
 		} );
 	} );
 
+	describe( 'editors', () => {
+		it( 'should keep all the editors created within the context and fire event:add whenever an editor is added', async () => {
+			const spy = sinon.spy();
+			const context = await Context.create();
+
+			context.editors.on( 'add', spy );
+
+			const editorA = await VirtualTestEditor.create( { context } );
+
+			expect( spy.calledOnce );
+
+			const editorB = await VirtualTestEditor.create( { context } );
+
+			expect( spy.calledTwice );
+
+			expect( context.editors.has( editorA ) );
+			expect( context.editors.has( editorB ) );
+		} );
+	} );
+
 	describe( 'locale', () => {
 		it( 'is instantiated and t() is exposed', () => {
 			const context = new Context();
@@ -260,5 +280,86 @@ describe( 'Context', () => {
 			sinon.assert.calledOnce( editorB.destroy );
 			sinon.assert.notCalled( editorC.destroy );
 		} );
+
+		it( 'should not crash when destroyed for the second time', async () => {
+			const context = await Context.create();
+
+			await VirtualTestEditor.create( { context } );
+			await context.destroy();
+			await context.destroy();
+		} );
+
+		it( 'should not crash when destroyed for the second time - editor own managed context', async () => {
+			const editor = await VirtualTestEditor.create();
+
+			await editor.destroy();
+			await editor.destroy();
+		} );
+	} );
+
+	describe( 'builtinPlugins', () => {
+		class PluginA extends ContextPlugin {}
+		class PluginB extends ContextPlugin {}
+		class PluginC extends ContextPlugin {}
+
+		beforeEach( () => {
+			Context.builtinPlugins = [ PluginA, PluginB, PluginC ];
+		} );
+
+		afterEach( () => {
+			delete Context.builtinPlugins;
+		} );
+
+		it( 'should load plugins built in the Context even if the passed config is empty', () => {
+			const context = new Context();
+
+			return context.initPlugins()
+				.then( () => {
+					expect( getPlugins( context ).length ).to.equal( 3 );
+
+					expect( context.plugins.get( PluginA ) ).to.be.an.instanceof( ContextPlugin );
+					expect( context.plugins.get( PluginB ) ).to.be.an.instanceof( ContextPlugin );
+					expect( context.plugins.get( PluginC ) ).to.be.an.instanceof( ContextPlugin );
+				} );
+		} );
+
+		it( 'should load plugins provided in the config and should ignore plugins built in the Editor', () => {
+			const context = new Context( {
+				plugins: [
+					PluginA
+				]
+			} );
+
+			return context.initPlugins()
+				.then( () => {
+					expect( getPlugins( context ).length ).to.equal( 1 );
+
+					expect( context.plugins.get( PluginA ) ).to.be.an.instanceof( ContextPlugin );
+				} );
+		} );
+	} );
+
+	describe( 'defaultConfig', () => {
+		beforeEach( () => {
+			Context.defaultConfig = { foo: 1, bar: 2 };
+		} );
+
+		afterEach( () => {
+			delete Context.defaultConfig;
+		} );
+
+		it( 'should extend an editor configuration using built in config', () => {
+			const context = new Context( {
+				foo: 4
+			} );
+
+			expect( context.config.get( 'foo' ) ).to.equal( 4 );
+			expect( context.config.get( 'bar' ) ).to.equal( 2 );
+		} );
 	} );
 } );
+
+function getPlugins( editor ) {
+	return Array.from( editor.plugins )
+		.map( entry => entry[ 1 ] ); // Get instances.
+}

+ 24 - 8
packages/ckeditor5-core/tests/editor/editor.js

@@ -149,7 +149,7 @@ describe( 'Editor', () => {
 				bar: 'foo',
 				foo: {
 					c: 3
-				},
+				}
 			} );
 
 			expect( editor.config.get( 'foo' ) ).to.deep.equal( {
@@ -262,7 +262,23 @@ describe( 'Editor', () => {
 			const context = await Context.create( { plugins: [ ContextPlugin ] } );
 			const editor = await TestEditor.create( { context } );
 
-			expect( editor.config.get( 'plugins' ) ).to.be.undefined;
+			expect( editor.config.get( 'plugins' ) ).to.be.empty;
+		} );
+
+		it( 'should copy builtin plugins', async () => {
+			TestEditor.builtinPlugins = [ PluginA ];
+
+			class ContextPlugin {
+				static get isContextPlugin() {
+					return true;
+				}
+			}
+
+			const context = await Context.create( { plugins: [ ContextPlugin ] } );
+			const editor = await TestEditor.create( { context } );
+
+			expect( editor.config.get( 'plugins' ) ).to.deep.equal( [ PluginA ] );
+			expect( editor.config.get( 'plugins' ) ).to.not.equal( TestEditor.builtinPlugins );
 		} );
 
 		it( 'should pass DOM element using reference, not copy', async () => {
@@ -683,7 +699,7 @@ describe( 'Editor', () => {
 		} );
 
 		it( 'should load plugins built in the Editor even if the passed config is empty', () => {
-			Editor.builtinPlugins = [ PluginA, PluginB, PluginC ];
+			TestEditor.builtinPlugins = [ PluginA, PluginB, PluginC ];
 
 			const editor = new TestEditor();
 
@@ -698,7 +714,7 @@ describe( 'Editor', () => {
 		} );
 
 		it( 'should load plugins provided in the config and should ignore plugins built in the Editor', () => {
-			Editor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
+			TestEditor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
 
 			const editor = new TestEditor( {
 				plugins: [
@@ -717,7 +733,7 @@ describe( 'Editor', () => {
 		it( 'should load plugins built in the Editor using their names', () => {
 			class PrivatePlugin extends Plugin {}
 
-			Editor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
+			TestEditor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
 
 			const editor = new TestEditor( {
 				plugins: [
@@ -740,7 +756,7 @@ describe( 'Editor', () => {
 		} );
 
 		it( 'should load plugins inherited from the base Editor', () => {
-			Editor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
+			TestEditor.builtinPlugins = [ PluginA, PluginB, PluginC, PluginD ];
 
 			class CustomEditor extends TestEditor {}
 
@@ -796,7 +812,7 @@ describe( 'Editor', () => {
 			} );
 
 			it( 'should not load plugins built in the Editor', () => {
-				Editor.builtinPlugins = [ PluginA, PluginD ];
+				TestEditor.builtinPlugins = [ PluginA, PluginD ];
 
 				const editor = new TestEditor( {
 					removePlugins: [ 'D' ]
@@ -854,7 +870,7 @@ describe( 'Editor', () => {
 			} );
 
 			it( 'should not duplicate plugins built in the Editor', () => {
-				Editor.builtinPlugins = [ PluginA, PluginB ];
+				TestEditor.builtinPlugins = [ PluginA, PluginB ];
 
 				const editor = new TestEditor( {
 					extraPlugins: [ 'B' ]

+ 8 - 1
packages/ckeditor5-core/tests/editor/utils/attachtoform.js

@@ -43,7 +43,9 @@ describe( 'attachToForm()', () => {
 		submitStub.restore();
 		form.remove();
 
-		return editor.destroy();
+		if ( editor ) {
+			return editor.destroy();
+		}
 	} );
 
 	it( 'should throw an error when is used with editor without `ElementApiMixin`', () => {
@@ -126,6 +128,7 @@ describe( 'attachToForm()', () => {
 		expect( textarea.value ).to.equal( '' );
 
 		return editor.destroy().then( () => {
+			editor = null;
 			// Submit method is no longer replaced by our implementation.
 			expect( form.submit ).to.equal( submitStub );
 			form.submit();
@@ -141,6 +144,8 @@ describe( 'attachToForm()', () => {
 		expect( textarea.value ).to.equal( '' );
 
 		return editor.destroy().then( () => {
+			editor = null;
+
 			form.dispatchEvent( new Event( 'submit', {
 				// We need to be able to do preventDefault() to prevent page reloads in Firefox.
 				cancelable: true
@@ -172,6 +177,8 @@ describe( 'attachToForm()', () => {
 		expect( textarea.value ).to.equal( 'foo bar' );
 
 		return editor.destroy().then( () => {
+			editor = null;
+
 			expect( form.submit ).to.equal( input );
 			input.remove();
 		} );

+ 3 - 2
packages/ckeditor5-core/tests/editor/utils/dataapimixin.js

@@ -22,10 +22,11 @@ describe( 'DataApiMixin', () => {
 		editor.model.document.createRoot( '$root', 'main' );
 		editor.model.document.createRoot( '$root', 'secondRoot' );
 		editor.model.schema.extend( '$text', { allowIn: '$root' } );
+		editor.fire( 'ready' ); // (#6139)
 	} );
 
-	afterEach( () => {
-		editor.destroy();
+	afterEach( async () => {
+		await editor.destroy();
 	} );
 
 	describe( 'setData()', () => {

+ 6 - 3
packages/ckeditor5-core/tests/editor/utils/elementapimixin.js

@@ -15,17 +15,20 @@ describe( 'ElementApiMixin', () => {
 	let editor;
 
 	beforeEach( () => {
-		class CustomEditor extends Editor {}
+		class CustomEditor extends Editor {
+		}
+
 		mix( CustomEditor, ElementApiMixin );
 
 		editor = new CustomEditor();
 		editor.data.processor = new HtmlDataProcessor();
 		editor.model.document.createRoot();
 		editor.model.schema.extend( '$text', { allowIn: '$root' } );
+		editor.fire( 'ready' ); // (#6139)
 	} );
 
-	afterEach( () => {
-		editor.destroy();
+	afterEach( async () => {
+		await editor.destroy();
 	} );
 
 	describe( 'updateSourceElement()', () => {

+ 2 - 0
packages/ckeditor5-core/tests/editor/utils/securesourceelement.js

@@ -53,6 +53,8 @@ describe( 'secureSourceElement()', () => {
 
 		return editor.destroy()
 			.then( () => {
+				editor = null;
+
 				expect( sourceElement.ckeditorInstance ).to.be.undefined;
 			} );
 	} );

+ 1 - 1
packages/ckeditor5-core/tests/manual/formsubmit.js

@@ -14,7 +14,7 @@ document.getElementById( 'form' ).submit = () => {};
 ClassicEditor
 	.create( document.querySelector( '#editor' ), {
 		plugins: [ ArticlePluginSet ],
-		toolbar: [ 'bold', 'italic', 'undo', 'redo' ],
+		toolbar: [ 'bold', 'italic', 'undo', 'redo' ]
 	} )
 	.then( editor => {
 		window.editor = editor;

+ 1 - 1
packages/ckeditor5-core/tests/manual/pendingactions.js

@@ -15,7 +15,7 @@ ClassicEditor
 		plugins: [ ArticlePluginSet, PendingActions ],
 		toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],
 		image: {
-			toolbar: [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ],
+			toolbar: [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ]
 		}
 	} )
 	.then( editor => {

+ 1 - 1
packages/ckeditor5-core/tests/manual/readonly.js

@@ -15,7 +15,7 @@ ClassicEditor
 		plugins: [ ArticlePluginSet, BalloonToolbar ],
 		toolbar: [ 'heading', '|', 'bold', 'italic', 'link', 'bulletedList', 'numberedList', 'blockQuote', 'undo', 'redo' ],
 		image: {
-			toolbar: [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ],
+			toolbar: [ 'imageStyle:full', 'imageStyle:side', '|', 'imageTextAlternative' ]
 		},
 		balloonToolbar: [ 'bold', 'italic', 'link' ]
 	} )

+ 1 - 1
packages/ckeditor5-core/tests/pendingactions.js

@@ -12,7 +12,7 @@ let editor, pendingActions;
 describe( 'PendingActions', () => {
 	beforeEach( () => {
 		return VirtualTestEditor.create( {
-			plugins: [ PendingActions ],
+			plugins: [ PendingActions ]
 		} ).then( newEditor => {
 			editor = newEditor;
 			pendingActions = editor.plugins.get( PendingActions );

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-bottom.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.239 13.938l-2.88-1.663a.75.75 0 01.75-1.3L9 12.067V4.75a.75.75 0 111.5 0v7.318l1.89-1.093a.75.75 0 01.75 1.3l-2.879 1.663a.752.752 0 01-.511.187.752.752 0 01-.511-.187zM4.25 17a.75.75 0 110-1.5h10.5a.75.75 0 010 1.5H4.25z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.239 13.938l-2.88-1.663a.75.75 0 01.75-1.3L9 12.067V4.75a.75.75 0 111.5 0v7.318l1.89-1.093a.75.75 0 01.75 1.3l-2.879 1.663a.752.752 0 01-.511.187.752.752 0 01-.511-.187zM4.25 17a.75.75 0 110-1.5h10.5a.75.75 0 010 1.5H4.25z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-center.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 1 0 0-1.5H5.036a.75.75 0 0 0-.75.75z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm2.286 4c0 .414.336.75.75.75h9.928a.75.75 0 100-1.5H5.036a.75.75 0 00-.75.75zm0-8c0 .414.336.75.75.75h9.928a.75.75 0 100-1.5H5.036a.75.75 0 00-.75.75z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-justify.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0-8c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-left.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 1 0 0-1.5H2.75a.75.75 0 0 0-.75.75z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M2 3.75c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0 8c0 .414.336.75.75.75h14.5a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0 4c0 .414.336.75.75.75h9.929a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75zm0-8c0 .414.336.75.75.75h9.929a.75.75 0 100-1.5H2.75a.75.75 0 00-.75.75z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-middle.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 01.508.184l2.883 1.666a.75.75 0 01-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 11-1.5 0v-4.317l-1.89 1.092a.75.75 0 01-.75-1.3l2.879-1.663a.752.752 0 01.51-.187zM15.25 9a.75.75 0 110 1.5H4.75a.75.75 0 110-1.5h10.5zM9.75.375a.75.75 0 01.75.75v4.318l1.89-1.093.092-.045a.75.75 0 01.659 1.344l-2.883 1.667a.752.752 0 01-.508.184.752.752 0 01-.511-.187L6.359 5.65a.75.75 0 01.75-1.299L9 5.442 9 1.125a.75.75 0 01.75-.75z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M9.75 11.875a.752.752 0 01.508.184l2.883 1.666a.75.75 0 01-.659 1.344l-.091-.044-1.892-1.093.001 4.318a.75.75 0 11-1.5 0v-4.317l-1.89 1.092a.75.75 0 01-.75-1.3l2.879-1.663a.752.752 0 01.51-.187zM15.25 9a.75.75 0 110 1.5H4.75a.75.75 0 110-1.5h10.5zM9.75.375a.75.75 0 01.75.75v4.318l1.89-1.093.092-.045a.75.75 0 01.659 1.344l-2.883 1.667a.752.752 0 01-.508.184.752.752 0 01-.511-.187L6.359 5.65a.75.75 0 01.75-1.299L9 5.442V1.125a.75.75 0 01.75-.75z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-right.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 8a.75.75 0 0 1-.75.75H2.75a.75.75 0 1 1 0-1.5h14.5a.75.75 0 0 1 .75.75zm0 4a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75zm0-8a.75.75 0 0 1-.75.75H7.321a.75.75 0 1 1 0-1.5h9.929a.75.75 0 0 1 .75.75z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M18 3.75a.75.75 0 01-.75.75H2.75a.75.75 0 110-1.5h14.5a.75.75 0 01.75.75zm0 8a.75.75 0 01-.75.75H2.75a.75.75 0 110-1.5h14.5a.75.75 0 01.75.75zm0 4a.75.75 0 01-.75.75H7.321a.75.75 0 110-1.5h9.929a.75.75 0 01.75.75zm0-8a.75.75 0 01-.75.75H7.321a.75.75 0 110-1.5h9.929a.75.75 0 01.75.75z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/align-top.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.261 7.062l2.88 1.663a.75.75 0 01-.75 1.3L10.5 8.933v7.317a.75.75 0 11-1.5 0V8.932l-1.89 1.093a.75.75 0 01-.75-1.3l2.879-1.663a.752.752 0 01.511-.187.752.752 0 01.511.187zM15.25 4a.75.75 0 110 1.5H4.75a.75.75 0 010-1.5h10.5z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M10.261 7.062l2.88 1.663a.75.75 0 01-.75 1.3L10.5 8.933v7.317a.75.75 0 11-1.5 0V8.932l-1.89 1.093a.75.75 0 01-.75-1.3l2.879-1.663a.752.752 0 01.511-.187.752.752 0 01.511.187zM15.25 4a.75.75 0 110 1.5H4.75a.75.75 0 010-1.5h10.5z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/cancel.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.591 10.177l4.243 4.242a1 1 0 0 1-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 0 1-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 0 1 5.934 4.52l4.243 4.243 4.242-4.243a1 1 0 1 1 1.415 1.414l-4.243 4.243z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M11.591 10.177l4.243 4.242a1 1 0 01-1.415 1.415l-4.242-4.243-4.243 4.243a1 1 0 01-1.414-1.415l4.243-4.242L4.52 5.934A1 1 0 015.934 4.52l4.243 4.243 4.242-4.243a1 1 0 111.415 1.414l-4.243 4.243z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/check.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 0 1-.744-.292l-4.596-4.596a1 1 0 1 1 1.414-1.414l3.926 3.926 9.937-9.937a1 1 0 0 1 1.414 1.415L7.717 16.323a.997.997 0 0 1-.745.292z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.972 16.615a.997.997 0 01-.744-.292l-4.596-4.596a1 1 0 111.414-1.414l3.926 3.926 9.937-9.937a1 1 0 011.414 1.415L7.717 16.323a.997.997 0 01-.745.292z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/eraser.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.636 9.531l-2.758 3.94a.5.5 0 0 0 .122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 0 1-.491-2.786l6.673-9.53a2 2 0 0 1 2.785-.49l3.742 2.62a2 2 0 0 1 .491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M8.636 9.531l-2.758 3.94a.5.5 0 00.122.696l3.224 2.284h1.314l2.636-3.736L8.636 9.53zm.288 8.451L5.14 15.396a2 2 0 01-.491-2.786l6.673-9.53a2 2 0 012.785-.49l3.742 2.62a2 2 0 01.491 2.785l-7.269 10.053-2.147-.066z"/><path d="M4 18h5.523v-1H4zm-2 0h1v-1H2z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/image.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 0 1 .87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 1 1 3.4-1.96 1.96 1.96 0 0 1-3.4 1.96z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.91 10.54c.26-.23.64-.21.88.03l3.36 3.14 2.23-2.06a.64.64 0 01.87 0l2.52 2.97V4.5H3.2v10.12l3.71-4.08zm10.27-7.51c.6 0 1.09.47 1.09 1.05v11.84c0 .59-.49 1.06-1.09 1.06H2.79c-.6 0-1.09-.47-1.09-1.06V4.08c0-.58.49-1.05 1.1-1.05h14.38zm-5.22 5.56a1.96 1.96 0 113.4-1.96 1.96 1.96 0 01-3.4 1.96z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/low-vision.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22L2.943 4.078a.75.75 0 1 1 1.06-1.06l2.592 2.59A11.094 11.094 0 0 1 10 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 0 1-.09 1.138.488.488 0 0 1-.15.084.75.75 0 0 1-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 0 0-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 0 1-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 0 0-.124.2c-.043.077-.08.158-.108.241a.534.534 0 0 0-.028.133.29.29 0 0 0 .008.072.927.927 0 0 0 .082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 0 1 1.108 5.992l.345.344.046-.018a9.313 9.313 0 0 0 2-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 0 0 .036-.12.29.29 0 0 0 .008-.072.492.492 0 0 0-.028-.133.999.999 0 0 0-.036-.096 2.165 2.165 0 0 0-.071-.145 2.917 2.917 0 0 0-.125-.2 3.592 3.592 0 0 0-.263-.335 5.444 5.444 0 0 0-.53-.523 7.955 7.955 0 0 0-1.054-.768 9.766 9.766 0 0 0-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21l-.069.002a.508.508 0 0 0-.254.097.496.496 0 0 0-.104.679.498.498 0 0 0 .326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 0 1 2.017 1.513c.024.061.043.125.069.185a.494.494 0 0 0 .45.287h.008a.496.496 0 0 0 .35-.158.482.482 0 0 0 .13-.335.638.638 0 0 0-.048-.219 3.379 3.379 0 0 0-.36-.723 3.438 3.438 0 0 0-2.791-1.543l-.028-.001h-.013z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M5.085 6.22L2.943 4.078a.75.75 0 111.06-1.06l2.592 2.59A11.094 11.094 0 0110 5.068c4.738 0 8.578 3.101 8.578 5.083 0 1.197-1.401 2.803-3.555 3.887l1.714 1.713a.75.75 0 01-.09 1.138.488.488 0 01-.15.084.75.75 0 01-.821-.16L6.17 7.304c-.258.11-.51.233-.757.365l6.239 6.24-.006.005.78.78c-.388.094-.78.166-1.174.215l-1.11-1.11h.011L4.55 8.197a7.2 7.2 0 00-.665.514l-.112.098 4.897 4.897-.005.006 1.276 1.276a10.164 10.164 0 01-1.477-.117l-.479-.479-.009.009-4.863-4.863-.022.031a2.563 2.563 0 00-.124.2c-.043.077-.08.158-.108.241a.534.534 0 00-.028.133.29.29 0 00.008.072.927.927 0 00.082.226c.067.133.145.26.234.379l3.242 3.365.025.01.59.623c-3.265-.918-5.59-3.155-5.59-4.668 0-1.194 1.448-2.838 3.663-3.93zm7.07.531a4.632 4.632 0 011.108 5.992l.345.344.046-.018a9.313 9.313 0 002-1.112c.256-.187.5-.392.727-.613.137-.134.27-.277.392-.431.072-.091.141-.185.203-.286.057-.093.107-.19.148-.292a.72.72 0 00.036-.12.29.29 0 00.008-.072.492.492 0 00-.028-.133.999.999 0 00-.036-.096 2.165 2.165 0 00-.071-.145 2.917 2.917 0 00-.125-.2 3.592 3.592 0 00-.263-.335 5.444 5.444 0 00-.53-.523 7.955 7.955 0 00-1.054-.768 9.766 9.766 0 00-1.879-.891c-.337-.118-.68-.219-1.027-.301zm-2.85.21l-.069.002a.508.508 0 00-.254.097.496.496 0 00-.104.679.498.498 0 00.326.199l.045.005c.091.003.181.003.272.012a2.45 2.45 0 012.017 1.513c.024.061.043.125.069.185a.494.494 0 00.45.287h.008a.496.496 0 00.35-.158.482.482 0 00.13-.335.638.638 0 00-.048-.219 3.379 3.379 0 00-.36-.723 3.438 3.438 0 00-2.791-1.543l-.028-.001h-.013z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/pencil.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7.3 17.37l-.061.088a1.518 1.518 0 0 1-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 0 1 .187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506L13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5L9.375 17H19v1.5H8z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M7.3 17.37l-.061.088a1.518 1.518 0 01-.934.535l-4.178.663-.806-4.153a1.495 1.495 0 01.187-1.058l.056-.086L8.77 2.639c.958-1.351 2.803-1.076 4.296-.03 1.497 1.047 2.387 2.693 1.433 4.055L7.3 17.37zM9.14 4.728l-5.545 8.346 3.277 2.294 5.544-8.346L9.14 4.728zM6.07 16.512l-3.276-2.295.53 2.73 2.746-.435zM9.994 3.506L13.271 5.8c.316-.452-.16-1.333-1.065-1.966-.905-.634-1.895-.78-2.212-.328zM8 18.5L9.375 17H19v1.5H8z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/pilcrow.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 0 1 0 2h-1.004v13a1 1 0 1 1-2 0V4H8.999v13a1 1 0 1 1-2 0v-7A4 4 0 0 1 3 6a4 4 0 0 1 3.999-4z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M6.999 2H15a1 1 0 010 2h-1.004v13a1 1 0 11-2 0V4H8.999v13a1 1 0 11-2 0v-7A4 4 0 013 6a4 4 0 013.999-4z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/quote.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 0 1 6.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 0 1 6.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><path d="M3 10.423a6.5 6.5 0 016.056-6.408l.038.67C6.448 5.423 5.354 7.663 5.22 10H9c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574zm8 0a6.5 6.5 0 016.056-6.408l.038.67c-2.646.739-3.74 2.979-3.873 5.315H17c.552 0 .5.432.5.986v4.511c0 .554-.448.503-1 .503h-5c-.552 0-.5-.449-.5-1.003v-4.574z"/></svg>

+ 1 - 1
packages/ckeditor5-core/theme/icons/three-vertical-dots.svg

@@ -1 +1 @@
-<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>
+<svg viewBox="0 0 20 20" xmlns="http://www.w3.org/2000/svg"><circle cx="9.5" cy="4.5" r="1.5"/><circle cx="9.5" cy="10.5" r="1.5"/><circle cx="9.5" cy="16.5" r="1.5"/></svg>