1 // Copyright (c) 2013 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var internal = requireNative("internal");
6 var application = requireNative("application");
7 internal.setupInternalExtension(extension);
9 // A map of event names to the event object that is registered to that name.
10 var registeredEvents = {};
12 var Event = function(eventName) {
13 this.eventName = eventName;
17 Event.dispatchEvent = function(eventName, args) {
18 var evt = registeredEvents[eventName];
22 // Make a copy of the listeners in case the listener list is modified during
24 var listeners = evt.listeners.slice();
25 for (var i = 0; i < listeners.length; i++) {
27 listeners[i].apply(null, args);
29 console.error('Error in event handler for:' + eventName + ' :' + new Error().stack);
33 internal.postMessage('dispatchEventFinish', [eventName]);
37 Event.prototype.addListener = function(callback) {
38 if (this.listeners.length == 0) {
39 var eventName = this.eventName;
40 if (registeredEvents[eventName])
41 throw new Error('Event:' + eventName + ' is already registered.');
42 registeredEvents[eventName] = this;
43 var routing_id = application.getCurrentRoutingID();
44 internal.postMessage('registerEvent', [eventName, routing_id],
46 Event.dispatchEvent(eventName, args);
50 if (!this.hasListener(callback))
51 this.listeners.push(callback);
54 Event.prototype.removeListener = function(callback) {
55 var idx = this.listeners.indexOf(callback);
59 this.listeners.splice(idx, 1);
60 if (this.listeners.length == 0) {
61 if (!registeredEvents[this.eventName])
62 throw new Error('Event:' + this.eventName + ' is not registered.');
63 delete registeredEvents[this.eventName];
64 var routing_id = application.getCurrentRoutingID();
65 internal.postMessage('unregisterEvent', [this.eventName, routing_id]);
69 Event.prototype.hasListener = function(callback) {
70 return this.listeners.indexOf(callback) >= 0;
73 Event.prototype.hasListeners = function() {
74 return this.listeners.length > 0;
77 exports.Event = Event;