1dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Use of this source code is governed by a BSD-style license that can be
3dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// found in the LICENSE file.
4dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
5dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenvar chrome = chrome || {};
6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(akalin): Add mocking code for e.g. chrome.send() so that we
7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// can test this without rebuilding chrome.
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync = chrome.sync || {};
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen(function () {
10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// This Event class is a simplified version of the one from
12dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// event_bindings.js.
13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction Event() {
14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.listeners_ = [];
15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
17dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.addListener = function(listener) {
18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.listeners_.push(listener);
19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
21dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.removeListener = function(listener) {
22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var i = this.findListener_(listener);
23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  if (i == -1) {
24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    return;
25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.listeners_.splice(i, 1);
27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
29dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.hasListener = function(listener) {
30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return this.findListener_(listener) > -1;
31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
33dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.hasListeners = function(listener) {
34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return this.listeners_.length > 0;
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Returns the index of the given listener, or -1 if not found.
38dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.findListener_ = function(listener) {
39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (var i = 0; i < this.listeners_.length; i++) {
40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    if (this.listeners_[i] == listener) {
41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      return i;
42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  return -1;
45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Fires the event.  Called by the actual event callback.  Any
48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// exceptions thrown by a listener are caught and logged.
49dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenEvent.prototype.dispatch_ = function() {
50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var args = Array.prototype.slice.call(arguments);
51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  for (var i = 0; i < this.listeners_.length; i++) {
52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    try {
53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      this.listeners_[i].apply(null, args);
54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    } catch (e) {
55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      if (e instanceof Error) {
56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        // Non-standard, but useful.
57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        console.error(e.stack);
58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      } else {
59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen        console.error(e);
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen      }
61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    }
62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  }
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen};
64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Service events.
66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onSyncServiceStateChanged = new Event();
67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Notifier events.
69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onSyncNotificationStateChange = new Event();
70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onSyncIncomingNotification = new Event();
71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Manager events.
73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onChangesApplied = new Event();
74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onChangesComplete = new Event();
75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onSyncCycleCompleted = new Event();
76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onAuthError = new Event();
77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onUpdatedToken = new Event();
78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onPassphraseRequired = new Event();
79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onPassphraseAccepted = new Event();
80ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenchrome.sync.onEncryptionComplete = new Event();
81ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenchrome.sync.onMigrationNeededForTypes = new Event();
82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onInitializationComplete = new Event();
83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onPaused = new Event();
84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onResumed = new Event();
85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onStopSyncingPermanently = new Event();
86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onClearServerDataSucceeded = new Event();
87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.onClearServerDataFailed = new Event();
88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction AsyncFunction(name) {
90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.name_ = name;
91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.callbacks_ = [];
92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Calls the function, assuming the last argument is a callback to be
95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// called with the return value.
96dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAsyncFunction.prototype.call = function() {
97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var args = Array.prototype.slice.call(arguments);
98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  this.callbacks_.push(args.pop());
99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.send(this.name_, args);
100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
101dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
102dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Handle a reply, assuming that messages are processed in FIFO order.
103dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenAsyncFunction.prototype.handleReply = function() {
104dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var args = Array.prototype.slice.call(arguments);
105dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // Remove the callback before we call it since the callback may
106dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  // throw.
107dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  var callback = this.callbacks_.shift();
108dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  callback.apply(null, args);
109dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
111dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sync service functions.
112dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getAboutInfo_ = new AsyncFunction('getAboutInfo');
113dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getAboutInfo = function(callback) {
114dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getAboutInfo_.call(callback);
115dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
116dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
117dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Notification functions.
118dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getNotificationState_ =
119dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen    new AsyncFunction('getNotificationState');
120dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getNotificationState = function(callback) {
121dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getNotificationState_.call(callback);
122dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
123dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
124ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenchrome.sync.getNotificationInfo_ =
125ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen    new AsyncFunction('getNotificationInfo');
126ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenchrome.sync.getNotificationInfo = function(callback) {
127ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.sync.getNotificationInfo_.call(callback);
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
130dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Node lookup functions.
131dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getRootNode_ = new AsyncFunction('getRootNode');
132dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getRootNode = function(callback) {
133dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getRootNode_.call(callback);
134dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
135dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
136dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getNodeById_ = new AsyncFunction('getNodeById');
137dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenchrome.sync.getNodeById = function(id, callback) {
138dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getNodeById_.call(id, callback);
139dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
140dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
141dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen})();
142dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
143dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// TODO(akalin): Rewrite the C++ side to not need the handlers below.
144dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
145dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sync service event handlers.
146dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
147dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onSyncServiceStateChanged() {
148dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onSyncServiceStateChanged.dispatch_();
149dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Notification event handlers.
152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onSyncNotificationStateChange(notificationsEnabled) {
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onSyncNotificationStateChange.dispatch_(notificationsEnabled);
155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onSyncIncomingNotification(changedTypes) {
158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onSyncIncomingNotification.dispatch_(changedTypes);
159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Sync manager event handlers.
162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onChangesApplied(modelType, changes) {
164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onChangesApplied.dispatch_(modelType, changes);
165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onChangesComplete(modelType) {
168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onChangesComplete.dispatch_(modelType);
169dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
170dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
171dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onSyncCycleCompleted(snapshot) {
172dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onSyncCycleCompleted.dispatch_(snapshot);
173dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
174dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
175dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onAuthError(authError) {
176dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onAuthError.dispatch_(authError);
177dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
178dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
179dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onUpdatedToken(token) {
180dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onUpdatedToken.dispatch_(token);
181dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
182dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
183dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onPassphraseRequired(forDecryption) {
184dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onPassphraseRequired.dispatch_(forDecryption);
185dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
186dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
187dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onPassphraseAccepted(bootstrapToken) {
188dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onPassphraseAccepted.dispatch_(bootstrapToken);
189dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
190dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onEncryptionComplete(encrypted_types) {
192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.sync.onEncryptionComplete.dispatch_(encrypted_types);
193ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
195ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onMigrationNeededForTypes(model_types) {
196ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.sync.onMigrationNeededForTypes.dispatch_(model_types);
197ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
198ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
199dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onInitializationComplete() {
200dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onInitializationComplete.dispatch_();
201dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
202dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
203dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onPaused() {
204dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onPaused.dispatch_();
205dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
206dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
207dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onResumed() {
208dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onResumed.dispatch_();
209dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
210dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
211dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onStopSyncingPermanently() {
212dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onStopSyncingPermanently.dispatch_();
213dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
214dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
215dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onClearServerDataSucceeded() {
216dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onClearServerDataSucceeded();
217dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onClearServerDataFailed() {
220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.onClearServerDataFailed();
221dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
222dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
223dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// Function reply handlers.
224dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
225dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onGetAboutInfoFinished(aboutInfo) {
226dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getAboutInfo_.handleReply(aboutInfo);
227dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
228dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
229dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onGetNotificationStateFinished(notificationState) {
230dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getNotificationState_.handleReply(notificationState);
231dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
232dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
233dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onGetRootNodeFinished(rootNode) {
234dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getRootNode_.handleReply(rootNode);
235dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
236dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen
237dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenfunction onGetNodeByIdFinished(node) {
238dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen  chrome.sync.getNodeById_.handleReply(node);
239dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}
240ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
241ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenfunction onGetNotificationInfoFinished(notificationInfo) {
242ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  chrome.sync.getNotificationInfo_.handleReply(notificationInfo);
243ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen}
244