• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 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 CHROME_BROWSER_SYNC_JS_EVENT_HANDLER_LIST_H_
6 #define CHROME_BROWSER_SYNC_JS_EVENT_HANDLER_LIST_H_
7 #pragma once
8 
9 #include <string>
10 #include <vector>
11 
12 #include "base/basictypes.h"
13 #include "base/observer_list.h"
14 #include "chrome/browser/sync/js_arg_list.h"
15 #include "chrome/browser/sync/js_event_router.h"
16 #include "chrome/browser/sync/js_frontend.h"
17 
18 namespace browser_sync {
19 
20 class JsBackend;
21 class JsEventHandler;
22 
23 // A beefed-up ObserverList<JsEventHandler> that transparently handles
24 // the communication between the handlers and a backend.
25 class JsEventHandlerList : public JsFrontend, public JsEventRouter {
26  public:
27   JsEventHandlerList();
28 
29   virtual ~JsEventHandlerList();
30 
31   // Sets the backend to route all messages to.  Should be called only
32   // if a backend has not already been set.
33   void SetBackend(JsBackend* backend);
34 
35   // Removes any existing backend.
36   void RemoveBackend();
37 
38   // JsFrontend implementation.  Routes messages to any attached
39   // backend; if there is none, queues up the message for processing
40   // when the next backend is attached.
41   virtual void AddHandler(JsEventHandler* handler);
42   virtual void RemoveHandler(JsEventHandler* handler);
43   virtual void ProcessMessage(
44       const std::string& name, const JsArgList& args,
45       const JsEventHandler* sender);
46 
47   // JsEventRouter implementation.  Routes the event to the
48   // appropriate handler(s).
49   virtual void RouteJsEvent(const std::string& name,
50                             const JsArgList& args,
51                             const JsEventHandler* target);
52 
53  private:
54   // A struct used to hold the arguments to ProcessMessage() for
55   // future invocation.
56   struct PendingMessage {
57     std::string name;
58     JsArgList args;
59     const JsEventHandler* sender;
60 
61     PendingMessage(const std::string& name, const JsArgList& args,
62                    const JsEventHandler* sender);
63   };
64 
65   typedef std::vector<PendingMessage> PendingMessageList;
66 
67   JsBackend* backend_;
68   ObserverList<JsEventHandler> handlers_;
69   PendingMessageList pending_messages_;
70 
71   DISALLOW_COPY_AND_ASSIGN(JsEventHandlerList);
72 };
73 
74 }  // namespace browser_sync
75 
76 #endif  // CHROME_BROWSER_SYNC_JS_EVENT_HANDLER_LIST_H_
77