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