- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / browser / extensions / event_router_forwarder.cc
1 // Copyright (c) 2012 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/event_router_forwarder.h"
6
7 #include "base/bind.h"
8 #include "base/values.h"
9 #include "chrome/browser/browser_process.h"
10 #include "chrome/browser/extensions/event_router.h"
11 #include "chrome/browser/extensions/extension_system.h"
12 #include "chrome/browser/profiles/profile_manager.h"
13 #include "content/public/browser/browser_thread.h"
14 #include "url/gurl.h"
15
16 using content::BrowserThread;
17
18 namespace extensions {
19
20 EventRouterForwarder::EventRouterForwarder() {
21 }
22
23 EventRouterForwarder::~EventRouterForwarder() {
24 }
25
26 void EventRouterForwarder::BroadcastEventToRenderers(
27     const std::string& event_name,
28     scoped_ptr<base::ListValue> event_args,
29     const GURL& event_url) {
30   HandleEvent(std::string(), event_name, event_args.Pass(), 0, true, event_url);
31 }
32
33 void EventRouterForwarder::DispatchEventToRenderers(
34     const std::string& event_name,
35     scoped_ptr<base::ListValue> event_args,
36     void* profile,
37     bool use_profile_to_restrict_events,
38     const GURL& event_url) {
39   if (!profile)
40     return;
41   HandleEvent(std::string(),
42               event_name,
43               event_args.Pass(),
44               profile,
45               use_profile_to_restrict_events,
46               event_url);
47 }
48
49 void EventRouterForwarder::BroadcastEventToExtension(
50     const std::string& extension_id,
51     const std::string& event_name,
52     scoped_ptr<base::ListValue> event_args,
53     const GURL& event_url) {
54   HandleEvent(extension_id, event_name, event_args.Pass(), 0, true, event_url);
55 }
56
57 void EventRouterForwarder::DispatchEventToExtension(
58     const std::string& extension_id,
59     const std::string& event_name,
60     scoped_ptr<base::ListValue> event_args,
61     void* profile,
62     bool use_profile_to_restrict_events,
63     const GURL& event_url) {
64   if (!profile)
65     return;
66   HandleEvent(extension_id, event_name, event_args.Pass(), profile,
67               use_profile_to_restrict_events, event_url);
68 }
69
70 void EventRouterForwarder::HandleEvent(const std::string& extension_id,
71                                        const std::string& event_name,
72                                        scoped_ptr<base::ListValue> event_args,
73                                        void* profile_ptr,
74                                        bool use_profile_to_restrict_events,
75                                        const GURL& event_url) {
76   if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
77     BrowserThread::PostTask(
78         BrowserThread::UI, FROM_HERE,
79         base::Bind(&EventRouterForwarder::HandleEvent, this,
80                    extension_id, event_name, base::Passed(&event_args),
81                    profile_ptr, use_profile_to_restrict_events, event_url));
82     return;
83   }
84
85   if (!g_browser_process || !g_browser_process->profile_manager())
86     return;
87
88   ProfileManager* profile_manager = g_browser_process->profile_manager();
89   Profile* profile = NULL;
90   if (profile_ptr) {
91     profile = reinterpret_cast<Profile*>(profile_ptr);
92     if (!profile_manager->IsValidProfile(profile))
93       return;
94   }
95   if (profile) {
96     CallEventRouter(profile, extension_id, event_name, event_args.Pass(),
97                     use_profile_to_restrict_events ? profile : NULL, event_url);
98   } else {
99     std::vector<Profile*> profiles(profile_manager->GetLoadedProfiles());
100     for (size_t i = 0; i < profiles.size(); ++i) {
101       scoped_ptr<base::ListValue> per_profile_event_args(
102           event_args->DeepCopy());
103       CallEventRouter(
104           profiles[i], extension_id, event_name, per_profile_event_args.Pass(),
105           use_profile_to_restrict_events ? profiles[i] : NULL, event_url);
106     }
107   }
108 }
109
110 void EventRouterForwarder::CallEventRouter(
111     Profile* profile,
112     const std::string& extension_id,
113     const std::string& event_name,
114     scoped_ptr<base::ListValue> event_args,
115     Profile* restrict_to_profile,
116     const GURL& event_url) {
117   // We may not have an extension in cases like chromeos login
118   // (crosbug.com/12856), chrome_frame_net_tests.exe which reuses the chrome
119   // browser single process framework.
120   if (!extensions::ExtensionSystem::Get(profile)->event_router())
121     return;
122
123   scoped_ptr<Event> event(new Event(event_name, event_args.Pass()));
124   event->restrict_to_profile = restrict_to_profile;
125   event->event_url = event_url;
126   if (extension_id.empty()) {
127     ExtensionSystem::Get(profile)->event_router()->BroadcastEvent(event.Pass());
128   } else {
129     ExtensionSystem::Get(profile)->event_router()->
130         DispatchEventToExtension(extension_id, event.Pass());
131   }
132 }
133
134 }  // namespace extensions