Procházet zdrojové kódy

Merge branch 'master' into t/116

Maciej Bukowski před 9 roky
rodič
revize
e4f2ecccbc
94 změnil soubory, kde provedl 570 přidání a 236 odebrání
  1. 5 6
      packages/ckeditor5-utils/.travis.yml
  2. 1 1
      packages/ckeditor5-utils/LICENSE.md
  3. 1 1
      packages/ckeditor5-utils/gulpfile.js
  4. 3 2
      packages/ckeditor5-utils/package.json
  5. 1 1
      packages/ckeditor5-utils/src/ckeditorerror.js
  6. 1 1
      packages/ckeditor5-utils/src/collection.js
  7. 1 1
      packages/ckeditor5-utils/src/comparearrays.js
  8. 1 1
      packages/ckeditor5-utils/src/config.js
  9. 1 1
      packages/ckeditor5-utils/src/count.js
  10. 1 1
      packages/ckeditor5-utils/src/diff.js
  11. 1 1
      packages/ckeditor5-utils/src/difftochanges.js
  12. 1 1
      packages/ckeditor5-utils/src/dom/createelement.js
  13. 5 16
      packages/ckeditor5-utils/src/dom/emittermixin.js
  14. 1 1
      packages/ckeditor5-utils/src/dom/getancestors.js
  15. 1 1
      packages/ckeditor5-utils/src/dom/getcommonancestor.js
  16. 1 1
      packages/ckeditor5-utils/src/dom/getdatafromelement.js
  17. 1 1
      packages/ckeditor5-utils/src/dom/getpositionedancestor.js
  18. 1 1
      packages/ckeditor5-utils/src/dom/global.js
  19. 1 1
      packages/ckeditor5-utils/src/dom/indexof.js
  20. 1 1
      packages/ckeditor5-utils/src/dom/insertat.js
  21. 1 1
      packages/ckeditor5-utils/src/dom/isrange.js
  22. 1 1
      packages/ckeditor5-utils/src/dom/position.js
  23. 1 1
      packages/ckeditor5-utils/src/dom/rect.js
  24. 1 1
      packages/ckeditor5-utils/src/dom/remove.js
  25. 1 1
      packages/ckeditor5-utils/src/dom/setdatainelement.js
  26. 1 1
      packages/ckeditor5-utils/src/dom/tounit.js
  27. 1 1
      packages/ckeditor5-utils/src/elementreplacer.js
  28. 57 8
      packages/ckeditor5-utils/src/emittermixin.js
  29. 1 1
      packages/ckeditor5-utils/src/env.js
  30. 1 1
      packages/ckeditor5-utils/src/eventinfo.js
  31. 12 12
      packages/ckeditor5-utils/src/focustracker.js
  32. 1 1
      packages/ckeditor5-utils/src/isiterable.js
  33. 7 1
      packages/ckeditor5-utils/src/keyboard.js
  34. 111 0
      packages/ckeditor5-utils/src/keystrokehandler.js
  35. 1 1
      packages/ckeditor5-utils/src/locale.js
  36. 1 1
      packages/ckeditor5-utils/src/log.js
  37. 1 1
      packages/ckeditor5-utils/src/mapsequal.js
  38. 1 1
      packages/ckeditor5-utils/src/mix.js
  39. 1 1
      packages/ckeditor5-utils/src/nth.js
  40. 1 1
      packages/ckeditor5-utils/src/objecttomap.js
  41. 1 1
      packages/ckeditor5-utils/src/observablemixin.js
  42. 1 1
      packages/ckeditor5-utils/src/priorities.js
  43. 1 1
      packages/ckeditor5-utils/src/spy.js
  44. 1 1
      packages/ckeditor5-utils/src/tomap.js
  45. 1 1
      packages/ckeditor5-utils/src/uid.js
  46. 1 1
      packages/ckeditor5-utils/src/unicode.js
  47. 2 2
      packages/ckeditor5-utils/tests/_utils-tests/normalizehtml.js
  48. 5 5
      packages/ckeditor5-utils/tests/_utils-tests/utils.js
  49. 1 1
      packages/ckeditor5-utils/tests/_utils/locale-mock.js
  50. 3 3
      packages/ckeditor5-utils/tests/_utils/normalizehtml.js
  51. 2 2
      packages/ckeditor5-utils/tests/_utils/utils.js
  52. 2 2
      packages/ckeditor5-utils/tests/ckeditorerror.js
  53. 4 4
      packages/ckeditor5-utils/tests/collection.js
  54. 2 2
      packages/ckeditor5-utils/tests/comparearrays.js
  55. 2 2
      packages/ckeditor5-utils/tests/config.js
  56. 2 2
      packages/ckeditor5-utils/tests/count.js
  57. 2 2
      packages/ckeditor5-utils/tests/diff.js
  58. 3 3
      packages/ckeditor5-utils/tests/difftochanges.js
  59. 2 2
      packages/ckeditor5-utils/tests/dom/createelement.js
  60. 4 12
      packages/ckeditor5-utils/tests/dom/emittermixin.js
  61. 3 3
      packages/ckeditor5-utils/tests/dom/getancestors.js
  62. 3 3
      packages/ckeditor5-utils/tests/dom/getcommonancestor.js
  63. 2 2
      packages/ckeditor5-utils/tests/dom/getdatafromelement.js
  64. 2 2
      packages/ckeditor5-utils/tests/dom/getpositionedancestor.js
  65. 3 3
      packages/ckeditor5-utils/tests/dom/global.js
  66. 2 2
      packages/ckeditor5-utils/tests/dom/indexof.js
  67. 2 2
      packages/ckeditor5-utils/tests/dom/insertat.js
  68. 2 2
      packages/ckeditor5-utils/tests/dom/isrange.js
  69. 4 4
      packages/ckeditor5-utils/tests/dom/position.js
  70. 4 4
      packages/ckeditor5-utils/tests/dom/rect.js
  71. 2 2
      packages/ckeditor5-utils/tests/dom/remove.js
  72. 3 3
      packages/ckeditor5-utils/tests/dom/setdatainelement.js
  73. 2 2
      packages/ckeditor5-utils/tests/dom/tounit.js
  74. 2 2
      packages/ckeditor5-utils/tests/elementreplacer.js
  75. 54 24
      packages/ckeditor5-utils/tests/emittermixin.js
  76. 2 2
      packages/ckeditor5-utils/tests/env.js
  77. 2 2
      packages/ckeditor5-utils/tests/eventinfo.js
  78. 4 4
      packages/ckeditor5-utils/tests/focustracker.js
  79. 2 2
      packages/ckeditor5-utils/tests/isIterable.js
  80. 12 5
      packages/ckeditor5-utils/tests/keyboard.js
  81. 150 0
      packages/ckeditor5-utils/tests/keystrokehandler.js
  82. 2 2
      packages/ckeditor5-utils/tests/locale.js
  83. 2 2
      packages/ckeditor5-utils/tests/lodash.js
  84. 2 2
      packages/ckeditor5-utils/tests/log.js
  85. 2 2
      packages/ckeditor5-utils/tests/manual/focustracker.js
  86. 2 2
      packages/ckeditor5-utils/tests/mapsequal.js
  87. 2 2
      packages/ckeditor5-utils/tests/mix.js
  88. 2 2
      packages/ckeditor5-utils/tests/nth.js
  89. 8 8
      packages/ckeditor5-utils/tests/observablemixin.js
  90. 2 2
      packages/ckeditor5-utils/tests/priorities.js
  91. 2 2
      packages/ckeditor5-utils/tests/spy.js
  92. 3 3
      packages/ckeditor5-utils/tests/tomap.js
  93. 2 2
      packages/ckeditor5-utils/tests/uid.js
  94. 2 2
      packages/ckeditor5-utils/tests/unicode.js

