// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_EXTENSIONS_EVENT_ROUTER_FORWARDER_H_ #define CHROME_BROWSER_EXTENSIONS_EVENT_ROUTER_FORWARDER_H_ #include <string> #include "base/basictypes.h" #include "base/memory/ref_counted.h" #include "base/values.h" #include "chrome/browser/profiles/profile.h" class GURL; namespace extensions { // This class forwards events to EventRouters. // The advantages of this class over direct usage of EventRouters are: // - this class is thread-safe, you can call the functions from UI and IO // thread. // - the class can handle if a profile is deleted between the time of sending // the event from the IO thread to the UI thread. // - this class can be used in contexts that are not governed by a profile, e.g. // by system URLRequestContexts. In these cases the |restrict_to_profile| // parameter remains NULL and events are broadcasted to all profiles. class EventRouterForwarder : public base::RefCountedThreadSafe<EventRouterForwarder> { public: EventRouterForwarder(); // Calls // DispatchEventToRenderers(event_name, event_args, profile, event_url) // on all (original) profiles' EventRouters. // May be called on any thread. void BroadcastEventToRenderers(const std::string& event_name, scoped_ptr<base::ListValue> event_args, const GURL& event_url); // Calls // DispatchEventToExtension(extension_id, event_name, event_args, // profile, event_url) // on all (original) profiles' EventRouters. // May be called on any thread. void BroadcastEventToExtension(const std::string& extension_id, const std::string& event_name, scoped_ptr<base::ListValue> event_args, const GURL& event_url); // Calls // DispatchEventToRenderers(event_name, event_args, // use_profile_to_restrict_events ? profile : NULL, event_url) // on |profile|'s EventRouter. May be called on any thread. void DispatchEventToRenderers(const std::string& event_name, scoped_ptr<base::ListValue> event_args, void* profile, bool use_profile_to_restrict_events, const GURL& event_url); // Calls // DispatchEventToExtension(extension_id, event_name, event_args, // use_profile_to_restrict_events ? profile : NULL, event_url) // on |profile|'s EventRouter. May be called on any thread. void DispatchEventToExtension(const std::string& extension_id, const std::string& event_name, scoped_ptr<base::ListValue> event_args, void* profile, bool use_profile_to_restrict_events, const GURL& event_url); protected: // Protected for testing. virtual ~EventRouterForwarder(); // Helper function for {Broadcast,Dispatch}EventTo{Extension,Renderers}. // Virtual for testing. virtual void HandleEvent(const std::string& extension_id, const std::string& event_name, scoped_ptr<base::ListValue> event_args, void* profile, bool use_profile_to_restrict_events, const GURL& event_url); // Calls DispatchEventToRenderers or DispatchEventToExtension (depending on // whether extension_id == "" or not) of |profile|'s EventRouter. // |profile| may never be NULL. // Virtual for testing. virtual void CallEventRouter(Profile* profile, const std::string& extension_id, const std::string& event_name, scoped_ptr<base::ListValue> event_args, Profile* restrict_to_profile, const GURL& event_url); private: friend class base::RefCountedThreadSafe<EventRouterForwarder>; DISALLOW_COPY_AND_ASSIGN(EventRouterForwarder); }; } // namespace extensions #endif // CHROME_BROWSER_EXTENSIONS_EVENT_ROUTER_FORWARDER_H_