소스 검색

Changed: Make EmitterMixin#_listeningTo and _emitterId private by using Symbols.

Szymon Cofalik 9 년 전
부모
커밋
5b4495e4e7

+ 2 - 14
packages/ckeditor5-utils/src/dom/emittermixin.js

@@ -109,19 +109,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 this._getEmitterListenedTo( getNodeUID( node ) ) || null;
 	}
 } );
 
@@ -142,7 +130,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        |                                   |

+ 58 - 6
packages/ckeditor5-utils/src/emittermixin.js

@@ -11,6 +11,12 @@ import EventInfo from './eventinfo';
 import uid from './uid';
 import priorities from './priorities';
 
+// Symbol for private `_listeningTo` property.
+const _listeningTo = Symbol();
+
+// Symbol for private `_emitterId` property.
+const _emitterId = Symbol();
+
 /**
  * Mixin that injects the events API into its host.
  *
@@ -150,14 +156,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 ( !emitter._emitterId ) {
+			emitter._emitterId = uid();
 		}
 
+		emitterId = emitter._emitterId;
+
 		if ( !( emitterInfo = emitters[ emitterId ] ) ) {
 			emitterInfo = emitters[ emitterId ] = {
 				emitter: emitter,
@@ -191,7 +201,7 @@ const EmitterMixin = {
 	 * `event`.
 	 */
 	stopListening( emitter, event, callback ) {
-		let emitters = this._listeningTo;
+		let emitters = this[ _listeningTo ];
 		let emitterId = emitter && emitter._emitterId;
 		let emitterInfo = emitters && emitterId && emitters[ emitterId ];
 		let eventCallbacks = emitterInfo && event && emitterInfo.callbacks[ event ];
@@ -224,7 +234,7 @@ const EmitterMixin = {
 			for ( emitterId in emitters ) {
 				this.stopListening( emitters[ emitterId ].emitter );
 			}
-			delete this._listeningTo;
+			delete this[ _listeningTo ];
 		}
 	},
 
@@ -357,6 +367,48 @@ const EmitterMixin = {
 				destinations.delete( emitter );
 			}
 		}
+	},
+
+	/**
+	 * Returns an `EmitterMixin` instance with given `id`, which this emitter is listening to. Returns `null` if
+	 * this emitter do not listen to any emitter identified by `id`.
+	 *
+	 * @protected
+	 * @param {String} id Unique emitter id.
+	 * @returns {EmitterMixin|null}
+	 */
+	_getEmitterListenedTo( id ) {
+		if ( this[ _listeningTo ] && this[ _listeningTo ][ id ] ) {
+			return this[ _listeningTo ][ id ].emitter;
+		}
+
+		return null;
+	},
+
+	/**
+	 * Emitter's unique id.
+	 *
+	 * **Note:** `_emitterId` can be set only once.
+	 *
+	 * @protected
+	 * @type {String}
+	 */
+	get _emitterId() {
+		return this[ _emitterId ];
+	},
+
+	/**
+	 * Emitter's unique id.
+	 *
+	 * **Note:** `_emitterId` can be set only once.
+	 *
+	 * @protected
+	 * @type {String}
+	 */
+	set _emitterId( id ) {
+		if ( !this[ _emitterId ] ) {
+			this[ _emitterId ] = id;
+		}
 	}
 };
 

+ 0 - 8
packages/ckeditor5-utils/tests/dom/emittermixin.js

@@ -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', () => {

+ 0 - 4
packages/ckeditor5-utils/tests/emittermixin.js

@@ -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', () => {