+ 5 - 6
packages/ckeditor5-utils/.travis.yml

@@ -15,11 +15,10 @@ before_install:
   - export DISPLAY=:99.0
   - sh -e /etc/init.d/xvfb start
 install:
-  - npm install
-  - npm install @ckeditor/ckeditor5-dev-tests
-  - npm install codeclimate-test-reporter
+  - npm install gulp mgit2 lerna codeclimate-test-reporter
+  - npm install @ckeditor/ckeditor5-dev-tests @ckeditor/ckeditor5-dev-lint
+  - ckeditor5-dev-tests-install-dependencies
 script:
-  - node_modules/.bin/ckeditor5-dev-tests-travis
+  - ckeditor5-dev-tests-travis
 after_success:
-  - node_modules/.bin/codeclimate-test-reporter < build/.automated-tests/coverage/lcov.info
-
+  - codeclimate-test-reporter < coverage/lcov.info

+ 1 - 1
packages/ckeditor5-utils/LICENSE.md

@@ -2,7 +2,7 @@ Software License Agreement
 ==========================
 
 **CKEditor 5 Utils** – https://github.com/ckeditor/ckeditor5-utils <br>
-Copyright (c) 2003-2016, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
+Copyright (c) 2003-2017, [CKSource](http://cksource.com) Frederico Knabben. All rights reserved.
 
 Licensed under the terms of any of the following licenses at your choice:
 

+ 1 - 1
packages/ckeditor5-utils/gulpfile.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 3 - 2
packages/ckeditor5-utils/package.json

@@ -1,5 +1,5 @@
 {
-  "name": "ckeditor5-utils",
+  "name": "@ckeditor/ckeditor5-utils",
   "version": "0.6.0",
   "description": "CKEditor 5 Utils",
   "keywords": [
@@ -7,7 +7,8 @@
   ],
   "devDependencies": {
     "@ckeditor/ckeditor5-dev-lint": "^2.0.0",
-    "ckeditor5-core": "ckeditor/ckeditor5-core",
+    "@ckeditor/ckeditor5-core": "*",
+    "@ckeditor/ckeditor5-engine": "*",
     "del": "^2.2.0",
     "gulp": "^3.9.0",
     "guppy-pre-commit": "^0.4.0",

+ 1 - 1
packages/ckeditor5-utils/src/ckeditorerror.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/collection.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/comparearrays.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/config.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/count.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/diff.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/difftochanges.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/createelement.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 5 - 16
packages/ckeditor5-utils/src/dom/emittermixin.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -8,6 +8,7 @@
  */
 
 import EmitterMixin from '../emittermixin';
+import { _getEmitterListenedTo, _setEmitterId } from '../emittermixin';
 import uid from '../uid';
 import extend from '../lib/lodash/extend';
 import isNative from '../lib/lodash/isNative';
@@ -109,19 +110,7 @@ const DomEmitterMixin = extend( {}, EmitterMixin, {
 	 * @return {module:utils/dom/emittermixin~ProxyEmitter} ProxyEmitter instance or null.
 	 */
 	_getProxyEmitter( node ) {
-		let proxy, emitters, emitterInfo;
-
-		// Get node UID. It allows finding Proxy Emitter for this DOM Node.
-		const uid = getNodeUID( node );
-
-		// Find existing Proxy Emitter for this DOM Node among emitters.
-		if ( ( emitters = this._listeningTo ) ) {
-			if ( ( emitterInfo = emitters[ uid ] ) ) {
-				proxy = emitterInfo.emitter;
-			}
-		}
-
-		return proxy || null;
+		return _getEmitterListenedTo( this, getNodeUID( node ) );
 	}
 } );
 
@@ -142,7 +131,7 @@ export default DomEmitterMixin;
  *     |     emitter: ProxyEmitter, |                +------------------------+                      +------------v----------+
  *     |     callbacks: {           |                | events: {              |                      | Node (HTMLElement)    |
  *     |       click: [ callbacks ] |                |   click: [ callbacks ] |                      +-----------------------+
- *     |     }                      |                | },                     |                      | data-cke-expando: UID |
+ *     |     }                      |                | },                     |                      | data-ck-expando: UID  |
  *     |   }                        |                | _domNode: Node,        |                      +-----------------------+
  *     | }                          |                | _domListeners: {},     |                                   |
  *     | +------------------------+ |                | _emitterId: UID        |                                   |
