8
0
فهرست منبع

Merge branch 'master' into docs-fixes

Maciej Bukowski 9 سال پیش
والد
کامیت
d147ac1575
39فایلهای تغییر یافته به همراه291 افزوده شده و 124 حذف شده
  1. 1 1
      packages/ckeditor5-engine/.travis.yml
  2. 2 3
      packages/ckeditor5-engine/README.md
  3. 35 27
      packages/ckeditor5-engine/src/view/attributeelement.js
  4. 15 8
      packages/ckeditor5-engine/src/view/containerelement.js
  5. 63 0
      packages/ckeditor5-engine/src/view/element.js
  6. 15 9
      packages/ckeditor5-engine/src/view/emptyelement.js
  7. 1 1
      packages/ckeditor5-engine/tests/manual/tickets/401/1.html
  8. 6 6
      packages/ckeditor5-engine/tests/manual/tickets/401/1.js
  9. 1 1
      packages/ckeditor5-engine/tests/manual/tickets/462/1.html
  10. 7 7
      packages/ckeditor5-engine/tests/manual/tickets/462/1.js
  11. 1 1
      packages/ckeditor5-engine/tests/manual/tickets/475/1.html
  12. 16 16
      packages/ckeditor5-engine/tests/manual/tickets/475/1.js
  13. 1 1
      packages/ckeditor5-engine/tests/manual/tickets/603/1.html
  14. 8 8
      packages/ckeditor5-engine/tests/manual/tickets/603/1.js
  15. 1 1
      packages/ckeditor5-engine/tests/manual/tickets/629/1.html
  16. 6 6
      packages/ckeditor5-engine/tests/manual/tickets/629/1.js
  17. 73 0
      packages/ckeditor5-engine/tests/view/element.js
  18. 3 1
      packages/ckeditor5-engine/tests/view/manual/clickobserver.html
  19. 2 2
      packages/ckeditor5-engine/tests/view/manual/clickobserver.js
  20. 4 4
      packages/ckeditor5-engine/tests/view/manual/fakeselection.js
  21. 2 0
      packages/ckeditor5-engine/tests/view/manual/focus.html
  22. 2 2
      packages/ckeditor5-engine/tests/view/manual/focus.js
  23. 1 0
      packages/ckeditor5-engine/tests/view/manual/focusobserver.html
  24. 2 2
      packages/ckeditor5-engine/tests/view/manual/focusobserver.js
  25. 0 0
      packages/ckeditor5-engine/tests/view/manual/immutable.html
  26. 2 2
      packages/ckeditor5-engine/tests/view/manual/immutable.js
  27. 1 0
      packages/ckeditor5-engine/tests/view/manual/inline-filler.html
  28. 2 2
      packages/ckeditor5-engine/tests/view/manual/inline-filler.js
  29. 2 2
      packages/ckeditor5-engine/tests/view/manual/keyobserver.js
  30. 1 0
      packages/ckeditor5-engine/tests/view/manual/mutationobserver.html
  31. 2 2
      packages/ckeditor5-engine/tests/view/manual/mutationobserver.js
  32. 2 1
      packages/ckeditor5-engine/tests/view/manual/noselection-iframe.html
  33. 2 2
      packages/ckeditor5-engine/tests/view/manual/noselection-iframe.js
  34. 1 0
      packages/ckeditor5-engine/tests/view/manual/noselection.html
  35. 2 2
      packages/ckeditor5-engine/tests/view/manual/noselection.js
  36. 1 0
      packages/ckeditor5-engine/tests/view/manual/selectionobserver.html
  37. 2 2
      packages/ckeditor5-engine/tests/view/manual/selectionobserver.js
  38. 1 0
      packages/ckeditor5-engine/tests/view/manual/x-index.html
  39. 2 2
      packages/ckeditor5-engine/tests/view/manual/x-index.js

+ 1 - 1
packages/ckeditor5-engine/.travis.yml

@@ -22,5 +22,5 @@ install:
 script:
 script:
   - node_modules/.bin/ckeditor5-dev-tests --coverage --ignore-duplicates
   - node_modules/.bin/ckeditor5-dev-tests --coverage --ignore-duplicates
 after_success:
 after_success:
