1// Copyright 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#ifndef SYNC_JS_SYNC_JS_CONTROLLER_H_
6#define SYNC_JS_SYNC_JS_CONTROLLER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/memory/weak_ptr.h"
14#include "base/observer_list.h"
15#include "sync/base/sync_export.h"
16#include "sync/internal_api/public/util/weak_handle.h"
17#include "sync/js/js_controller.h"
18#include "sync/js/js_event_handler.h"
19
20namespace syncer {
21
22class JsBackend;
23
24// A class that mediates between the sync JsEventHandlers and the sync
25// JsBackend.
26class SYNC_EXPORT SyncJsController
27    : public JsController, public JsEventHandler,
28      public base::SupportsWeakPtr<SyncJsController> {
29 public:
30  SyncJsController();
31
32  virtual ~SyncJsController();
33
34  // Sets the backend to route all messages to (if initialized).
35  // Sends any queued-up messages if |backend| is initialized.
36  void AttachJsBackend(const WeakHandle<JsBackend>& js_backend);
37
38  // JsController implementation.
39  virtual void AddJsEventHandler(JsEventHandler* event_handler) OVERRIDE;
40  virtual void RemoveJsEventHandler(JsEventHandler* event_handler) OVERRIDE;
41
42  // JsEventHandler implementation.
43  virtual void HandleJsEvent(const std::string& name,
44                             const JsEventDetails& details) OVERRIDE;
45
46 private:
47  // Sets |js_backend_|'s event handler depending on how many
48  // underlying event handlers we have.
49  void UpdateBackendEventHandler();
50
51  WeakHandle<JsBackend> js_backend_;
52  ObserverList<JsEventHandler> js_event_handlers_;
53
54  DISALLOW_COPY_AND_ASSIGN(SyncJsController);
55};
56
57}  // namespace syncer
58
59#endif  // SYNC_JS_SYNC_JS_CONTROLLER_H_
60