@@ -164,7 +153,7 @@ class ProxyEmitter {
 	 */
 	constructor( node ) {
 		// Set emitter ID to match DOM Node "expando" property.
-		this._emitterId = getNodeUID( node );
+		_setEmitterId( this, getNodeUID( node ) );
 
 		// Remember the DOM Node this ProxyEmitter is bound to.
 		this._domNode = node;

+ 1 - 1
packages/ckeditor5-utils/src/dom/getancestors.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/getcommonancestor.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/getdatafromelement.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/getpositionedancestor.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/global.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/indexof.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/insertat.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/isrange.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/position.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/rect.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/remove.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/setdatainelement.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/dom/tounit.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/elementreplacer.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 57 - 8
packages/ckeditor5-utils/src/emittermixin.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -11,6 +11,9 @@ import EventInfo from './eventinfo';
 import uid from './uid';
 import priorities from './priorities';
 
+const _listeningTo = Symbol( 'listeningTo' );
+const _emitterId = Symbol( 'emitterId' );
+
 /**
  * Mixin that injects the events API into its host.
  *
@@ -150,14 +153,18 @@ const EmitterMixin = {
 		//     ...
 		// }
 
-		if ( !( emitters = this._listeningTo ) ) {
-			emitters = this._listeningTo = {};
+		if ( !this[ _listeningTo ] ) {
+			this[ _listeningTo ] = {};
 		}
 
-		if ( !( emitterId = emitter._emitterId ) ) {
-			emitterId = emitter._emitterId = uid();
+		emitters = this[ _listeningTo ];
+
+		if ( !_getEmitterId( emitter ) ) {
+			_setEmitterId( emitter );
 		}
 
+		emitterId = _getEmitterId( emitter );
+
 		if ( !( emitterInfo = emitters[ emitterId ] ) ) {
 			emitterInfo = emitters[ emitterId ] = {
 				emitter: emitter,
@@ -191,8 +198,8 @@ const EmitterMixin = {
 	 * `event`.
 	 */
 	stopListening( emitter, event, callback ) {
-		let emitters = this._listeningTo;
-		let emitterId = emitter && emitter._emitterId;
+		let emitters = this[ _listeningTo ];
+		let emitterId = emitter && _getEmitterId( emitter );
 		let emitterInfo = emitters && emitterId && emitters[ emitterId ];
 		let eventCallbacks = emitterInfo && event && emitterInfo.callbacks[ event ];
 
@@ -224,7 +231,7 @@ const EmitterMixin = {
 			for ( emitterId in emitters ) {
 				this.stopListening( emitters[ emitterId ].emitter );
 			}
-			delete this._listeningTo;
+			delete this[ _listeningTo ];
 		}
 	},
 
@@ -362,6 +369,48 @@ const EmitterMixin = {
 
 export default EmitterMixin;
 
+/**
+ * Checks if `listeningEmitter` listens to an emitter with given `listenedToEmitterId` and if so, returns that emitter.
+ * If not, returns `null`.
+ *
+ * @protected
+ * @param {module:utils/emittermixin~EmitterMixin} listeningEmitter Emitter that listens.
+ * @param {String} listenedToEmitterId Unique emitter id of emitter listened to.
+ * @returns {module:utils/emittermixin~EmitterMixin|null}
+ */
+export function _getEmitterListenedTo( listeningEmitter, listenedToEmitterId ) {
+	if ( listeningEmitter[ _listeningTo ] && listeningEmitter[ _listeningTo ][ listenedToEmitterId ] ) {
+		return listeningEmitter[ _listeningTo ][ listenedToEmitterId ].emitter;
+	}
+
+	return null;
+}
+
+/**
+ * Sets emitter's unique id.
+ *
+ * **Note:** `_emitterId` can be set only once.
+ *
+ * @protected
+ * @param {module:utils/emittermixin~EmitterMixin} emitter Emitter for which id will be set.
+ * @param {String} [id] Unique id to set. If not passed, random unique id will be set.
+ */
+export function _setEmitterId( emitter, id ) {
+	if ( !emitter[ _emitterId ] ) {
+		emitter[ _emitterId ] = id || uid();
+	}
+}
+
+/**
+ * Returns emitter's unique id.
+ *
+ * @protected
+ * @param {module:utils/emittermixin~EmitterMixin} emitter Emitter which id will be returned.
+ */
+export function _getEmitterId( emitter ) {
+	return emitter[ _emitterId ];
+}
+
 // Gets the internal `_events` property of the given object.
 // `_events` property store all lists with callbacks for registered event names.
 // If there were no events registered on the object, empty `_events` object is created.

+ 1 - 1
packages/ckeditor5-utils/src/env.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/eventinfo.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 12 - 12
packages/ckeditor5-utils/src/focustracker.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -38,6 +38,14 @@ export default class FocusTracker {
 		 */
 		this.set( 'isFocused', false );
 
+		/**
+		 * Currently focused element.
+		 *
+		 * @readonly
+		 * @member {HTMLElement}
+		 */
+		this.focusedElement = null;
+
 		/**
 		 * List of registered elements.
 		 *
@@ -53,14 +61,6 @@ export default class FocusTracker {
 		 * @member {Number}
 		 */
 		this._nextEventLoopTimeout = null;
-
-		/**
-		 * Currently focused element.
-		 *
-		 * @private
-		 * @member {HTMLElement}
-		 */
-		this._focusedElement = null;
 	}
 
 	/**
@@ -84,7 +84,7 @@ export default class FocusTracker {
 	 * @param {HTMLElement} element
 	 */
 	remove( element ) {
-		if ( element === this._focusedElement ) {
+		if ( element === this.focusedElement ) {
 			this._blur( element );
 		}
 
@@ -103,7 +103,7 @@ export default class FocusTracker {
 	_focus( element ) {
 		clearTimeout( this._nextEventLoopTimeout );
 
-		this._focusedElement = element;
+		this.focusedElement = element;
 		this.isFocused = true;
 	}
 
@@ -116,7 +116,7 @@ export default class FocusTracker {
 	 */
 	_blur() {
 		this._nextEventLoopTimeout = setTimeout( () => {
-			this._focusedElement = null;
+			this.focusedElement = null;
 			this.isFocused = false;
 		}, 0 );
 	}

+ 1 - 1
packages/ckeditor5-utils/src/isiterable.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 7 - 1
packages/ckeditor5-utils/src/keyboard.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -19,6 +19,7 @@ import env from './env';
  *
  * * `a-z`,
  * * `0-9`,
+ * * `f1-f12`,
  * * `arrow(left|up|right|bottom)`,
  * * `backspace`, `delete`, `enter`, `esc`, `tab`,
  * * `ctrl`, `cmd`, `shift`, `alt`.
@@ -140,6 +141,11 @@ function generateKnownKeyCodes() {
 		keyCodes[ code - 48 ] = code;
 	}
 
+	// F1-F12
+	for ( let code = 112; code <= 123; code++ ) {
+		keyCodes[ 'f' + ( code - 111 ) ] = code;
+	}
+
 	return keyCodes;
 }
 

+ 111 - 0
packages/ckeditor5-utils/src/keystrokehandler.js

@@ -0,0 +1,111 @@
+/**
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/**
+ * @module utils/keystrokehandler
+ */
+
+import DomEmitterMixin from './dom/emittermixin';
+import { getCode, parseKeystroke } from './keyboard';
+
+/**
+ * Keystroke handler registers keystrokes so the callbacks associated
+ * with these keystrokes will be executed if the matching `keydown` is fired
+ * by a defined emitter.
+ *
+ *		const handler = new KeystrokeHandler();
+ *
+ *		handler.listenTo( emitter );
+ *
+ *		handler.set( 'ctrl + a', ( keyEventData, cancel ) => {
+ *			console.log( 'ctrl + a has been pressed' );
+ *			cancel();
+ *		} );
+ */
+export default class KeystrokeHandler {
+	/**
+	 * Creates an instance of the keystroke handler.
+	 */
+	constructor() {
+		/**
+		 * Listener used to listen to events for easier keystroke handler destruction.
+		 *
+		 * @private
+		 * @member {module:utils/dom/emittermixin~Emitter}
+		 */
+		this._listener = Object.create( DomEmitterMixin );
+
+		/**
+		 * Map of the defined keystrokes. Keystroke codes are the keys.
+		 *
+		 * @private
+		 * @member {Map}
+		 */
+		this._keystrokes = new Map();
+	}
+
+	/**
+	 * Starts listening for `keydown` events from a given emitter.
+	 *
+	 * @param {module:utils/emittermixin~Emitter} emitter
+	 */
+	listenTo( emitter ) {
+		this._listener.listenTo( emitter, 'keydown', ( evt, data ) => {
+			this.press( data );
+		} );
+	}
+
+	/**
+	 * Registers a handler for the specified keystroke.
+	 *
+	 * @param {String|Array.<String|Number>} keystroke Keystroke defined in a format accepted by
+	 * the {@link module:utils/keyboard~parseKeystroke} function.
+	 * @param {Function} callback A function called with the
+	 * {@link module:engine/view/observer/keyobserver~KeyEventData key event data} object and
+	 * a helper to both `preventDefault` and `stopPropagation` of the event.
+	 */
+	set( keystroke, callback ) {
+		const keyCode = parseKeystroke( keystroke );
+		const callbacks = this._keystrokes.get( keyCode );
+
+		if ( callbacks ) {
+			callbacks.push( callback );
+		} else {
+			this._keystrokes.set( keyCode, [ callback ] );
+		}
+	}
+
+	/**
+	 * Triggers a keystroke handler for a specified key combination, if such a keystroke was {@link #set defined}.
+	 *
+	 * @param {module:engine/view/observer/keyobserver~KeyEventData} keyEventData Key event data.
+	 * @returns {Boolean} Whether the keystroke was handled.
+	 */
+	press( keyEventData ) {
+		const keyCode = getCode( keyEventData );
+		const callbacks = this._keystrokes.get( keyCode );
+
+		if ( !callbacks ) {
+			return false;
+		}
+
+		for ( let callback of callbacks ) {
+			callback( keyEventData, () => {
+				keyEventData.preventDefault();
+				keyEventData.stopPropagation();
+			} );
+		}
+
+		return true;
+	}
+
+	/**
+	 * Destroys the keystroke handler.
+	 */
+	destroy() {
+		this._keystrokes = new Map();
+		this._listener.stopListening();
+	}
+}

+ 1 - 1
packages/ckeditor5-utils/src/locale.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/log.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/mapsequal.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/mix.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/nth.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/objecttomap.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/observablemixin.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/priorities.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/spy.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/tomap.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/uid.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 1 - 1
packages/ckeditor5-utils/src/unicode.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 2 - 2
packages/ckeditor5-utils/tests/_utils-tests/normalizehtml.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import normalizeHtml from 'ckeditor5-utils/tests/_utils/normalizehtml';
+import normalizeHtml from '../../tests/_utils/normalizehtml';
 
 describe( 'utils', () => {
 	describe( 'normalizeHtml', () => {

+ 5 - 5
packages/ckeditor5-utils/tests/_utils-tests/utils.js

@@ -1,12 +1,12 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
-import utilsTestUtils from 'ckeditor5-utils/tests/_utils/utils';
-import ObesrvableMixin from 'ckeditor5-utils/src/observablemixin';
-import EmitterMixin from 'ckeditor5-utils/src/emittermixin';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
+import utilsTestUtils from '../../tests/_utils/utils';
+import ObesrvableMixin from '../../src/observablemixin';
+import EmitterMixin from '../../src/emittermixin';
 
 testUtils.createSinonSandbox();
 

+ 1 - 1
packages/ckeditor5-utils/tests/_utils/locale-mock.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 

+ 3 - 3
packages/ckeditor5-utils/tests/_utils/normalizehtml.js

@@ -1,10 +1,10 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import HtmlDataProcessor from 'ckeditor5-engine/src/dataprocessor/htmldataprocessor';
-import { stringify } from 'ckeditor5-engine/src/dev-utils/view';
+import HtmlDataProcessor from '@ckeditor/ckeditor5-engine/src/dataprocessor/htmldataprocessor';
+import { stringify } from '@ckeditor/ckeditor5-engine/src/dev-utils/view';
 
 /**
  * Parses given string of HTML and returns normalized HTML.

+ 2 - 2
packages/ckeditor5-utils/tests/_utils/utils.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global console:false */
 
-import EmitterMixin from 'ckeditor5-utils/src/emittermixin';
+import EmitterMixin from '../../src/emittermixin';
 
 const utils = {
 	/**

+ 2 - 2
packages/ckeditor5-utils/tests/ckeditorerror.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import CKEditorError from 'ckeditor5-utils/src/ckeditorerror';
+import CKEditorError from '../src/ckeditorerror';
 
 describe( 'CKEditorError', () => {
 	it( 'inherits from Error', () => {

+ 4 - 4
packages/ckeditor5-utils/tests/collection.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
-import Collection from 'ckeditor5-utils/src/collection';
-import CKEditorError from 'ckeditor5-utils/src/ckeditorerror';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
+import Collection from '../src/collection';
+import CKEditorError from '../src/ckeditorerror';
 
 testUtils.createSinonSandbox();
 

+ 2 - 2
packages/ckeditor5-utils/tests/comparearrays.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import compareArrays from 'ckeditor5-utils/src/comparearrays';
+import compareArrays from '../src/comparearrays';
 
 describe( 'utils', () => {
 	describe( 'compareArrays', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/config.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import Config from 'ckeditor5-utils/src/config';
+import Config from '../src/config';
 
 describe( 'Config', () => {
 	let config;

+ 2 - 2
packages/ckeditor5-utils/tests/count.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import count from 'ckeditor5-utils/src/count';
+import count from '../src/count';
 
 describe( 'utils', () => {
 	describe( 'count', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/diff.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import diff from 'ckeditor5-utils/src/diff';
+import diff from '../src/diff';
 
 describe( 'diff', () => {
 	it( 'should diff strings', () => {

+ 3 - 3
packages/ckeditor5-utils/tests/difftochanges.js

@@ -1,10 +1,10 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import diff from 'ckeditor5-utils/src/diff';
-import diffToChanges from 'ckeditor5-utils/src/difftochanges';
+import diff from '../src/diff';
+import diffToChanges from '../src/difftochanges';
 
 describe( 'diffToChanges', () => {
 	describe( 'equal patterns', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/dom/createelement.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import createElement from 'ckeditor5-utils/src/dom/createelement';
+import createElement from '../../src/dom/createelement';
 
 describe( 'createElement', () => {
 	it( 'should create element', () => {

+ 4 - 12
packages/ckeditor5-utils/tests/dom/emittermixin.js

@@ -1,13 +1,13 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document, window, Event, MouseEvent */
 
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
-import DomEmitterMixin from 'ckeditor5-utils/src/dom/emittermixin';
-import EmitterMixin from 'ckeditor5-utils/src/emittermixin';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
+import DomEmitterMixin from '../../src/dom/emittermixin';
+import EmitterMixin from '../../src/emittermixin';
 
 testUtils.createSinonSandbox();
 
@@ -184,8 +184,6 @@ describe( 'DomEmitterMixin', () => {
 			domEmitter.listenTo( node1, 'event1', spy1 );
 			domEmitter.listenTo( node2, 'event2', spy2 );
 
-			expect( domEmitter ).to.have.property( '_listeningTo' );
-
 			node1.dispatchEvent( new Event( 'event1' ) );
 			node2.dispatchEvent( new Event( 'event2' ) );
 
@@ -196,8 +194,6 @@ describe( 'DomEmitterMixin', () => {
 
 			sinon.assert.calledOnce( spy1 );
 			sinon.assert.calledOnce( spy2 );
-
-			expect( domEmitter ).to.not.have.property( '_listeningTo' );
 		} );
 
 		it( 'should stop listening to everything what left', () => {
@@ -214,8 +210,6 @@ describe( 'DomEmitterMixin', () => {
 			domEmitter.listenTo( node2, 'event1', spy3 );
 			domEmitter.listenTo( node2, 'event2', spy4 );
 
-			expect( domEmitter ).to.have.property( '_listeningTo' );
-
 			domEmitter.stopListening( node1, 'event1', spy1 );
 			domEmitter.stopListening( node2, 'event1' );
 
@@ -240,8 +234,6 @@ describe( 'DomEmitterMixin', () => {
 			sinon.assert.calledOnce( spy2 );
 			sinon.assert.notCalled( spy3 );
 			sinon.assert.calledOnce( spy4 );
-
-			expect( domEmitter ).to.not.have.property( '_listeningTo' );
 		} );
 
 		it( 'should not stop other nodes when a non-listened node is provided', () => {

+ 3 - 3
packages/ckeditor5-utils/tests/dom/getancestors.js

@@ -1,12 +1,12 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import getAncestors from 'ckeditor5-utils/src/dom/getancestors';
-import createElement from 'ckeditor5-utils/src/dom/createelement';
+import getAncestors from '../../src/dom/getancestors';
+import createElement from '../../src/dom/createelement';
 
 describe( 'getAncestors', () => {
 	it( 'should return all parents of given node and the node itself, starting from top-most parent', () => {

+ 3 - 3
packages/ckeditor5-utils/tests/dom/getcommonancestor.js

@@ -1,12 +1,12 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import getCommonAncestor from 'ckeditor5-utils/src/dom/getcommonancestor';
-import createElement from 'ckeditor5-utils/src/dom/createelement';
+import getCommonAncestor from '../../src/dom/getcommonancestor';
+import createElement from '../../src/dom/createelement';
 
 describe( 'getParents', () => {
 	let b, span1, span2, p1, p2, i, div;

+ 2 - 2
packages/ckeditor5-utils/tests/dom/getdatafromelement.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import getDataFromElement from 'ckeditor5-utils/src/dom/getdatafromelement';
+import getDataFromElement from '../../src/dom/getdatafromelement';
 
 describe( 'getDataFromElement', () => {
 	let divEl;

+ 2 - 2
packages/ckeditor5-utils/tests/dom/getpositionedancestor.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global document */
 
-import getPositionedAncestor from 'ckeditor5-utils/src/dom/getpositionedancestor';
+import getPositionedAncestor from '../../src/dom/getpositionedancestor';
 
 describe( 'getPositionedAncestor', () => {
 	let element;

+ 3 - 3
packages/ckeditor5-utils/tests/dom/global.js

@@ -1,12 +1,12 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global window, document */
 
-import global from 'ckeditor5-utils/src/dom/global';
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
+import global from '../../src/dom/global';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 testUtils.createSinonSandbox();
 

+ 2 - 2
packages/ckeditor5-utils/tests/dom/indexof.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import indexOf from 'ckeditor5-utils/src/dom/indexof';
+import indexOf from '../../src/dom/indexof';
 
 describe( 'indexOf', () => {
 	it( 'should return 0 if element has no parent', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/dom/insertat.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import insertAt from 'ckeditor5-utils/src/dom/insertat';
+import insertAt from '../../src/dom/insertat';
 
 describe( 'insertAt', () => {
 	it( 'should insert at given position', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/dom/isrange.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global Range */
 
-import isRange from 'ckeditor5-utils/src/dom/isrange';
+import isRange from '../../src/dom/isrange';
 
 describe( 'isRange()', () => {
 	it( 'detects native DOM Range', () => {

+ 4 - 4
packages/ckeditor5-utils/tests/dom/position.js

@@ -1,13 +1,13 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global document, window */
 
-import global from 'ckeditor5-utils/src/dom/global';
-import { getOptimalPosition } from 'ckeditor5-utils/src/dom/position';
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
+import global from '../../src/dom/global';
+import { getOptimalPosition } from '../../src/dom/position';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 testUtils.createSinonSandbox();
 

+ 4 - 4
packages/ckeditor5-utils/tests/dom/rect.js

@@ -1,13 +1,13 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global document */
 
-import global from 'ckeditor5-utils/src/dom/global';
-import Rect from 'ckeditor5-utils/src/dom/rect';
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
+import global from '../../src/dom/global';
+import Rect from '../../src/dom/rect';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 testUtils.createSinonSandbox();
 

+ 2 - 2
packages/ckeditor5-utils/tests/dom/remove.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import remove from 'ckeditor5-utils/src/dom/remove';
+import remove from '../../src/dom/remove';
 
 describe( 'remove', () => {
 	it( 'should remove element form parent', () => {

+ 3 - 3
packages/ckeditor5-utils/tests/dom/setdatainelement.js

@@ -1,12 +1,12 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import setDataInElement from 'ckeditor5-utils/src/dom/setdatainelement';
-import getDataFromElement from 'ckeditor5-utils/src/dom/getdatafromelement';
+import setDataInElement from '../../src/dom/setdatainelement';
+import getDataFromElement from '../../src/dom/getdatafromelement';
 
 describe( 'setDataInElement', () => {
 	[ 'textarea', 'template', 'div' ].forEach( ( elementName ) => {

+ 2 - 2
packages/ckeditor5-utils/tests/dom/tounit.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2015, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import toUnit from 'ckeditor5-utils/src/dom/tounit';
+import toUnit from '../../src/dom/tounit';
 
 describe( 'toUnit', () => {
 	it( 'should be a function', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/elementreplacer.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals document */
 
-import ElementReplacer from 'ckeditor5-utils/src/elementreplacer';
+import ElementReplacer from '../src/elementreplacer';
 
 describe( 'ElementReplacer', () => {
 	let replacer;

+ 54 - 24
packages/ckeditor5-utils/tests/emittermixin.js

@@ -1,15 +1,19 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import EmitterMixin from 'ckeditor5-utils/src/emittermixin';
-import EventInfo from 'ckeditor5-utils/src/eventinfo';
+import EmitterMixin from '../src/emittermixin';
+import { _getEmitterListenedTo, _getEmitterId, _setEmitterId } from '../src/emittermixin';
+import EventInfo from '../src/eventinfo';
 
 describe( 'EmitterMixin', () => {
 	let emitter, listener;
 
-	beforeEach( refreshEmitter );
+	beforeEach( () => {
+		emitter = getEmitterInstance();
+		listener = getEmitterInstance();
+	} );
 
 	describe( 'fire', () => {
 		it( 'should execute callbacks in the right order without priority', () => {
@@ -376,8 +380,6 @@ describe( 'EmitterMixin', () => {
 	} );
 
 	describe( 'listenTo', () => {
-		beforeEach( refreshListener );
-
 		it( 'should properly register callbacks', () => {
 			let spy = sinon.spy();
 
@@ -408,8 +410,6 @@ describe( 'EmitterMixin', () => {
 	} );
 
 	describe( 'stopListening', () => {
-		beforeEach( refreshListener );
-
 		it( 'should stop listening to given event callback', () => {
 			let spy1 = sinon.spy();
 			let spy2 = sinon.spy();
@@ -480,8 +480,6 @@ describe( 'EmitterMixin', () => {
 			listener.listenTo( emitter1, 'event1', spy1 );
 			listener.listenTo( emitter2, 'event2', spy2 );
 
-			expect( listener ).to.have.property( '_listeningTo' );
-
 			emitter1.fire( 'event1' );
 			emitter2.fire( 'event2' );
 
@@ -492,8 +490,6 @@ describe( 'EmitterMixin', () => {
 
 			sinon.assert.calledOnce( spy1 );
 			sinon.assert.calledOnce( spy2 );
-
-			expect( listener ).to.not.have.property( '_listeningTo' );
 		} );
 
 		it( 'should not stop other emitters when a non-listened emitter is provided', () => {
@@ -1094,18 +1090,6 @@ describe( 'EmitterMixin', () => {
 		} );
 	} );
 
-	function refreshEmitter() {
-		emitter = getEmitterInstance();
-	}
-
-	function refreshListener() {
-		listener = getEmitterInstance();
-	}
-
-	function getEmitterInstance() {
-		return Object.create( EmitterMixin );
-	}
-
 	function assertDelegated( evtArgs, { expectedName, expectedSource, expectedPath, expectedData } ) {
 		const evtInfo = evtArgs[ 0 ];
 
@@ -1115,3 +1099,49 @@ describe( 'EmitterMixin', () => {
 		expect( evtArgs.slice( 1 ) ).to.deep.equal( expectedData );
 	}
 } );
+
+describe( 'emitter id', () => {
+	let emitter;
+
+	beforeEach( () => {
+		emitter = getEmitterInstance();
+	} );
+
+	it( 'should be undefined before it is set', () => {
+		expect( _getEmitterId( emitter ) ).to.be.undefined;
+	} );
+
+	it( 'should be settable but only once', () => {
+		_setEmitterId( emitter, 'abc' );
+
+		expect( _getEmitterId( emitter ) ).to.equal( 'abc' );
+
+		_setEmitterId( emitter, 'xyz' );
+
+		expect( _getEmitterId( emitter ) ).to.equal( 'abc' );
+	} );
+} );
+
+describe( '_getEmitterListenedTo', () => {
+	let emitter, listener;
+
+	beforeEach( () => {
+		emitter = getEmitterInstance();
+		listener = getEmitterInstance();
+	} );
+
+	it( 'should return null if listener do not listen to emitter with given id', () => {
+		expect( _getEmitterListenedTo( listener, 'abc' ) ).to.be.null;
+	} );
+
+	it( 'should return emitter with given id', () => {
+		listener.listenTo( emitter, 'eventName', () => {} );
+		const emitterId = _getEmitterId( emitter );
+
+		expect( _getEmitterListenedTo( listener, emitterId ) ).to.equal( emitter );
+	} );
+} );
+
+function getEmitterInstance() {
+	return Object.create( EmitterMixin );
+}

+ 2 - 2
packages/ckeditor5-utils/tests/env.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import env, { isMac } from 'ckeditor5-utils/src/env';
+import env, { isMac } from '../src/env';
 
 describe( 'Env', () => {
 	beforeEach( () => {

+ 2 - 2
packages/ckeditor5-utils/tests/eventinfo.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import EventInfo from 'ckeditor5-utils/src/eventinfo';
+import EventInfo from '../src/eventinfo';
 
 describe( 'EventInfo', () => {
 	it( 'should be created properly', () => {

+ 4 - 4
packages/ckeditor5-utils/tests/focustracker.js

@@ -1,13 +1,13 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global document, Event */
 
-import FocusTracker from 'ckeditor5-utils/src/focustracker';
-import CKEditorError from 'ckeditor5-utils/src/ckeditorerror';
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
+import FocusTracker from '../src/focustracker';
+import CKEditorError from '../src/ckeditorerror';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
 
 testUtils.createSinonSandbox();
 

+ 2 - 2
packages/ckeditor5-utils/tests/isIterable.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import isIterable from 'ckeditor5-utils/src/isiterable';
+import isIterable from '../src/isiterable';
 
 describe( 'utils', () => {
 	describe( 'isIterable', () => {

+ 12 - 5
packages/ckeditor5-utils/tests/keyboard.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import env from 'ckeditor5-utils/src/env';
-import { keyCodes, getCode, parseKeystroke, getEnvKeystrokeText } from 'ckeditor5-utils/src/keyboard';
-import CKEditorError from 'ckeditor5-utils/src/ckeditorerror';
+import env from '../src/env';
+import { keyCodes, getCode, parseKeystroke, getEnvKeystrokeText } from '../src/keyboard';
+import CKEditorError from '../src/ckeditorerror';
 
 describe( 'Keyboard', () => {
 	describe( 'keyCodes', () => {
@@ -23,11 +23,14 @@ describe( 'Keyboard', () => {
 			expect( keyCodes.delete ).to.equal( 46 );
 			expect( keyCodes.ctrl ).to.equal( 0x110000 );
 			expect( keyCodes.cmd ).to.equal( 0x110000 );
+			expect( keyCodes.f1 ).to.equal( 112 );
+			expect( keyCodes.f12 ).to.equal( 123 );
 
 			expect( keyCodes ).to.include.keys(
 				'ctrl', 'cmd', 'shift', 'alt',
 				'arrowleft', 'arrowup', 'arrowright', 'arrowdown',
-				'backspace', 'delete', 'enter', 'esc', 'tab'
+				'backspace', 'delete', 'enter', 'esc', 'tab',
+				'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12'
 			);
 		} );
 	} );
@@ -41,6 +44,10 @@ describe( 'Keyboard', () => {
 			expect( getCode( 'a' ) ).to.equal( 65 );
 		} );
 
+		it( 'gets code of a function key', () => {
+			expect( getCode( 'f6' ) ).to.equal( 117 );
+		} );
+
 		it( 'is case insensitive', () => {
 			expect( getCode( 'A' ) ).to.equal( 65 );
 			expect( getCode( 'Ctrl' ) ).to.equal( 0x110000 );

+ 150 - 0
packages/ckeditor5-utils/tests/keystrokehandler.js

@@ -0,0 +1,150 @@
+/**
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+import EmitterMixin from '../src/emittermixin';
+import KeystrokeHandler from '../src/keystrokehandler';
+import { keyCodes } from '../src/keyboard';
+
+describe( 'KeystrokeHandler', () => {
+	let emitter, keystrokes;
+
+	beforeEach( () => {
+		emitter = Object.create( EmitterMixin );
+		keystrokes = new KeystrokeHandler();
+
+		keystrokes.listenTo( emitter );
+	} );
+
+	describe( 'listenTo()', () => {
+		it( 'activates the listening on the emitter', () => {
+			emitter = Object.create( EmitterMixin );
+			keystrokes = new KeystrokeHandler();
+
+			const spy = sinon.spy( keystrokes, 'press' );
+			const keyEvtData = { keyCode: 1 };
+
+			emitter.fire( 'keydown', keyEvtData );
+
+			expect( spy.notCalled ).to.be.true;
+
+			keystrokes.listenTo( emitter );
+			emitter.fire( 'keydown', keyEvtData );
+
+			sinon.assert.calledOnce( spy );
+			sinon.assert.calledWithExactly( spy, keyEvtData );
+		} );
+
+		it( 'triggers #press on #keydown', () => {
+			const spy = sinon.spy( keystrokes, 'press' );
+			const keyEvtData = { keyCode: 1 };
+
+			emitter.fire( 'keydown', keyEvtData );
+
+			sinon.assert.calledOnce( spy );
+			sinon.assert.calledWithExactly( spy, keyEvtData );
+		} );
+	} );
+
+	describe( 'press()', () => {
+		it( 'executes a callback', () => {
+			const spy = sinon.spy();
+			const keyEvtData = getCtrlA();
+
+			keystrokes.set( 'ctrl + A', spy );
+
+			const wasHandled = keystrokes.press( keyEvtData );
+
+			sinon.assert.calledOnce( spy );
+			sinon.assert.calledWithExactly( spy, keyEvtData, sinon.match.func );
+			expect( wasHandled ).to.be.true;
+		} );
+
+		it( 'provides a callback which both preventDefault and stopPropagation', ( done ) => {
+			const keyEvtData = getCtrlA();
+
+			Object.assign( keyEvtData, {
+				preventDefault: sinon.spy(),
+				stopPropagation: sinon.spy()
+			} );
+
+			keystrokes.set( 'ctrl + A', ( data, cancel ) => {
+				expect( data ).to.equal( keyEvtData );
+
+				sinon.assert.notCalled( keyEvtData.preventDefault );
+				sinon.assert.notCalled( keyEvtData.stopPropagation );
+
+				cancel();
+
+				sinon.assert.calledOnce( keyEvtData.preventDefault );
+				sinon.assert.calledOnce( keyEvtData.stopPropagation );
+
+				done();
+			} );
+
+			emitter.fire( 'keydown', keyEvtData );
+		} );
+
+		it( 'returns false when no handler', () => {
+			const keyEvtData = getCtrlA();
+
+			const wasHandled = keystrokes.press( keyEvtData );
+
+			expect( wasHandled ).to.be.false;
+		} );
+	} );
+
+	describe( 'set()', () => {
+		it( 'handles array format', () => {
+			const spy = sinon.spy();
+
+			keystrokes.set( [ 'ctrl', 'A' ], spy );
+
+			expect( keystrokes.press( getCtrlA() ) ).to.be.true;
+		} );
+
+		it( 'aggregates multiple callbacks for the same keystroke', () => {
+			const spy1 = sinon.spy();
+			const spy2 = sinon.spy();
+
+			keystrokes.set( [ 'ctrl', 'A' ], spy1 );
+			keystrokes.set( [ 'ctrl', 'A' ], spy2 );
+
+			keystrokes.press( getCtrlA() );
+
+			sinon.assert.calledOnce( spy1 );
+			sinon.assert.calledOnce( spy2 );
+		} );
+	} );
+
+	describe( 'destroy()', () => {
+		it( 'detaches #keydown listener', () => {
+			const spy = sinon.spy( keystrokes, 'press' );
+
+			keystrokes.destroy();
+
+			emitter.fire( 'keydown', { keyCode: 1 } );
+
+			sinon.assert.notCalled( spy );
+		} );
+
+		it( 'removes all keystrokes', () => {
+			const spy = sinon.spy();
+			const keystrokeHandler = keystrokes;
+
+			keystrokeHandler.set( 'ctrl + A', spy );
+
+			keystrokeHandler.destroy();
+
+			const wasHandled = keystrokeHandler.press( getCtrlA() );
+
+			expect( wasHandled ).to.be.false;
+			sinon.assert.notCalled( spy );
+		} );
+	} );
+} );
+
+function getCtrlA() {
+	return { keyCode: keyCodes.a, ctrlKey: true };
+}

+ 2 - 2
packages/ckeditor5-utils/tests/locale.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import Locale from 'ckeditor5-utils/src/locale';
+import Locale from '../src/locale';
 
 describe( 'Locale', () => {
 	let locale;

+ 2 - 2
packages/ckeditor5-utils/tests/lodash.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import extend from 'ckeditor5-utils/src/lib/lodash/extend';
+import extend from '../src/lib/lodash/extend';
 
 describe( 'utils', () => {
 	describe( 'extend()', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/log.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* globals console */
 
-import log from 'ckeditor5-utils/src/log';
+import log from '../src/log';
 
 describe( 'log', () => {
 	let spy;

+ 2 - 2
packages/ckeditor5-utils/tests/manual/focustracker.js

@@ -1,11 +1,11 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
 /* global document */
 
-import FocusTracker from 'ckeditor5-utils/src/focustracker';
+import FocusTracker from '../../src/focustracker';
 
 const focusTracker = new FocusTracker();
 const counters = document.querySelectorAll( '.status b' );

+ 2 - 2
packages/ckeditor5-utils/tests/mapsequal.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import mapsEqual from 'ckeditor5-utils/src/mapsequal';
+import mapsEqual from '../src/mapsequal';
 
 describe( 'utils', () => {
 	describe( 'mapsEqual', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/mix.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import mix from 'ckeditor5-utils/src/mix';
+import mix from '../src/mix';
 
 describe( 'utils', () => {
 	describe( 'mix', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/nth.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import nth from 'ckeditor5-utils/src/nth';
+import nth from '../src/nth';
 
 describe( 'utils', () => {
 	describe( 'nth', () => {

+ 8 - 8
packages/ckeditor5-utils/tests/observablemixin.js

@@ -1,15 +1,15 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import testUtils from 'ckeditor5-core/tests/_utils/utils';
-import utilsTestUtils from 'ckeditor5-utils/tests/_utils/utils';
-import ObservableMixin from 'ckeditor5-utils/src/observablemixin';
-import EmitterMixin from 'ckeditor5-utils/src/emittermixin';
-import EventInfo from 'ckeditor5-utils/src/eventinfo';
-import CKEditorError from 'ckeditor5-utils/src/ckeditorerror';
-import mix from 'ckeditor5-utils/src/mix';
+import testUtils from '@ckeditor/ckeditor5-core/tests/_utils/utils';
+import utilsTestUtils from '../tests/_utils/utils';
+import ObservableMixin from '../src/observablemixin';
+import EmitterMixin from '../src/emittermixin';
+import EventInfo from '../src/eventinfo';
+import CKEditorError from '../src/ckeditorerror';
+import mix from '../src/mix';
 
 const assertBinding = utilsTestUtils.assertBinding;
 

+ 2 - 2
packages/ckeditor5-utils/tests/priorities.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import priorities from 'ckeditor5-utils/src/priorities';
+import priorities from '../src/priorities';
 
 describe( 'get', () => {
 	it( 'should return correct value for string priority', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/spy.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import spy from 'ckeditor5-utils/src/spy';
+import spy from '../src/spy';
 
 describe( 'utils', () => {
 	describe( 'spy', () => {

+ 3 - 3
packages/ckeditor5-utils/tests/tomap.js

@@ -1,10 +1,10 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import toMap from 'ckeditor5-utils/src/tomap';
-import count from 'ckeditor5-utils/src/count';
+import toMap from '../src/tomap';
+import count from '../src/count';
 
 describe( 'utils', () => {
 	describe( 'toMap', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/uid.js

@@ -1,9 +1,9 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
-import uid from 'ckeditor5-utils/src/uid';
+import uid from '../src/uid';
 
 describe( 'utils', () => {
 	describe( 'uid', () => {

+ 2 - 2
packages/ckeditor5-utils/tests/unicode.js

@@ -1,5 +1,5 @@
 /**
- * @license Copyright (c) 2003-2016, CKSource - Frederico Knabben. All rights reserved.
+ * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
  * For licensing, see LICENSE.md.
  */
 
@@ -9,7 +9,7 @@ import {
 	isCombiningMark,
 	isInsideSurrogatePair,
 	isInsideCombinedSymbol
-} from 'ckeditor5-utils/src/unicode';
+} from '../src/unicode';
 
 describe( 'utils', () => {
 	describe( 'unicode', () => {