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