- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / resources / sync_internals / chrome_sync.js
1 // Copyright (c) 2012 The Chromium Authors. 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 chrome = chrome || {};
6
7 // TODO(akalin): Add mocking code for e.g. chrome.send() so that we
8 // can test this without rebuilding chrome.
9
10 /**
11  * Organize sync event listeners and asynchronous requests.
12  * This object is one of a kind; its constructor is not public.
13  * @type {Object}
14  */
15 chrome.sync = chrome.sync || {};
16 (function() {
17
18 // This Event class is a simplified version of the one from
19 // event_bindings.js.
20 function Event() {
21   this.listeners_ = [];
22 }
23
24 Event.prototype.addListener = function(listener) {
25   this.listeners_.push(listener);
26 };
27
28 Event.prototype.removeListener = function(listener) {
29   var i = this.findListener_(listener);
30   if (i == -1) {
31     return;
32   }
33   this.listeners_.splice(i, 1);
34 };
35
36 Event.prototype.hasListener = function(listener) {
37   return this.findListener_(listener) > -1;
38 };
39
40 Event.prototype.hasListeners = function(listener) {
41   return this.listeners_.length > 0;
42 };
43
44 // Returns the index of the given listener, or -1 if not found.
45 Event.prototype.findListener_ = function(listener) {
46   for (var i = 0; i < this.listeners_.length; i++) {
47     if (this.listeners_[i] == listener) {
48       return i;
49     }
50   }
51   return -1;
52 };
53
54 // Fires the event.  Called by the actual event callback.  Any
55 // exceptions thrown by a listener are caught and logged.
56 Event.prototype.fire = function() {
57   var args = Array.prototype.slice.call(arguments);
58   for (var i = 0; i < this.listeners_.length; i++) {
59     try {
60       this.listeners_[i].apply(null, args);
61     } catch (e) {
62       if (e instanceof Error) {
63         // Non-standard, but useful.
64         console.error(e.stack);
65       } else {
66         console.error(e);
67       }
68     }
69   }
70 };
71
72 chrome.sync.events = {
73   'service': [
74     'onServiceStateChanged'
75   ],
76
77   // See chrome/browser/sync/engine/syncapi.h for docs.
78   'notifier': [
79     'onNotificationStateChange',
80     'onIncomingNotification'
81   ],
82
83   'manager': [
84     'onChangesApplied',
85     'onChangesComplete',
86     'onSyncCycleCompleted',
87     'onConnectionStatusChange',
88     'onPassphraseRequired',
89     'onPassphraseAccepted',
90     'onInitializationComplete',
91     'onStopSyncingPermanently',
92     'onClearServerDataSucceeded',
93     'onClearServerDataFailed',
94     'onEncryptedTypesChanged',
95     'onEncryptionComplete',
96     'onActionableError',
97   ],
98
99   'transaction': [
100     'onTransactionWrite',
101   ]
102 };
103
104 for (var eventType in chrome.sync.events) {
105   var events = chrome.sync.events[eventType];
106   for (var i = 0; i < events.length; ++i) {
107     var event = events[i];
108     chrome.sync[event] = new Event();
109   }
110 }
111
112 function makeSyncFunction(name) {
113   var callbacks = [];
114
115   // Calls the function, assuming the last argument is a callback to be
116   // called with the return value.
117   var fn = function() {
118     var args = Array.prototype.slice.call(arguments);
119     callbacks.push(args.pop());
120     chrome.send(name, args);
121   };
122
123   // Handle a reply, assuming that messages are processed in FIFO order.
124   // Called by SyncInternalsUI::HandleJsReply().
125   fn.handleReply = function() {
126     var args = Array.prototype.slice.call(arguments);
127     // Remove the callback before we call it since the callback may
128     // throw.
129     var callback = callbacks.shift();
130     callback.apply(null, args);
131   };
132
133   return fn;
134 }
135
136 var syncFunctions = [
137   // Sync service functions.
138   'getAboutInfo',
139
140   // Notification functions.  See chrome/browser/sync/engine/syncapi.h
141   // for docs.
142   'getNotificationState',
143   'getNotificationInfo',
144
145   // Client server communication logging functions.
146   'getClientServerTraffic',
147
148   // Node lookup functions.  See chrome/browser/sync/engine/syncapi.h
149   // for docs.
150   'getRootNodeDetails',
151   'getNodeSummariesById',
152   'getNodeDetailsById',
153   'getChildNodeIds',
154   'getAllNodes',
155 ];
156
157 for (var i = 0; i < syncFunctions.length; ++i) {
158   var syncFunction = syncFunctions[i];
159   chrome.sync[syncFunction] = makeSyncFunction(syncFunction);
160 }
161
162 /**
163  * Returns an object which measures elapsed time.
164  */
165 chrome.sync.makeTimer = function() {
166   var start = new Date();
167
168   return {
169     /**
170      * @return {number} The number of seconds since the timer was
171      * created.
172      */
173     get elapsedSeconds() {
174       return ((new Date()).getTime() - start.getTime()) / 1000.0;
175     }
176   };
177 };
178
179 })();