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

Side by Side Diff: extensions/browser/event_router.h

Issue 1272373003: Add extension event histogram values for messaging, webRequest, and webview. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 4 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 #ifndef EXTENSIONS_BROWSER_EVENT_ROUTER_H_ 5 #ifndef EXTENSIONS_BROWSER_EVENT_ROUTER_H_
6 #define EXTENSIONS_BROWSER_EVENT_ROUTER_H_ 6 #define EXTENSIONS_BROWSER_EVENT_ROUTER_H_
7 7
8 #include <map> 8 #include <map>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/callback.h" 13 #include "base/callback.h"
14 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
15 #include "base/containers/hash_tables.h" 15 #include "base/containers/hash_tables.h"
16 #include "base/memory/linked_ptr.h" 16 #include "base/memory/linked_ptr.h"
17 #include "base/memory/ref_counted.h" 17 #include "base/memory/ref_counted.h"
18 #include "base/scoped_observer.h" 18 #include "base/scoped_observer.h"
19 #include "base/values.h" 19 #include "base/values.h"
20 #include "components/keyed_service/core/keyed_service.h" 20 #include "components/keyed_service/core/keyed_service.h"
21 #include "content/public/browser/notification_observer.h" 21 #include "content/public/browser/notification_observer.h"
22 #include "content/public/browser/notification_registrar.h" 22 #include "content/public/browser/notification_registrar.h"
23 #include "content/public/browser/render_process_host_observer.h" 23 #include "content/public/browser/render_process_host_observer.h"
24 #include "extensions/browser/event_listener_map.h" 24 #include "extensions/browser/event_listener_map.h"
25 #include "extensions/browser/extension_event_histogram_value.h" 25 #include "extensions/browser/extension_event_histogram_value.h"
26 #include "extensions/browser/extension_registry_observer.h" 26 #include "extensions/browser/extension_registry_observer.h"
27 #include "extensions/common/event_filtering_info.h" 27 #include "extensions/common/event_filtering_info.h"
28 #include "ipc/ipc_sender.h" 28 #include "ipc/ipc_sender.h"
29 #include "url/gurl.h"
29 30
30 class GURL; 31 class GURL;
31 class PrefService; 32 class PrefService;
32 33
33 namespace content { 34 namespace content {
34 class BrowserContext; 35 class BrowserContext;
35 class RenderProcessHost; 36 class RenderProcessHost;
36 } 37 }
37 38
38 namespace extensions { 39 namespace extensions {
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 79
79 // Gets the EventRouter for |browser_context|. 80 // Gets the EventRouter for |browser_context|.
80 static EventRouter* Get(content::BrowserContext* browser_context); 81 static EventRouter* Get(content::BrowserContext* browser_context);
81 82
82 // Converts event names like "foo.onBar/123" into "foo.onBar". Event names 83 // Converts event names like "foo.onBar/123" into "foo.onBar". Event names
83 // without a "/" are returned unchanged. 84 // without a "/" are returned unchanged.
84 static std::string GetBaseEventName(const std::string& full_event_name); 85 static std::string GetBaseEventName(const std::string& full_event_name);
85 86
86 // Sends an event via ipc_sender to the given extension. Can be called on any 87 // Sends an event via ipc_sender to the given extension. Can be called on any
87 // thread. 88 // thread.
88 static void DispatchEvent(IPC::Sender* ipc_sender, 89 //
89 void* browser_context_id, 90 // It is very rare to call this function directly. Instead use the instance
90 const std::string& extension_id, 91 // methods BroadcastEvent or DispatchEventToExtension.
91 const std::string& event_name, 92 static void DispatchEventToSender(IPC::Sender* ipc_sender,
92 scoped_ptr<base::ListValue> event_args, 93 void* browser_context_id,
93 UserGestureState user_gesture, 94 const GURL& url,
94 const EventFilteringInfo& info); 95 const std::string& extension_id,
96 events::HistogramValue histogram_value,
97 const std::string& event_name,
98 scoped_ptr<base::ListValue> event_args,
99 UserGestureState user_gesture,
100 const EventFilteringInfo& info);
95 101
96 // An EventRouter is shared between |browser_context| and its associated 102 // An EventRouter is shared between |browser_context| and its associated
97 // incognito context. |extension_prefs| may be NULL in tests. 103 // incognito context. |extension_prefs| may be NULL in tests.
98 EventRouter(content::BrowserContext* browser_context, 104 EventRouter(content::BrowserContext* browser_context,
99 ExtensionPrefs* extension_prefs); 105 ExtensionPrefs* extension_prefs);
100 ~EventRouter() override; 106 ~EventRouter() override;
101 107
102 // Add or remove an extension as an event listener for |event_name|. 108 // Add or remove an extension as an event listener for |event_name|.
103 // 109 //
104 // Note that multiple extensions can share a process due to process 110 // Note that multiple extensions can share a process due to process
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 // listener for it. NOTE: This should be used rarely, for dispatching events 184 // listener for it. NOTE: This should be used rarely, for dispatching events
179 // to extensions that haven't had a chance to add their own listeners yet, eg: 185 // to extensions that haven't had a chance to add their own listeners yet, eg:
180 // newly installed extensions. 186 // newly installed extensions.
181 void DispatchEventWithLazyListener(const std::string& extension_id, 187 void DispatchEventWithLazyListener(const std::string& extension_id,
182 scoped_ptr<Event> event); 188 scoped_ptr<Event> event);
183 189
184 // Record the Event Ack from the renderer. (One less event in-flight.) 190 // Record the Event Ack from the renderer. (One less event in-flight.)
185 void OnEventAck(content::BrowserContext* context, 191 void OnEventAck(content::BrowserContext* context,
186 const std::string& extension_id); 192 const std::string& extension_id);
187 193
194 // Reports UMA for an event dispatched with histogram value |histogram_value|.
195 // Must be called on the UI thread.
196 //
197 // The target of the event - extension background page, view, webui, etc -
198 // can be determined by the |process_id| and |url| tuple. If the URL is
Devlin 2015/08/05 21:34:09 What process id?
not at google - send to devlin 2015/08/07 20:55:03 Fixed.
199 // unknown, which may be the case for hand-written events (like messaging),
200 // it may be blank.
201 //
202 // |did_enqueue| should be true if the event was queued waiting for a process
203 // to start, like an event page.
204 void ReportEvent(events::HistogramValue histogram_value,
205 const GURL& url,
206 bool did_enqueue);
207
188 private: 208 private:
189 friend class EventRouterTest; 209 friend class EventRouterTest;
190 210
211 enum ExtensionPageType {
212 EXTENSION_PAGE_NONE,
213 EXTENSION_PAGE_VIEW,
214 EXTENSION_PAGE_PERSISTENT_BACKGROUND,
215 EXTENSION_PAGE_DORMANT_EVENT,
216 EXTENSION_PAGE_AWAKE_EVENT,
217 };
218
191 // The extension and process that contains the event listener for a given 219 // The extension and process that contains the event listener for a given
192 // event. 220 // event.
193 struct ListenerProcess; 221 struct ListenerProcess;
194 222
195 // A map between an event name and a set of extensions that are listening 223 // A map between an event name and a set of extensions that are listening
196 // to that event. 224 // to that event.
197 typedef std::map<std::string, std::set<ListenerProcess> > ListenerMap; 225 typedef std::map<std::string, std::set<ListenerProcess> > ListenerMap;
198 226
199 // An identifier for an event dispatch that is used to prevent double dispatch 227 // An identifier for an event dispatch that is used to prevent double dispatch
200 // due to race conditions between the direct and lazy dispatch paths. 228 // due to race conditions between the direct and lazy dispatch paths.
201 typedef std::pair<const content::BrowserContext*, std::string> 229 typedef std::pair<const content::BrowserContext*, std::string>
202 EventDispatchIdentifier; 230 EventDispatchIdentifier;
203 231
204 // TODO(gdk): Document this. 232 // TODO(gdk): Document this.
205 static void DispatchExtensionMessage( 233 static void DispatchExtensionMessage(
206 IPC::Sender* ipc_sender, 234 IPC::Sender* ipc_sender,
207 void* browser_context_id, 235 void* browser_context_id,
208 const std::string& extension_id, 236 const std::string& extension_id,
209 int event_id, 237 int event_id,
210 const std::string& event_name, 238 const std::string& event_name,
211 base::ListValue* event_args, 239 base::ListValue* event_args,
212 UserGestureState user_gesture, 240 UserGestureState user_gesture,
213 const extensions::EventFilteringInfo& info); 241 const extensions::EventFilteringInfo& info);
214 242
243 ExtensionPageType GetExtensionPageType(const Extension* extension,
244 const GURL& url,
245 bool did_enqueue);
246
215 void Observe(int type, 247 void Observe(int type,
216 const content::NotificationSource& source, 248 const content::NotificationSource& source,
217 const content::NotificationDetails& details) override; 249 const content::NotificationDetails& details) override;
218 // ExtensionRegistryObserver implementation. 250 // ExtensionRegistryObserver implementation.
219 void OnExtensionLoaded(content::BrowserContext* browser_context, 251 void OnExtensionLoaded(content::BrowserContext* browser_context,
220 const Extension* extension) override; 252 const Extension* extension) override;
221 void OnExtensionUnloaded(content::BrowserContext* browser_context, 253 void OnExtensionUnloaded(content::BrowserContext* browser_context,
222 const Extension* extension, 254 const Extension* extension,
223 UnloadedExtensionInfo::Reason reason) override; 255 UnloadedExtensionInfo::Reason reason) override;
224 256
225 // Returns true if the given listener map contains a event listeners for 257 // Returns true if the given listener map contains a event listeners for
226 // the given event. If |extension_id| is non-empty, we also check that that 258 // the given event. If |extension_id| is non-empty, we also check that that
227 // extension is one of the listeners. 259 // extension is one of the listeners.
228 bool HasEventListenerImpl(const ListenerMap& listeners, 260 bool HasEventListenerImpl(const ListenerMap& listeners,
229 const std::string& extension_id, 261 const std::string& extension_id,
230 const std::string& event_name); 262 const std::string& event_name);
231 263
232 // Shared by DispatchEvent*. If |restrict_to_extension_id| is empty, the 264 // Shared by all event dispatch methods. If |restrict_to_extension_id| is
233 // event is broadcast. 265 // empty, the event is broadcast. An event that just came off the pending
234 // An event that just came off the pending list may not be delayed again. 266 // list may not be delayed again.
235 void DispatchEventImpl(const std::string& restrict_to_extension_id, 267 void DispatchEventImpl(const std::string& restrict_to_extension_id,
236 const linked_ptr<Event>& event); 268 const linked_ptr<Event>& event);
237 269
238 // Ensures that all lazy background pages that are interested in the given 270 // Ensures that all lazy background pages that are interested in the given
239 // event are loaded, and queues the event if the page is not ready yet. 271 // event are loaded, and queues the event if the page is not ready yet.
240 // Inserts an EventDispatchIdentifier into |already_dispatched| for each lazy 272 // Inserts an EventDispatchIdentifier into |already_dispatched| for each lazy
241 // event dispatch that is queued. 273 // event dispatch that is queued.
242 void DispatchLazyEvent(const std::string& extension_id, 274 void DispatchLazyEvent(const std::string& extension_id,
243 const linked_ptr<Event>& event, 275 const linked_ptr<Event>& event,
244 std::set<EventDispatchIdentifier>* already_dispatched, 276 std::set<EventDispatchIdentifier>* already_dispatched,
245 const base::DictionaryValue* listener_filter); 277 const base::DictionaryValue* listener_filter);
246 278
247 // Dispatches the event to the specified extension or URL running in 279 // Dispatches the event to the specified extension or URL running in
248 // |process|. 280 // |process|.
249 void DispatchEventToProcess(const std::string& extension_id, 281 void DispatchEventToProcess(const std::string& extension_id,
250 const GURL& listener_url, 282 const GURL& listener_url,
251 content::RenderProcessHost* process, 283 content::RenderProcessHost* process,
252 const linked_ptr<Event>& event, 284 const linked_ptr<Event>& event,
253 const base::DictionaryValue* listener_filter); 285 const base::DictionaryValue* listener_filter,
286 bool did_enqueue);
254 287
255 // Returns false when the event is scoped to a context and the listening 288 // Returns false when the event is scoped to a context and the listening
256 // extension does not have access to events from that context. Also fills 289 // extension does not have access to events from that context. Also fills
257 // |event_args| with the proper arguments to send, which may differ if 290 // |event_args| with the proper arguments to send, which may differ if
258 // the event crosses the incognito boundary. 291 // the event crosses the incognito boundary.
259 bool CanDispatchEventToBrowserContext(content::BrowserContext* context, 292 bool CanDispatchEventToBrowserContext(content::BrowserContext* context,
260 const Extension* extension, 293 const Extension* extension,
261 const linked_ptr<Event>& event); 294 const linked_ptr<Event>& event);
262 295
263 // Possibly loads given extension's background page in preparation to 296 // Possibly loads given extension's background page in preparation to
(...skipping 21 matching lines...) Expand all
285 const std::string& extension_id); 318 const std::string& extension_id);
286 319
287 // Track the dispatched events that have not yet sent an ACK from the 320 // Track the dispatched events that have not yet sent an ACK from the
288 // renderer. 321 // renderer.
289 void IncrementInFlightEvents(content::BrowserContext* context, 322 void IncrementInFlightEvents(content::BrowserContext* context,
290 const Extension* extension, 323 const Extension* extension,
291 int event_id, 324 int event_id,
292 const std::string& event_name); 325 const std::string& event_name);
293 326
294 // static 327 // static
295 static void IncrementInFlightEventsOnUI(void* browser_context_id, 328 static void DoDispatchEventToSenderBookkeepingOnUI(
296 const std::string& extension_id, 329 void* browser_context_id,
297 int event_id, 330 const std::string& extension_id,
298 const std::string& event_name); 331 const GURL& url,
332 int event_id,
333 events::HistogramValue histogram_value,
334 const std::string& event_name);
299 335
300 void DispatchPendingEvent(const linked_ptr<Event>& event, 336 void DispatchPendingEvent(const linked_ptr<Event>& event,
301 ExtensionHost* host); 337 ExtensionHost* host);
302 338
303 // Implementation of EventListenerMap::Delegate. 339 // Implementation of EventListenerMap::Delegate.
304 void OnListenerAdded(const EventListener* listener) override; 340 void OnListenerAdded(const EventListener* listener) override;
305 void OnListenerRemoved(const EventListener* listener) override; 341 void OnListenerRemoved(const EventListener* listener) override;
306 342
307 // RenderProcessHostObserver implementation. 343 // RenderProcessHostObserver implementation.
308 void RenderProcessExited(content::RenderProcessHost* host, 344 void RenderProcessExited(content::RenderProcessHost* host,
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
411 const std::string event_name; 447 const std::string event_name;
412 448
413 const std::string extension_id; 449 const std::string extension_id;
414 const GURL listener_url; 450 const GURL listener_url;
415 content::BrowserContext* browser_context; 451 content::BrowserContext* browser_context;
416 }; 452 };
417 453
418 } // namespace extensions 454 } // namespace extensions
419 455
420 #endif // EXTENSIONS_BROWSER_EVENT_ROUTER_H_ 456 #endif // EXTENSIONS_BROWSER_EVENT_ROUTER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698