source: Dev/trunk/node_modules/mocha/lib/browser/events.js @ 484

Last change on this file since 484 was 484, checked in by hendrikvanantwerpen, 11 years ago

Commit node_modules, to make checkouts and builds more deterministic.

File size: 2.8 KB
Line 
1
2/**
3 * Module exports.
4 */
5
6exports.EventEmitter = EventEmitter;
7
8/**
9 * Check if `obj` is an array.
10 */
11
12function isArray(obj) {
13  return '[object Array]' == {}.toString.call(obj);
14}
15
16/**
17 * Event emitter constructor.
18 *
19 * @api public
20 */
21
22function EventEmitter(){};
23
24/**
25 * Adds a listener.
26 *
27 * @api public
28 */
29
30EventEmitter.prototype.on = function (name, fn) {
31  if (!this.$events) {
32    this.$events = {};
33  }
34
35  if (!this.$events[name]) {
36    this.$events[name] = fn;
37  } else if (isArray(this.$events[name])) {
38    this.$events[name].push(fn);
39  } else {
40    this.$events[name] = [this.$events[name], fn];
41  }
42
43  return this;
44};
45
46EventEmitter.prototype.addListener = EventEmitter.prototype.on;
47
48/**
49 * Adds a volatile listener.
50 *
51 * @api public
52 */
53
54EventEmitter.prototype.once = function (name, fn) {
55  var self = this;
56
57  function on () {
58    self.removeListener(name, on);
59    fn.apply(this, arguments);
60  };
61
62  on.listener = fn;
63  this.on(name, on);
64
65  return this;
66};
67
68/**
69 * Removes a listener.
70 *
71 * @api public
72 */
73
74EventEmitter.prototype.removeListener = function (name, fn) {
75  if (this.$events && this.$events[name]) {
76    var list = this.$events[name];
77
78    if (isArray(list)) {
79      var pos = -1;
80
81      for (var i = 0, l = list.length; i < l; i++) {
82        if (list[i] === fn || (list[i].listener && list[i].listener === fn)) {
83          pos = i;
84          break;
85        }
86      }
87
88      if (pos < 0) {
89        return this;
90      }
91
92      list.splice(pos, 1);
93
94      if (!list.length) {
95        delete this.$events[name];
96      }
97    } else if (list === fn || (list.listener && list.listener === fn)) {
98      delete this.$events[name];
99    }
100  }
101
102  return this;
103};
104
105/**
106 * Removes all listeners for an event.
107 *
108 * @api public
109 */
110
111EventEmitter.prototype.removeAllListeners = function (name) {
112  if (name === undefined) {
113    this.$events = {};
114    return this;
115  }
116
117  if (this.$events && this.$events[name]) {
118    this.$events[name] = null;
119  }
120
121  return this;
122};
123
124/**
125 * Gets all listeners for a certain event.
126 *
127 * @api public
128 */
129
130EventEmitter.prototype.listeners = function (name) {
131  if (!this.$events) {
132    this.$events = {};
133  }
134
135  if (!this.$events[name]) {
136    this.$events[name] = [];
137  }
138
139  if (!isArray(this.$events[name])) {
140    this.$events[name] = [this.$events[name]];
141  }
142
143  return this.$events[name];
144};
145
146/**
147 * Emits an event.
148 *
149 * @api public
150 */
151
152EventEmitter.prototype.emit = function (name) {
153  if (!this.$events) {
154    return false;
155  }
156
157  var handler = this.$events[name];
158
159  if (!handler) {
160    return false;
161  }
162
163  var args = [].slice.call(arguments, 1);
164
165  if ('function' == typeof handler) {
166    handler.apply(this, args);
167  } else if (isArray(handler)) {
168    var listeners = handler.slice();
169
170    for (var i = 0, l = listeners.length; i < l; i++) {
171      listeners[i].apply(this, args);
172    }
173  } else {
174    return false;
175  }
176
177  return true;
178};
Note: See TracBrowser for help on using the repository browser.