Home | History | Annotate | Download | only in sync
      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