DRY up event target implementations
Dedupe event target code and make it extensible. // FREEBIEpull/749/head
							parent
							
								
									925c1bdb33
								
							
						
					
					
						commit
						f7c4fd2fed
					
				@ -0,0 +1,79 @@
 | 
			
		||||
/*
 | 
			
		||||
 * vim: ts=4:sw=4:expandtab
 | 
			
		||||
 *
 | 
			
		||||
 * Implements EventTarget
 | 
			
		||||
 * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
;(function () {
 | 
			
		||||
    'use strict';
 | 
			
		||||
    window.textsecure = window.textsecure || {};
 | 
			
		||||
 | 
			
		||||
    function EventTarget() {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    EventTarget.prototype = {
 | 
			
		||||
        constructor: EventTarget,
 | 
			
		||||
        dispatchEvent: function(ev) {
 | 
			
		||||
            if (!(ev instanceof Event)) {
 | 
			
		||||
                throw new Error('Expects an event');
 | 
			
		||||
            }
 | 
			
		||||
            if (this.listeners === null || typeof this.listeners !== 'object') {
 | 
			
		||||
                this.listeners = {};
 | 
			
		||||
            }
 | 
			
		||||
            var listeners = this.listeners[ev.type];
 | 
			
		||||
            if (typeof listeners === 'object') {
 | 
			
		||||
                for (var i=0; i < listeners.length; ++i) {
 | 
			
		||||
                    if (typeof listeners[i] === 'function') {
 | 
			
		||||
                        listeners[i].call(null, ev);
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        addEventListener: function(eventName, callback) {
 | 
			
		||||
            if (typeof eventName !== 'string') {
 | 
			
		||||
                throw new Error('First argument expects a string');
 | 
			
		||||
            }
 | 
			
		||||
            if (typeof callback !== 'function') {
 | 
			
		||||
                throw new Error('Second argument expects a function');
 | 
			
		||||
            }
 | 
			
		||||
            if (this.listeners === null || typeof this.listeners !== 'object') {
 | 
			
		||||
                this.listeners = {};
 | 
			
		||||
            }
 | 
			
		||||
            var listeners = this.listeners[eventName];
 | 
			
		||||
            if (typeof listeners !== 'object') {
 | 
			
		||||
                listeners = [];
 | 
			
		||||
            }
 | 
			
		||||
            listeners.push(callback);
 | 
			
		||||
            this.listeners[eventName] = listeners;
 | 
			
		||||
        },
 | 
			
		||||
        removeEventListener: function(eventName, callback) {
 | 
			
		||||
            if (typeof eventName !== 'string') {
 | 
			
		||||
                throw new Error('First argument expects a string');
 | 
			
		||||
            }
 | 
			
		||||
            if (typeof callback !== 'function') {
 | 
			
		||||
                throw new Error('Second argument expects a function');
 | 
			
		||||
            }
 | 
			
		||||
            if (this.listeners === null || typeof this.listeners !== 'object') {
 | 
			
		||||
                this.listeners = {};
 | 
			
		||||
            }
 | 
			
		||||
            var listeners = this.listeners[eventName];
 | 
			
		||||
            for (var i=0; i < listeners.length; ++ i) {
 | 
			
		||||
                if (listeners[i] === callback) {
 | 
			
		||||
                    listeners.splice(i, 1);
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            this.listeners[eventName] = listeners;
 | 
			
		||||
        },
 | 
			
		||||
        extend: function(obj) {
 | 
			
		||||
          for (var prop in obj) {
 | 
			
		||||
            this[prop] = obj[prop];
 | 
			
		||||
          }
 | 
			
		||||
          return this;
 | 
			
		||||
        }
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    textsecure.EventTarget = EventTarget;
 | 
			
		||||
}());
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue