• 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 #include "chrome/browser/extensions/extension_event_router_forwarder.h"
6 
7 #include "chrome/browser/browser_process.h"
8 #include "chrome/browser/extensions/extension_event_router.h"
9 #include "chrome/browser/profiles/profile_manager.h"
10 #include "googleurl/src/gurl.h"
11 
ExtensionEventRouterForwarder()12 ExtensionEventRouterForwarder::ExtensionEventRouterForwarder() {
13 }
14 
~ExtensionEventRouterForwarder()15 ExtensionEventRouterForwarder::~ExtensionEventRouterForwarder() {
16 }
17 
BroadcastEventToRenderers(const std::string & event_name,const std::string & event_args,const GURL & event_url)18 void ExtensionEventRouterForwarder::BroadcastEventToRenderers(
19     const std::string& event_name, const std::string& event_args,
20     const GURL& event_url) {
21   HandleEvent("", event_name, event_args, 0, true, event_url);
22 }
23 
DispatchEventToRenderers(const std::string & event_name,const std::string & event_args,ProfileId profile_id,bool use_profile_to_restrict_events,const GURL & event_url)24 void ExtensionEventRouterForwarder::DispatchEventToRenderers(
25     const std::string& event_name, const std::string& event_args,
26     ProfileId profile_id, bool use_profile_to_restrict_events,
27     const GURL& event_url) {
28   if (profile_id == Profile::kInvalidProfileId)
29     return;
30   HandleEvent("", event_name, event_args, profile_id,
31               use_profile_to_restrict_events, event_url);
32 }
33 
BroadcastEventToExtension(const std::string & extension_id,const std::string & event_name,const std::string & event_args,const GURL & event_url)34 void ExtensionEventRouterForwarder::BroadcastEventToExtension(
35     const std::string& extension_id,
36     const std::string& event_name, const std::string& event_args,
37     const GURL& event_url) {
38   HandleEvent(extension_id, event_name, event_args, 0, true, event_url);
39 }
40 
DispatchEventToExtension(const std::string & extension_id,const std::string & event_name,const std::string & event_args,ProfileId profile_id,bool use_profile_to_restrict_events,const GURL & event_url)41 void ExtensionEventRouterForwarder::DispatchEventToExtension(
42     const std::string& extension_id,
43     const std::string& event_name, const std::string& event_args,
44     ProfileId profile_id, bool use_profile_to_restrict_events,
45     const GURL& event_url) {
46   if (profile_id == Profile::kInvalidProfileId)
47     return;
48   HandleEvent(extension_id, event_name, event_args, profile_id,
49               use_profile_to_restrict_events, event_url);
50 }
51 
HandleEvent(const std::string & extension_id,const std::string & event_name,const std::string & event_args,ProfileId profile_id,bool use_profile_to_restrict_events,const GURL & event_url)52 void ExtensionEventRouterForwarder::HandleEvent(
53     const std::string& extension_id,
54     const std::string& event_name, const std::string& event_args,
55     ProfileId profile_id, bool use_profile_to_restrict_events,
56     const GURL& event_url) {
57   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
58     BrowserThread::PostTask(
59         BrowserThread::UI, FROM_HERE,
60         NewRunnableMethod(
61             this,
62             &ExtensionEventRouterForwarder::HandleEvent,
63             extension_id, event_name, event_args, profile_id,
64             use_profile_to_restrict_events, event_url));
65     return;
66   }
67 
68   if (!g_browser_process || !g_browser_process->profile_manager())
69     return;
70 
71   ProfileManager* profile_manager = g_browser_process->profile_manager();
72   Profile* profile = NULL;
73   if (profile_id != Profile::kInvalidProfileId) {
74     profile = profile_manager->GetProfileWithId(profile_id);
75     if (!profile)
76       return;
77   }
78   if (profile) {
79     CallExtensionEventRouter(
80         profile, extension_id, event_name, event_args,
81         use_profile_to_restrict_events ? profile : NULL, event_url);
82   } else {
83     std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
84     for (size_t i = 0; i < profiles.size(); ++i) {
85       CallExtensionEventRouter(
86           profiles[i], extension_id, event_name, event_args,
87           use_profile_to_restrict_events ? profiles[i] : NULL, event_url);
88     }
89   }
90 }
91 
CallExtensionEventRouter(Profile * profile,const std::string & extension_id,const std::string & event_name,const std::string & event_args,Profile * restrict_to_profile,const GURL & event_url)92 void ExtensionEventRouterForwarder::CallExtensionEventRouter(
93     Profile* profile, const std::string& extension_id,
94     const std::string& event_name, const std::string& event_args,
95     Profile* restrict_to_profile, const GURL& event_url) {
96 #if defined(OS_CHROMEOS)
97   // Extension does not exist for chromeos login.  This needs to be
98   // removed once we have an extension service for login screen.
99   // crosbug.com/12856.
100   if (!profile->GetExtensionEventRouter())
101     return;
102 #endif
103 
104   if (extension_id.empty()) {
105     profile->GetExtensionEventRouter()->
106         DispatchEventToRenderers(
107             event_name, event_args, restrict_to_profile, event_url);
108   } else {
109     profile->GetExtensionEventRouter()->
110         DispatchEventToExtension(
111             extension_id,
112             event_name, event_args, restrict_to_profile, event_url);
113   }
114 }
115