Upstream version 7.35.138.0
[platform/framework/web/crosswalk.git] / src / xwalk / application / extension / application_event_api.js
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.
4
5 var internal = requireNative("internal");
6 var application = requireNative("application");
7 internal.setupInternalExtension(extension);
8
9 // A map of event names to the event object that is registered to that name.
10 var registeredEvents = {};
11
12 var Event = function(eventName) {
13   this.eventName = eventName;
14   this.listeners = [];
15 };
16
17 Event.dispatchEvent = function(eventName, args) {
18   var evt = registeredEvents[eventName];
19   if (!evt)
20     return;
21
22   // Make a copy of the listeners in case the listener list is modified during
23   // the iteration.
24   var listeners = evt.listeners.slice();
25   for (var i = 0; i < listeners.length; i++) {
26     try {
27       listeners[i].apply(null, args);
28     } catch (e) {
29       console.error('Error in event handler for:' + eventName + ' :' + new Error().stack);
30     }
31   }
32
33   internal.postMessage('dispatchEventFinish', [eventName]);
34   return;
35 };
36
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],
45         function(args){
46           Event.dispatchEvent(eventName, args);
47         });
48   }
49
50   if (!this.hasListener(callback))
51     this.listeners.push(callback);
52 };
53
54 Event.prototype.removeListener = function(callback) {
55   var idx = this.listeners.indexOf(callback);
56   if (idx < 0)
57     return;
58
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]);
66   }
67 };
68
69 Event.prototype.hasListener = function(callback) {
70   return this.listeners.indexOf(callback) >= 0;
71 };
72
73 Event.prototype.hasListeners = function() {
74   return this.listeners.length > 0;
75 };
76
77 exports.Event = Event;