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 Monsen#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_FORWARDER_H_ 6dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#define CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_FORWARDER_H_ 7dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#pragma once 8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include <string> 10dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 11dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "base/basictypes.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 13dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "chrome/browser/profiles/profile.h" 14dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h" 15dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 16dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass GURL; 17dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 18dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// This class forwards events to ExtensionEventRouters. 19dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// The advantages of this class over direct usage of ExtensionEventRouters are: 20dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// - this class is thread-safe, you can call the functions from UI and IO 21dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// thread. 22dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// - the class can handle if a profile is deleted between the time of sending 23dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// the event from the IO thread to the UI thread. 24dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// - this class can be used in contexts that are not governed by a profile, e.g. 25dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// by system URLRequestContexts. In these cases the |restrict_to_profile| 26dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen// parameter remains NULL and events are broadcasted to all profiles. 27dc0f95d653279beabeb9817299e2902918ba123eKristian Monsenclass ExtensionEventRouterForwarder 28dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen : public base::RefCountedThreadSafe<ExtensionEventRouterForwarder> { 29dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen public: 30dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ExtensionEventRouterForwarder(); 31dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls 33dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // DispatchEventToRenderers(event_name, event_args, profile, event_url) 34dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // on all (original) profiles' ExtensionEventRouters. 35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // May be called on any thread. 36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void BroadcastEventToRenderers(const std::string& event_name, 37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 38dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 39dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // DispatchEventToExtension(extension_id, event_name, event_args, 42dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // profile, event_url) 43dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // on all (original) profiles' ExtensionEventRouters. 44dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // May be called on any thread. 45dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void BroadcastEventToExtension(const std::string& extension_id, 46dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_name, 47dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 48dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 49dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 50dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls 51dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // DispatchEventToRenderers(event_name, event_args, 52dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // use_profile_to_restrict_events ? profile : NULL, event_url) 53dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // on |profile|'s ExtensionEventRouter. May be called on any thread. 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void DispatchEventToRenderers(const std::string& event_name, 55dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 56dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ProfileId profile_id, 57dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool use_profile_to_restrict_events, 58dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 59dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls 61dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // DispatchEventToExtension(extension_id, event_name, event_args, 62dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // use_profile_to_restrict_events ? profile : NULL, event_url) 63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // on |profile|'s ExtensionEventRouter. May be called on any thread. 64dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void DispatchEventToExtension(const std::string& extension_id, 65dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_name, 66dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 67dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ProfileId profile_id, 68dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool use_profile_to_restrict_events, 69dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 70dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 71dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen protected: 72dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Protected for testing. 73dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual ~ExtensionEventRouterForwarder(); 74dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 75dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Calls DispatchEventToRenderers or DispatchEventToExtension (depending on 76dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // whether extension_id == "" or not) of |profile|'s ExtensionEventRouter. 77dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // |profile| may never be NULL. 78dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Virtual for testing. 79dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen virtual void CallExtensionEventRouter(Profile* profile, 80dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& extension_id, 81dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_name, 82dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 83dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen Profile* restrict_to_profile, 84dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 85dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 86dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen private: 87dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen friend class base::RefCountedThreadSafe<ExtensionEventRouterForwarder>; 88dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 89dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // Helper function for {Broadcast,Dispatch}EventTo{Extension,Renderers}. 90dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen void HandleEvent(const std::string& extension_id, 91dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_name, 92dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const std::string& event_args, 93dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ProfileId profile_id, 94dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen bool use_profile_to_restrict_events, 95dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen const GURL& event_url); 96dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 97dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen DISALLOW_COPY_AND_ASSIGN(ExtensionEventRouterForwarder); 98dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen}; 99dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 100dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_EVENT_ROUTER_FORWARDER_H_ 101