-  - sed -i.backup 's/\.build\/ckeditor5\/[^\/]*/src/g' .build/coverage/lcov.info
+  - sed -i.backup 's/build\/\.automated-tests\/ckeditor5\/[^\/]*/src/g' build/.automated-tests/coverage/lcov.info
   - node_modules/.bin/codeclimate-test-reporter < .build/coverage/lcov.info
   - node_modules/.bin/codeclimate-test-reporter < .build/coverage/lcov.info

+ 2 - 3
packages/ckeditor5-engine/README.md

@@ -4,9 +4,8 @@ CKEditor 5 Editing Engine
 [![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-engine.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine)
 [![npm version](https://badge.fury.io/js/%40ckeditor%2Fckeditor5-engine.svg)](https://www.npmjs.com/package/@ckeditor/ckeditor5-engine)
 [![Build Status](https://travis-ci.org/ckeditor/ckeditor5-engine.svg?branch=master)](https://travis-ci.org/ckeditor/ckeditor5-engine)
 [![Build Status](https://travis-ci.org/ckeditor/ckeditor5-engine.svg?branch=master)](https://travis-ci.org/ckeditor/ckeditor5-engine)
 [![Test Coverage](https://codeclimate.com/github/ckeditor/ckeditor5-engine/badges/coverage.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-engine/coverage)
 [![Test Coverage](https://codeclimate.com/github/ckeditor/ckeditor5-engine/badges/coverage.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-engine/coverage)
-[![Code Climate](https://codeclimate.com/github/ckeditor/ckeditor5-engine/badges/gpa.svg)](https://codeclimate.com/github/ckeditor/ckeditor5-engine)
-[![Dependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine#info=dependencies)
-[![devDependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/dev-status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine#info=devDependencies)
+[![Dependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine)
+[![devDependency Status](https://david-dm.org/ckeditor/ckeditor5-engine/dev-status.svg)](https://david-dm.org/ckeditor/ckeditor5-engine?type=dev)
 
 
 The editing engine of CKEditor 5 project. More information about the project can be found at the following url: <https://github.com/ckeditor/ckeditor5>.
 The editing engine of CKEditor 5 project. More information about the project can be found at the following url: <https://github.com/ckeditor/ckeditor5>.
 
 

+ 35 - 27
packages/ckeditor5-engine/src/view/attributeelement.js

@@ -39,6 +39,14 @@ export default class AttributeElement extends Element {
 		 * @member {Number} module:engine/view/attributeelement~AttributeElement#priority
 		 * @member {Number} module:engine/view/attributeelement~AttributeElement#priority
 		 */
 		 */
 		this.priority = DEFAULT_PRIORITY;
 		this.priority = DEFAULT_PRIORITY;
+
+		/**
+		 * Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.
+		 *
+		 * @method #getFillerOffset
+		 * @returns {Number|null} Block filler offset or `null` if block filler is not needed.
+		 */
+		this.getFillerOffset = getFillerOffset;
 	}
 	}
 
 
 	/**
 	/**
@@ -68,40 +76,40 @@ export default class AttributeElement extends Element {
 	isSimilar( otherElement ) {
 	isSimilar( otherElement ) {
 		return super.isSimilar( otherElement ) && this.priority == otherElement.priority;
 		return super.isSimilar( otherElement ) && this.priority == otherElement.priority;
 	}
 	}
+}
 
 
-	/**
-	 * Returns block {@link module:engine/view/filler filler} offset or `null` if a block filler is not needed.
-	 *
-	 * @returns {Number|null} Block filler offset or `null` if block filler is not needed.
-	 */
-	getFillerOffset() {
-		// <b>foo</b> does not need filler.
-		if ( this.childCount ) {
-			return null;
-		}
+/**
+ * Default attribute priority.
+ *
+ * @member {Number} module:engine/view/attributeelement~AttributeElement.DEFAULT_PRIORITY
+ */
+AttributeElement.DEFAULT_PRIORITY = DEFAULT_PRIORITY;
 
 
-		let element = this.parent;
+// Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.
+//
+// @returns {Number|null} Block filler offset or `null` if block filler is not needed.
+function getFillerOffset() {
+	/*jshint validthis:true */
 
 
-		// <p><b></b></p> needs filler -> <p><b><br></b></p>
-		while ( element instanceof AttributeElement ) {
-			if ( element.childCount > 1 ) {
-				return null;
-			}
+	// <b>foo</b> does not need filler.
+	if ( this.childCount ) {
+		return null;
+	}
 
 
-			element = element.parent;
-		}
+	let element = this.parent;
 
 
-		if ( !element || element.childCount > 1 ) {
+	// <p><b></b></p> needs filler -> <p><b><br></b></p>
+	while ( element instanceof AttributeElement ) {
+		if ( element.childCount > 1 ) {
 			return null;
 			return null;
 		}
 		}
 
 
-		return 0;
+		element = element.parent;
 	}
 	}
-}
 
 
-/**
- * Default attribute priority.
- *
- * @member {Number} module:engine/view/attributeelement~AttributeElement.DEFAULT_PRIORITY
- */
-AttributeElement.DEFAULT_PRIORITY = DEFAULT_PRIORITY;
+	if ( !element || element.childCount > 1 ) {
+		return null;
+	}
+
+	return 0;
+}

+ 15 - 8
packages/ckeditor5-engine/src/view/containerelement.js

@@ -52,14 +52,21 @@ export default class ContainerElement extends Element {
 	 */
 	 */
 	constructor( name, attrs, children ) {
 	constructor( name, attrs, children ) {
 		super( name, attrs, children );
 		super( name, attrs, children );
-	}
 
 
-	/**
-	 * Returns block {@link module:engine/view/filler filler} offset or `null` if block filler is not needed.
-	 *
-	 * @returns {Number|null} Block filler offset or `null` if block filler is not needed.
-	 */
-	getFillerOffset() {
-		return this.childCount === 0 ? 0 : null;
+		/**
+		 * Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.
+		 *
+		 * @method #getFillerOffset
+		 * @returns {Number|null} Block filler offset or `null` if block filler is not needed.
+		 */
+		this.getFillerOffset = getFillerOffset;
 	}
 	}
 }
 }
+
+// Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.
+//
+// @returns {Number|null} Block filler offset or `null` if block filler is not needed.
+function getFillerOffset() {
+	/*jshint validthis:true */
+	return this.childCount === 0 ? 0 : null;
+}

+ 63 - 0
packages/ckeditor5-engine/src/view/element.js

@@ -105,6 +105,15 @@ export default class Element extends Node {
 			parseInlineStyles( this._styles, this._attrs.get( 'style' ) );
 			parseInlineStyles( this._styles, this._attrs.get( 'style' ) );
 			this._attrs.delete( 'style' );
 			this._attrs.delete( 'style' );
 		}
 		}
+
+		/**
+		 * Map of custom properties.
+		 * Custom properties can be added to element instance, will be cloned but not rendered into DOM.
+		 *
+		 * @protected
+		 * @memeber {Map} engine.view.Element#_customProperties.
+		 */
+		this._customProperties = new Map();
 	}
 	}
 
 
 	/**
 	/**
@@ -151,6 +160,12 @@ export default class Element extends Node {
 		cloned._classes = new Set( this._classes );
 		cloned._classes = new Set( this._classes );
 		cloned._styles = new Map( this._styles );
 		cloned._styles = new Map( this._styles );
 
 
+		// Clone custom properties.
+		cloned._customProperties = new Map( this._customProperties );
+
+		// Clone filler offset method.
+		cloned.getFillerOffset = this.getFillerOffset;
+
 		return cloned;
 		return cloned;
 	}
 	}
 
 
@@ -597,6 +612,54 @@ export default class Element extends Node {
 
 
 		return null;
 		return null;
 	}
 	}
+
+	/**
+	 * Sets a custom property. Unlike attributes, custom properties are not rendered to the DOM,
+	 * so they can be used to add special data to elements.
+	 *
+	 * @param {String|Symbol} key
+	 * @param {*} value
+	 */
+	setCustomProperty( key, value ) {
+		this._customProperties.set( key, value );
+	}
+
+	/**
+	 * Returns the custom property value for the given key.
+	 *
+	 * @param {String|Symbol} key
+	 * @returns {*}
+	 */
+	getCustomProperty( key ) {
+		return this._customProperties.get( key );
+	}
+
+	/**
+	 * Removes the custom property stored under the given key.
+	 *
+	 * @param {String|Symbol} key
+	 * @returns {Boolean} Returns true if property was removed.
+	 */
+	removeCustomProperty( key ) {
+		return this._customProperties.delete( key );
+	}
+
+	/**
+	 * Returns an iterator which iterates over this element's custom properties.
+	 * Iterator provides [key, value] pair for each stored property.
+	 *
+	 * @returns {Iterable.<*>}
+	 */
+	*getCustomProperties() {
+		yield* this._customProperties.entries();
+	}
+
+	/**
+	 * Returns block {@link module:engine/view/filler~Filler filler} offset or `null` if block filler is not needed.
+	 *
+	 * @abstract
+	 * @method module:engine/view/element~Element#getFillerOffset
+	 */
 }
 }
 
 
 // Parses inline styles and puts property - value pairs into styles map.
 // Parses inline styles and puts property - value pairs into styles map.

+ 15 - 9
packages/ckeditor5-engine/src/view/emptyelement.js

@@ -29,6 +29,14 @@ export default class EmptyElement extends Element {
 		if ( arguments.length > 2 ) {
 		if ( arguments.length > 2 ) {
 			throwCannotAdd();
 			throwCannotAdd();
 		}
 		}
+
+		/**
+		 * Returns `null` because filler is not needed for EmptyElements.
+		 *
+		 * @method #getFillerOffset
+		 * @returns {null} Always returns null.
+		 */
+		this.getFillerOffset = getFillerOffset;
 	}
 	}
 
 
 	/**
 	/**
@@ -65,15 +73,6 @@ export default class EmptyElement extends Element {
 	insertChildren() {
 	insertChildren() {
 		throwCannotAdd();
 		throwCannotAdd();
 	}
 	}
-
-	/**
-	 * Returns `null` because block filler is not needed.
-	 *
-	 * @returns {null}
-	 */
-	getFillerOffset() {
-		return null;
-	}
 }
 }
 
 
 function throwCannotAdd() {
 function throwCannotAdd() {
@@ -84,3 +83,10 @@ function throwCannotAdd() {
 	 */
 	 */
 	throw new CKEditorError( 'view-emptyelement-cannot-add: Cannot add child nodes to EmptyElement instance.' );
 	throw new CKEditorError( 'view-emptyelement-cannot-add: Cannot add child nodes to EmptyElement instance.' );
 }
 }
+
+// Returns `null` because block filler is not needed for EmptyElements.
+//
+// @returns {null}
+function getFillerOffset() {
+	return null;
+}

+ 1 - 1
packages/ckeditor5-engine/tests/manual/tickets/401/1.html

@@ -1,5 +1,5 @@
 <head>
 <head>
-	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+	<link rel="stylesheet" href="/theme/ckeditor.css">
 </head>
 </head>
 
 
 <div id="editor">
 <div id="editor">

+ 6 - 6
packages/ckeditor5-engine/tests/manual/tickets/401/1.js

@@ -5,14 +5,14 @@
 
 
 /* globals console, document, window */
 /* globals console, document, window */
 
 
-import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
-import Enter from '/ckeditor5/enter/enter.js';
-import Typing from '/ckeditor5/typing/typing.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
-import Bold from '/ckeditor5/basic-styles/bold.js';
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
+import Enter from 'ckeditor5/enter/enter.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Bold from 'ckeditor5/basic-styles/bold.js';
 
 
 ClassicEditor.create( document.getElementById( 'editor' ), {
 ClassicEditor.create( document.getElementById( 'editor' ), {
-	features: [ Enter, Typing, Paragraph, Bold ],
+	plugins: [ Enter, Typing, Paragraph, Bold ],
 	toolbar: [ 'bold' ]
 	toolbar: [ 'bold' ]
 } )
 } )
 .then( editor => {
 .then( editor => {

+ 1 - 1
packages/ckeditor5-engine/tests/manual/tickets/462/1.html

@@ -1,5 +1,5 @@
 <head>
 <head>
-	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+	<link rel="stylesheet" href="/theme/ckeditor.css">
 </head>
 </head>
 
 
 <div id="editor">
 <div id="editor">

+ 7 - 7
packages/ckeditor5-engine/tests/manual/tickets/462/1.js

@@ -5,15 +5,15 @@
 
 
 /* globals console, window, document, setInterval */
 /* globals console, window, document, setInterval */
 
 
-import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
-import Enter from '/ckeditor5/enter/enter.js';
-import Typing from '/ckeditor5/typing/typing.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
-import Bold from '/ckeditor5/basic-styles/bold.js';
-import Italic from '/ckeditor5/basic-styles/italic.js';
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
+import Enter from 'ckeditor5/enter/enter.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Bold from 'ckeditor5/basic-styles/bold.js';
+import Italic from 'ckeditor5/basic-styles/italic.js';
 
 
 ClassicEditor.create( document.querySelector( '#editor' ), {
 ClassicEditor.create( document.querySelector( '#editor' ), {
-	features: [ Enter, Typing, Paragraph, Bold, Italic ],
+	plugins: [ Enter, Typing, Paragraph, Bold, Italic ],
 	toolbar: [ 'bold', 'italic' ]
 	toolbar: [ 'bold', 'italic' ]
 } )
 } )
 .then( editor => {
 .then( editor => {

+ 1 - 1
packages/ckeditor5-engine/tests/manual/tickets/475/1.html

@@ -1,5 +1,5 @@
 <head>
 <head>
-	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+	<link rel="stylesheet" href="/theme/ckeditor.css">
 </head>
 </head>
 
 
 <div id="editor">
 <div id="editor">

+ 16 - 16
packages/ckeditor5-engine/tests/manual/tickets/475/1.js

@@ -5,26 +5,26 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
 
 
-import Feature from '/ckeditor5/core/feature.js';
+import Plugin from 'ckeditor5/core/plugin.js';
 
 
-import TreeWalker from '/ckeditor5/engine/model/treewalker.js';
-import Position from '/ckeditor5/engine/model/position.js';
-import Range from '/ckeditor5/engine/model/range.js';
-import LivePosition from '/ckeditor5/engine/model/liveposition.js';
+import TreeWalker from 'ckeditor5/engine/model/treewalker.js';
+import Position from 'ckeditor5/engine/model/position.js';
+import Range from 'ckeditor5/engine/model/range.js';
+import LivePosition from 'ckeditor5/engine/model/liveposition.js';
 
 
-import buildModelConverter from '/ckeditor5/engine/conversion/buildmodelconverter.js';
-import buildViewConverter from '/ckeditor5/engine/conversion/buildviewconverter.js';
+import buildModelConverter from 'ckeditor5/engine/conversion/buildmodelconverter.js';
+import buildViewConverter from 'ckeditor5/engine/conversion/buildviewconverter.js';
 
 
-import AttributeElement from '/ckeditor5/engine/view/attributeelement.js';
+import AttributeElement from 'ckeditor5/engine/view/attributeelement.js';
 
 
-import Enter from '/ckeditor5/enter/enter.js';
-import Typing from '/ckeditor5/typing/typing.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
-import Undo from '/ckeditor5/undo/undo.js';
+import Enter from 'ckeditor5/enter/enter.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Undo from 'ckeditor5/undo/undo.js';
 
 
-class Link extends Feature {
+class Link extends Plugin {
 	init() {
 	init() {
 		const editor = this.editor;
 		const editor = this.editor;
 		const data = editor.data;
 		const data = editor.data;
@@ -47,7 +47,7 @@ class Link extends Feature {
 
 
 const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
 const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/;
 
 
-class AutoLinker extends Feature {
+class AutoLinker extends Plugin {
 	init() {
 	init() {
 		this.editor.document.on( 'change', ( event, type, changes, batch ) => {
 		this.editor.document.on( 'change', ( event, type, changes, batch ) => {
 			if ( type != 'insert' ) {
 			if ( type != 'insert' ) {
@@ -92,6 +92,6 @@ function _getLastPathPart( path ) {
 }
 }
 
 
 ClassicEditor.create( document.querySelector( '#editor' ), {
 ClassicEditor.create( document.querySelector( '#editor' ), {
-	features: [ Enter, Typing, Paragraph, Undo, Link, AutoLinker ],
+	plugins: [ Enter, Typing, Paragraph, Undo, Link, AutoLinker ],
 	toolbar: [ 'undo', 'redo' ]
 	toolbar: [ 'undo', 'redo' ]
 } );
 } );

+ 1 - 1
packages/ckeditor5-engine/tests/manual/tickets/603/1.html

@@ -1,5 +1,5 @@
 <head>
 <head>
-	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+	<link rel="stylesheet" href="/theme/ckeditor.css">
 </head>
 </head>
 
 
 <div id="editor">
 <div id="editor">

+ 8 - 8
packages/ckeditor5-engine/tests/manual/tickets/603/1.js

@@ -5,16 +5,16 @@
 
 
 /* globals console, window, document */
 /* globals console, window, document */
 
 
-import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
-import Enter from '/ckeditor5/enter/enter.js';
-import Typing from '/ckeditor5/typing/typing.js';
-import Heading from '/ckeditor5/heading/heading.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
-import Bold from '/ckeditor5/basic-styles/bold.js';
-import Italic from '/ckeditor5/basic-styles/italic.js';
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
+import Enter from 'ckeditor5/enter/enter.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Heading from 'ckeditor5/heading/heading.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Bold from 'ckeditor5/basic-styles/bold.js';
+import Italic from 'ckeditor5/basic-styles/italic.js';
 
 
 ClassicEditor.create( document.querySelector( '#editor' ), {
 ClassicEditor.create( document.querySelector( '#editor' ), {
-	features: [ Enter, Typing, Paragraph, Heading, Bold, Italic ],
+	plugins: [ Enter, Typing, Paragraph, Heading, Bold, Italic ],
 	toolbar: [ 'headings', 'bold', 'italic' ]
 	toolbar: [ 'headings', 'bold', 'italic' ]
 } )
 } )
 .then( editor => {
 .then( editor => {

+ 1 - 1
packages/ckeditor5-engine/tests/manual/tickets/629/1.html

@@ -1,5 +1,5 @@
 <head>
 <head>
-	<link rel="stylesheet" href="%APPS_DIR%ckeditor/build/modules/amd/theme/ckeditor.css">
+	<link rel="stylesheet" href="/theme/ckeditor.css">
 </head>
 </head>
 
 
 <div id="editor">
 <div id="editor">

+ 6 - 6
packages/ckeditor5-engine/tests/manual/tickets/629/1.js

@@ -5,14 +5,14 @@
 
 
 /* globals console, window, document */
 /* globals console, window, document */
 
 
-import ClassicEditor from '/ckeditor5/editor-classic/classic.js';
-import Enter from '/ckeditor5/enter/enter.js';
-import Typing from '/ckeditor5/typing/typing.js';
-import Paragraph from '/ckeditor5/paragraph/paragraph.js';
-import Bold from '/ckeditor5/basic-styles/bold.js';
+import ClassicEditor from 'ckeditor5/editor-classic/classic.js';
+import Enter from 'ckeditor5/enter/enter.js';
+import Typing from 'ckeditor5/typing/typing.js';
+import Paragraph from 'ckeditor5/paragraph/paragraph.js';
+import Bold from 'ckeditor5/basic-styles/bold.js';
 
 
 ClassicEditor.create( document.querySelector( '#editor' ), {
 ClassicEditor.create( document.querySelector( '#editor' ), {
-	features: [ Enter, Typing, Paragraph, Bold ],
+	plugins: [ Enter, Typing, Paragraph, Bold ],
 	toolbar: [ 'bold' ]
 	toolbar: [ 'bold' ]
 } )
 } )
 .then( editor => {
 .then( editor => {

+ 73 - 0
packages/ckeditor5-engine/tests/view/element.js

@@ -157,6 +157,30 @@ describe( 'Element', () => {
 			expect( clone._styles.has( 'font-size' ) ).to.be.true;
 			expect( clone._styles.has( 'font-size' ) ).to.be.true;
 			expect( clone._styles.get( 'font-size' ) ).to.equal( '12px' );
 			expect( clone._styles.get( 'font-size' ) ).to.equal( '12px' );
 		} );
 		} );
+
+		it( 'should clone custom properties', () => {
+			const el = new Element( 'p' );
+			const symbol = Symbol( 'custom' );
+			el.setCustomProperty( 'foo', 'bar' );
+			el.setCustomProperty( symbol, 'baz' );
+
+			const cloned = el.clone();
+
+			expect( cloned.getCustomProperty( 'foo' ) ).to.equal( 'bar' );
+			expect( cloned.getCustomProperty( symbol ) ).to.equal( 'baz' );
+		} );
+
+		it( 'should clone getFillerOffset', () => {
+			const el = new Element( 'p' );
+			const fm = () => 'foo bar';
+
+			expect( el.getFillerOffset ).to.be.undefined;
+			el.getFillerOffset = fm;
+
+			const cloned = el.clone();
+
+			expect( cloned.getFillerOffset ).to.equal( fm );
+		} );
 	} );
 	} );
 
 
 	describe( 'isSimilar', () => {
 	describe( 'isSimilar', () => {
@@ -817,4 +841,53 @@ describe( 'Element', () => {
 			} ) ).to.be.null;
 			} ) ).to.be.null;
 		} );
 		} );
 	} );
 	} );
+
+	describe( 'custom properties', () => {
+		it( 'should allow to set and get custom properties', () => {
+			const el = new Element( 'p' );
+			el.setCustomProperty( 'foo', 'bar' );
+
+			expect( el.getCustomProperty( 'foo' ) ).to.equal( 'bar' );
+		} );
+
+		it( 'should allow to add symbol property', () => {
+			const el = new Element( 'p' );
+			const symbol = Symbol( 'custom' );
+			el.setCustomProperty( symbol, 'bar' );
+
+			expect( el.getCustomProperty( symbol ) ).to.equal( 'bar' );
+		} );
+
+		it( 'should allow to remove custom property', () => {
+			const el = new Element( 'foo' );
+			const symbol = Symbol( 'quix' );
+			el.setCustomProperty( 'bar', 'baz' );
+			el.setCustomProperty( symbol, 'test' );
+
+			expect( el.getCustomProperty( 'bar' ) ).to.equal( 'baz' );
+			expect( el.getCustomProperty( symbol ) ).to.equal( 'test' );
+
+			el.removeCustomProperty( 'bar' );
+			el.removeCustomProperty( symbol );
+
+			expect( el.getCustomProperty( 'bar' ) ).to.be.undefined;
+			expect( el.getCustomProperty( symbol ) ).to.be.undefined;
+		} );
+
+		it( 'should allow to iterate over custom properties', () => {
+			const el = new Element( 'p' );
+			el.setCustomProperty( 'foo', 1 );
+			el.setCustomProperty( 'bar', 2 );
+			el.setCustomProperty( 'baz', 3 );
+
+			const properties = [ ...el.getCustomProperties() ];
+
+			expect( properties[ 0 ][ 0 ] ).to.equal( 'foo' );
+			expect( properties[ 0 ][ 1 ] ).to.equal( 1 );
+			expect( properties[ 1 ][ 0 ] ).to.equal( 'bar' );
+			expect( properties[ 1 ][ 1 ] ).to.equal( 2 );
+			expect( properties[ 2 ][ 0 ] ).to.equal( 'baz' );
+			expect( properties[ 2 ][ 1 ] ).to.equal( 3 );
+		} );
+	} );
 } );
 } );

+ 3 - 1
packages/ckeditor5-engine/tests/view/manual/clickobserver.html

@@ -1,5 +1,7 @@
+<div contenteditable="true" id="editor"></div>
+
 <button id="clickerA">Clicker A</button>
 <button id="clickerA">Clicker A</button>
 <button id="clickerB">Clicker B</button>
 <button id="clickerB">Clicker B</button>
 
 
 <button id="enable1">Enable event 1</button>
 <button id="enable1">Enable event 1</button>
-<button id="disable1">Disable event 1</button>
+<button id="disable1">Disable event 1</button>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/clickobserver.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import DomEventObserver from '/ckeditor5/engine/view/observer/domeventobserver.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import DomEventObserver from 'ckeditor5/engine/view/observer/domeventobserver.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 let observer1, observer2;
 let observer1, observer2;

+ 4 - 4
packages/ckeditor5-engine/tests/view/manual/fakeselection.js

@@ -5,10 +5,10 @@
 
 
 /* globals document, console */
 /* globals document, console */
 
 
-import ViewDocument from '/ckeditor5/engine/view/document.js';
-import DomEventObserver from '/ckeditor5/engine/view/observer/domeventobserver.js';
-import ViewRange from '/ckeditor5/engine/view/range.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import ViewDocument from 'ckeditor5/engine/view/document.js';
+import DomEventObserver from 'ckeditor5/engine/view/observer/domeventobserver.js';
+import ViewRange from 'ckeditor5/engine/view/range.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new ViewDocument();
 const viewDocument = new ViewDocument();
 const domEditable = document.getElementById( 'editor' );
 const domEditable = document.getElementById( 'editor' );

+ 2 - 0
packages/ckeditor5-engine/tests/view/manual/focus.html

@@ -1,3 +1,5 @@
+<div contenteditable="true" id="editor"></div>
+
 <div contenteditable="true" id="editable1">
 <div contenteditable="true" id="editable1">
 </div>
 </div>
 <div contenteditable="true" id="editable2">
 <div contenteditable="true" id="editable2">

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/focus.js

@@ -5,8 +5,8 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { parse } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { parse } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 
 

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/focusobserver.html

@@ -1,3 +1,4 @@
+<div contenteditable="true" id="editor"></div>
 <div contenteditable="true" id="editable1" style="border: solid 1px black; background-color: red">
 <div contenteditable="true" id="editable1" style="border: solid 1px black; background-color: red">
 </div>
 </div>
 <div contenteditable="true" id="editable2" style="border: solid 1px black; background-color: red">
 <div contenteditable="true" id="editable2" style="border: solid 1px black; background-color: red">

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/focusobserver.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 
 

+ 0 - 0
packages/ckeditor5-engine/tests/view/manual/__template__.html → packages/ckeditor5-engine/tests/view/manual/immutable.html


+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/immutable.js

@@ -5,8 +5,8 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/inline-filler.html

@@ -0,0 +1 @@
+<div contenteditable="true" id="editor"></div>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/inline-filler.js

@@ -5,8 +5,8 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/keyobserver.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 
 

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/mutationobserver.html

@@ -0,0 +1 @@
+<div contenteditable="true" id="editor"></div>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/mutationobserver.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );

+ 2 - 1
packages/ckeditor5-engine/tests/view/manual/noselection-iframe.html

@@ -1 +1,2 @@
-<iframe id="iframe" src="__template__.html"></iframe>
+<div contenteditable="true" id="editor"></div>
+<iframe id="iframe" src="immutable.html"></iframe>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/noselection-iframe.js

@@ -5,8 +5,8 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 const iframe = document.getElementById( 'iframe' );
 const iframe = document.getElementById( 'iframe' );

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/noselection.html

@@ -0,0 +1 @@
+<div contenteditable="true" id="editor"></div>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/noselection.js

@@ -5,8 +5,8 @@
 
 
 /* globals document */
 /* globals document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/selectionobserver.html

@@ -0,0 +1 @@
+<div contenteditable="true" id="editor"></div>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/selectionobserver.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );

+ 1 - 0
packages/ckeditor5-engine/tests/view/manual/x-index.html

@@ -0,0 +1 @@
+<div contenteditable="true" id="editor"></div>

+ 2 - 2
packages/ckeditor5-engine/tests/view/manual/x-index.js

@@ -5,8 +5,8 @@
 
 
 /* globals console:false, document */
 /* globals console:false, document */
 
 
-import Document from '/ckeditor5/engine/view/document.js';
-import { setData } from '/ckeditor5/engine/dev-utils/view.js';
+import Document from 'ckeditor5/engine/view/document.js';
+import { setData } from 'ckeditor5/engine/dev-utils/view.js';
 
 
 const viewDocument = new Document();
 const viewDocument = new Document();
 viewDocument.createRoot( document.getElementById( 'editor' ) );
 viewDocument.createRoot( document.getElementById( 'editor' ) );