Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(368)

Side by Side Diff: chrome/browser/extensions/event_router.cc

Issue 11946028: Record event activity to the extension activity log. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rename ActivityLog::IsLoggingEnabled Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/event_router.h" 5 #include "chrome/browser/extensions/event_router.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/command_line.h" 10 #include "base/command_line.h"
11 #include "base/message_loop.h" 11 #include "base/message_loop.h"
12 #include "base/stl_util.h" 12 #include "base/stl_util.h"
13 #include "base/values.h" 13 #include "base/values.h"
14 #include "base/version.h" 14 #include "base/version.h"
15 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/browser_process.h"
16 #include "chrome/browser/extensions/activity_log.h"
16 #include "chrome/browser/extensions/api/runtime/runtime_api.h" 17 #include "chrome/browser/extensions/api/runtime/runtime_api.h"
17 #include "chrome/browser/extensions/api/web_request/web_request_api.h" 18 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
18 #include "chrome/browser/extensions/event_names.h" 19 #include "chrome/browser/extensions/event_names.h"
19 #include "chrome/browser/extensions/extension_host.h" 20 #include "chrome/browser/extensions/extension_host.h"
20 #include "chrome/browser/extensions/extension_prefs.h" 21 #include "chrome/browser/extensions/extension_prefs.h"
21 #include "chrome/browser/extensions/extension_process_manager.h" 22 #include "chrome/browser/extensions/extension_process_manager.h"
22 #include "chrome/browser/extensions/extension_service.h" 23 #include "chrome/browser/extensions/extension_service.h"
23 #include "chrome/browser/extensions/extension_system.h" 24 #include "chrome/browser/extensions/extension_system.h"
24 #include "chrome/browser/extensions/lazy_background_task_queue.h" 25 #include "chrome/browser/extensions/lazy_background_task_queue.h"
25 #include "chrome/browser/extensions/process_map.h" 26 #include "chrome/browser/extensions/process_map.h"
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 bool operator<(const ListenerProcess& that) const { 80 bool operator<(const ListenerProcess& that) const {
80 if (process < that.process) 81 if (process < that.process)
81 return true; 82 return true;
82 if (process == that.process && extension_id < that.extension_id) 83 if (process == that.process && extension_id < that.extension_id)
83 return true; 84 return true;
84 return false; 85 return false;
85 } 86 }
86 }; 87 };
87 88
88 // static 89 // static
90 void EventRouter::LogExtensionEventMessage(void* profile_id,
91 const std::string& extension_id,
92 const std::string& event_name,
93 scoped_ptr<ListValue> event_args) {
94 if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) {
95 BrowserThread::PostTask(BrowserThread::UI,
96 FROM_HERE,
97 base::Bind(&LogExtensionEventMessage,
98 profile_id,
99 extension_id,
100 event_name,
101 Passed(event_args.Pass())));
102 } else {
103 Profile* profile = reinterpret_cast<Profile*>(profile_id);
104 if (!g_browser_process->profile_manager()->IsValidProfile(profile))
105 return;
106
107 // An ExtensionService might not be running during unit tests, or an
108 // extension might have been unloaded by the time we get to logging it. In
109 // those cases log a warning.
110 ExtensionService* extension_service =
111 ExtensionSystem::Get(profile)->extension_service();
112 if (!extension_service) {
113 LOG(WARNING) << "ExtensionService does not seem to be available "
114 << "(this may be normal for unit tests)";
115 } else {
116 const Extension* extension =
117 extension_service->extensions()->GetByID(extension_id);
118 if (!extension) {
119 LOG(WARNING) << "Extension " << extension_id << " not found!";
120 } else {
121 extensions::ActivityLog::GetInstance(profile)->LogEventAction(
122 extension, event_name, event_args.get(), "");
123 }
124 }
125 }
126 }
127
128 // static
89 void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender, 129 void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender,
130 void* profile_id,
90 const std::string& extension_id, 131 const std::string& extension_id,
91 const std::string& event_name, 132 const std::string& event_name,
92 ListValue* event_args, 133 ListValue* event_args,
93 const GURL& event_url, 134 const GURL& event_url,
94 UserGestureState user_gesture, 135 UserGestureState user_gesture,
95 const EventFilteringInfo& info) { 136 const EventFilteringInfo& info) {
137 if (ActivityLog::IsLogEnabled()) {
138 LogExtensionEventMessage(profile_id, extension_id, event_name,
139 scoped_ptr<ListValue>(event_args->DeepCopy()));
140 }
141
96 ListValue args; 142 ListValue args;
97 args.Set(0, Value::CreateStringValue(event_name)); 143 args.Set(0, Value::CreateStringValue(event_name));
98 args.Set(1, event_args); 144 args.Set(1, event_args);
99 args.Set(2, info.AsValue().release()); 145 args.Set(2, info.AsValue().release());
100 ipc_sender->Send(new ExtensionMsg_MessageInvoke(MSG_ROUTING_CONTROL, 146 ipc_sender->Send(new ExtensionMsg_MessageInvoke(MSG_ROUTING_CONTROL,
101 extension_id, kDispatchEvent, args, event_url, 147 extension_id, kDispatchEvent, args, event_url,
102 user_gesture == USER_GESTURE_ENABLED)); 148 user_gesture == USER_GESTURE_ENABLED));
103 149
104 // DispatchExtensionMessage does _not_ take ownership of event_args, so we 150 // DispatchExtensionMessage does _not_ take ownership of event_args, so we
105 // must ensure that the destruction of args does not attempt to free it. 151 // must ensure that the destruction of args does not attempt to free it.
106 Value* removed_event_args = NULL; 152 Value* removed_event_args = NULL;
107 args.Remove(1, &removed_event_args); 153 args.Remove(1, &removed_event_args);
108 } 154 }
109 155
110 // static 156 // static
111 void EventRouter::DispatchEvent(IPC::Sender* ipc_sender, 157 void EventRouter::DispatchEvent(IPC::Sender* ipc_sender,
158 void* profile_id,
112 const std::string& extension_id, 159 const std::string& extension_id,
113 const std::string& event_name, 160 const std::string& event_name,
114 scoped_ptr<ListValue> event_args, 161 scoped_ptr<ListValue> event_args,
115 const GURL& event_url, 162 const GURL& event_url,
116 UserGestureState user_gesture, 163 UserGestureState user_gesture,
117 const EventFilteringInfo& info) { 164 const EventFilteringInfo& info) {
118 DispatchExtensionMessage(ipc_sender, extension_id, event_name, 165 DispatchExtensionMessage(ipc_sender, profile_id, extension_id, event_name,
119 event_args.get(), event_url, user_gesture, info); 166 event_args.get(), event_url, user_gesture, info);
120 } 167 }
121 168
122 EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs) 169 EventRouter::EventRouter(Profile* profile, ExtensionPrefs* extension_prefs)
123 : profile_(profile), 170 : profile_(profile),
124 listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), 171 listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)),
172 activity_log_(ActivityLog::GetInstance(profile)),
125 dispatch_chrome_updated_event_(false) { 173 dispatch_chrome_updated_event_(false) {
126 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, 174 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED,
127 content::NotificationService::AllSources()); 175 content::NotificationService::AllSources());
128 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, 176 registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED,
129 content::NotificationService::AllSources()); 177 content::NotificationService::AllSources());
130 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, 178 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY,
131 content::Source<Profile>(profile_)); 179 content::Source<Profile>(profile_));
132 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_ENABLED, 180 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_ENABLED,
133 content::Source<Profile>(profile_)); 181 content::Source<Profile>(profile_));
134 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, 182 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED,
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 231
184 void EventRouter::OnListenerAdded(const EventListener* listener) { 232 void EventRouter::OnListenerAdded(const EventListener* listener) {
185 const std::string& event_name = listener->event_name; 233 const std::string& event_name = listener->event_name;
186 const EventListenerInfo details(event_name, listener->extension_id); 234 const EventListenerInfo details(event_name, listener->extension_id);
187 ObserverMap::iterator observer = observers_.find(event_name); 235 ObserverMap::iterator observer = observers_.find(event_name);
188 if (observer != observers_.end()) 236 if (observer != observers_.end())
189 observer->second->OnListenerAdded(details); 237 observer->second->OnListenerAdded(details);
190 238
191 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 239 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
192 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name); 240 SystemInfoEventRouter::GetInstance()->AddEventListener(event_name);
241
242 const Extension* extension = extensions::ExtensionSystem::Get(profile_)->
243 extension_service()->GetExtensionById(listener->extension_id,
244 ExtensionService::INCLUDE_ENABLED);
245 if (extension) {
246 scoped_ptr<ListValue> args(new ListValue());
247 if (listener->filter)
248 args->Append(listener->filter->DeepCopy());
249 activity_log_->LogAPIAction(extension,
250 event_name + ".addListener",
251 args.get(),
252 "");
253 }
193 } 254 }
194 255
195 void EventRouter::OnListenerRemoved(const EventListener* listener) { 256 void EventRouter::OnListenerRemoved(const EventListener* listener) {
196 const std::string& event_name = listener->event_name; 257 const std::string& event_name = listener->event_name;
197 const EventListenerInfo details(event_name, listener->extension_id); 258 const EventListenerInfo details(event_name, listener->extension_id);
198 ObserverMap::iterator observer = observers_.find(event_name); 259 ObserverMap::iterator observer = observers_.find(event_name);
199 if (observer != observers_.end()) 260 if (observer != observers_.end())
200 observer->second->OnListenerRemoved(details); 261 observer->second->OnListenerRemoved(details);
201 262
202 BrowserThread::PostTask( 263 BrowserThread::PostTask(
203 BrowserThread::IO, FROM_HERE, 264 BrowserThread::IO, FROM_HERE,
204 base::Bind(&NotifyEventListenerRemovedOnIOThread, 265 base::Bind(&NotifyEventListenerRemovedOnIOThread,
205 profile_, listener->extension_id, event_name)); 266 profile_, listener->extension_id, event_name));
206 267
207 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name)) 268 if (SystemInfoEventRouter::IsSystemInfoEvent(event_name))
208 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name); 269 SystemInfoEventRouter::GetInstance()->RemoveEventListener(event_name);
270
271 const Extension* extension = extensions::ExtensionSystem::Get(profile_)->
272 extension_service()->GetExtensionById(listener->extension_id,
273 ExtensionService::INCLUDE_ENABLED);
274 if (extension) {
275 scoped_ptr<ListValue> args(new ListValue());
276 activity_log_->LogAPIAction(extension,
277 event_name + ".removeListener",
278 args.get(),
279 "");
280 }
209 } 281 }
210 282
211 void EventRouter::AddLazyEventListener(const std::string& event_name, 283 void EventRouter::AddLazyEventListener(const std::string& event_name,
212 const std::string& extension_id) { 284 const std::string& extension_id) {
213 scoped_ptr<EventListener> listener(new EventListener( 285 scoped_ptr<EventListener> listener(new EventListener(
214 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); 286 event_name, extension_id, NULL, scoped_ptr<DictionaryValue>()));
215 bool is_new = listeners_.AddListener(listener.Pass()); 287 bool is_new = listeners_.AddListener(listener.Pass());
216 288
217 if (is_new) { 289 if (is_new) {
218 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)-> 290 ExtensionPrefs* prefs = extensions::ExtensionSystem::Get(profile_)->
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
419 } 491 }
420 492
421 if (!CanDispatchEventToProfile(listener_profile, extension, event)) 493 if (!CanDispatchEventToProfile(listener_profile, extension, event))
422 return; 494 return;
423 495
424 if (!event->will_dispatch_callback.is_null()) { 496 if (!event->will_dispatch_callback.is_null()) {
425 event->will_dispatch_callback.Run(listener_profile, extension, 497 event->will_dispatch_callback.Run(listener_profile, extension,
426 event->event_args.get()); 498 event->event_args.get());
427 } 499 }
428 500
429 DispatchExtensionMessage(process, extension_id, 501 DispatchExtensionMessage(process, listener_profile, extension_id,
430 event->event_name, event->event_args.get(), 502 event->event_name, event->event_args.get(),
431 event->event_url, event->user_gesture, 503 event->event_url, event->user_gesture,
432 event->filter_info); 504 event->filter_info);
433 IncrementInFlightEvents(listener_profile, extension); 505 IncrementInFlightEvents(listener_profile, extension);
434 } 506 }
435 507
436 bool EventRouter::CanDispatchEventToProfile(Profile* profile, 508 bool EventRouter::CanDispatchEventToProfile(Profile* profile,
437 const Extension* extension, 509 const Extension* extension,
438 const linked_ptr<Event>& event) { 510 const linked_ptr<Event>& event) {
439 // Is this event from a different profile than the renderer (ie, an 511 // Is this event from a different profile than the renderer (ie, an
(...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 copy->will_dispatch_callback = will_dispatch_callback; 720 copy->will_dispatch_callback = will_dispatch_callback;
649 return copy; 721 return copy;
650 } 722 }
651 723
652 EventListenerInfo::EventListenerInfo(const std::string& event_name, 724 EventListenerInfo::EventListenerInfo(const std::string& event_name,
653 const std::string& extension_id) 725 const std::string& extension_id)
654 : event_name(event_name), 726 : event_name(event_name),
655 extension_id(extension_id) {} 727 extension_id(extension_id) {}
656 728
657 } // namespace extensions 729 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/browser/extensions/event_router.h ('k') | chrome/browser/resources/extensions/extension_activity.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698