signal-desktop/libtextsecure/event_target.js
lilia f7c4fd2fed DRY up event target implementations
Dedupe event target code and make it extensible.

// FREEBIE
2016-01-14 15:44:42 -08:00

79 lines
2.6 KiB
JavaScript

/*
* 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;
}());