Index: extensions/browser/event_router.cc |
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc |
index e70d02b65a88c5d2cb1ee5cd19904d5958413246..d5019a6e955b3bc3742c2fda861f9ae53163c479 100644 |
--- a/extensions/browser/event_router.cc |
+++ b/extensions/browser/event_router.cc |
@@ -26,6 +26,7 @@ |
#include "extensions/browser/notification_types.h" |
#include "extensions/browser/process_manager.h" |
#include "extensions/browser/process_map.h" |
+#include "extensions/common/constants.h" |
#include "extensions/common/extension.h" |
#include "extensions/common/extension_api.h" |
#include "extensions/common/extension_messages.h" |
@@ -147,25 +148,29 @@ std::string EventRouter::GetBaseEventName(const std::string& full_event_name) { |
} |
// static |
-void EventRouter::DispatchEvent(IPC::Sender* ipc_sender, |
- void* browser_context_id, |
- const std::string& extension_id, |
- const std::string& event_name, |
- scoped_ptr<ListValue> event_args, |
- UserGestureState user_gesture, |
- const EventFilteringInfo& info) { |
+void EventRouter::DispatchEventToSender(IPC::Sender* ipc_sender, |
+ void* browser_context_id, |
+ const GURL& url, |
+ const std::string& extension_id, |
+ events::HistogramValue histogram_value, |
+ const std::string& event_name, |
+ scoped_ptr<ListValue> event_args, |
+ UserGestureState user_gesture, |
+ const EventFilteringInfo& info) { |
int event_id = g_extension_event_id.GetNext(); |
- if (!BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ if (BrowserThread::CurrentlyOn(BrowserThread::UI)) { |
+ DoDispatchEventToSenderBookkeepingOnUI(browser_context_id, extension_id, |
+ url, event_id, histogram_value, |
+ event_name); |
+ } else { |
// This is called from WebRequest API. |
// TODO(lazyboy): Skip this entirely: http://crbug.com/488747. |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
- base::Bind(&EventRouter::IncrementInFlightEventsOnUI, |
- browser_context_id, extension_id, event_id, event_name)); |
- } else { |
- IncrementInFlightEventsOnUI(browser_context_id, extension_id, event_id, |
- event_name); |
+ base::Bind(&EventRouter::DoDispatchEventToSenderBookkeepingOnUI, |
+ browser_context_id, extension_id, url, event_id, |
+ histogram_value, event_name)); |
} |
DispatchExtensionMessage(ipc_sender, browser_context_id, extension_id, |
@@ -523,7 +528,7 @@ void EventRouter::DispatchEventImpl(const std::string& restrict_to_extension_id, |
if (!ContainsKey(already_dispatched, dispatch_id)) { |
DispatchEventToProcess(listener->extension_id(), |
listener->listener_url(), listener->process(), |
- event, listener->filter()); |
+ event, listener->filter(), false); |
Devlin
2015/08/05 21:34:09
there are a few more of the anonymous bools than I
not at google - send to devlin
2015/08/07 20:55:03
Sure.
|
} |
} |
} |
@@ -567,7 +572,8 @@ void EventRouter::DispatchEventToProcess( |
const GURL& listener_url, |
content::RenderProcessHost* process, |
const linked_ptr<Event>& event, |
- const base::DictionaryValue* listener_filter) { |
+ const base::DictionaryValue* listener_filter, |
+ bool did_enqueue) { |
BrowserContext* listener_context = process->GetBrowserContext(); |
ProcessMap* process_map = ProcessMap::Get(listener_context); |
@@ -635,6 +641,7 @@ void EventRouter::DispatchEventToProcess( |
DispatchExtensionMessage(process, listener_context, extension_id, event_id, |
event->event_name, event->event_args.get(), |
event->user_gesture, event->filter_info); |
+ ReportEvent(event->histogram_value, listener_url, did_enqueue); |
if (extension) { |
IncrementInFlightEvents(listener_context, extension, event_id, |
@@ -693,25 +700,27 @@ bool EventRouter::MaybeLoadLazyBackgroundPageToDispatchEvent( |
} |
// static |
-void EventRouter::IncrementInFlightEventsOnUI(void* browser_context_id, |
- const std::string& extension_id, |
- int event_id, |
- const std::string& event_name) { |
+void EventRouter::DoDispatchEventToSenderBookkeepingOnUI( |
+ void* browser_context_id, |
+ const std::string& extension_id, |
+ const GURL& url, |
+ int event_id, |
+ events::HistogramValue histogram_value, |
+ const std::string& event_name) { |
DCHECK_CURRENTLY_ON(BrowserThread::UI); |
BrowserContext* browser_context = |
reinterpret_cast<BrowserContext*>(browser_context_id); |
if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) |
return; |
- EventRouter* event_router = EventRouter::Get(browser_context); |
- if (!event_router) |
- return; |
const Extension* extension = |
ExtensionRegistry::Get(browser_context)->enabled_extensions().GetByID( |
extension_id); |
if (!extension) |
return; |
+ EventRouter* event_router = EventRouter::Get(browser_context); |
event_router->IncrementInFlightEvents(browser_context, extension, event_id, |
event_name); |
+ event_router->ReportEvent(histogram_value, url, false); |
} |
void EventRouter::IncrementInFlightEvents(BrowserContext* context, |
@@ -747,6 +756,60 @@ void EventRouter::OnEventAck(BrowserContext* context, |
pm->DecrementLazyKeepaliveCount(host->extension()); |
} |
+void EventRouter::ReportEvent(events::HistogramValue histogram_value, |
+ const GURL& url, |
+ bool did_enqueue) { |
+ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); |
+ |
+ // At this point, we're only interested in reporting events for extensions. |
+ if (!url.SchemeIs(kExtensionScheme)) |
Devlin
2015/08/05 21:34:09
Doesn't this mean we won't log any events for mess
not at google - send to devlin
2015/08/07 20:55:03
The URL was the target URL which assuming messagin
|
+ return; |
+ |
+ ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context_); |
+ const Extension* extension = |
+ registry->enabled_extensions().GetExtensionOrAppByURL(url); |
+ if (!extension) { |
+ NOTREACHED() << "Reporting event for non-existent extension at " << url; |
Devlin
2015/08/05 21:34:09
Doing a NOTREACHED(); return; is typically a disco
not at google - send to devlin
2015/08/07 20:55:03
Deliberate choice - I don't trust call sites, espe
|
+ return; |
+ } |
+ |
+ // TODO(kalman): UMA for dispatched event. |
+ // TODO(kalman): UMA specifically for component extensions. |
not at google - send to devlin
2015/08/05 20:23:43
I will add the UMA_HISTOGRAM_ENUMERATION calls in
|
+ |
+ switch (GetExtensionPageType(extension, url, did_enqueue)) { |
+ case EXTENSION_PAGE_NONE: |
+ break; |
+ case EXTENSION_PAGE_VIEW: |
+ // TODO(kalman): UMA for dispatched event to view. |
+ break; |
+ case EXTENSION_PAGE_PERSISTENT_BACKGROUND: |
+ // TODO(kalman): UMA for dispatched event to persistent background page. |
+ break; |
+ case EXTENSION_PAGE_DORMANT_EVENT: |
+ // TODO(kalman): UMA for dispatched event that woke up event page. |
+ break; |
+ case EXTENSION_PAGE_AWAKE_EVENT: |
+ // TODO(kalman): UMA for dispatched event to awake up event page. |
+ break; |
+ } |
+} |
+ |
+EventRouter::ExtensionPageType EventRouter::GetExtensionPageType( |
+ const Extension* extension, |
+ const GURL& url, |
+ bool did_enqueue) { |
+ if (!extension) |
Devlin
2015/08/05 21:34:09
When could this happen?
not at google - send to devlin
2015/08/07 20:55:03
In a previous version of the patch, I guess - and
|
+ return EXTENSION_PAGE_NONE; |
+ if (url == BackgroundInfo::GetBackgroundURL(extension)) { |
+ if (BackgroundInfo::HasPersistentBackgroundPage(extension)) |
+ return EXTENSION_PAGE_PERSISTENT_BACKGROUND; |
+ if (BackgroundInfo::HasLazyBackgroundPage(extension)) |
+ return did_enqueue ? EXTENSION_PAGE_DORMANT_EVENT |
+ : EXTENSION_PAGE_AWAKE_EVENT; |
+ } |
+ return EXTENSION_PAGE_VIEW; |
+} |
+ |
void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event, |
ExtensionHost* host) { |
if (!host) |
@@ -756,7 +819,7 @@ void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event, |
host->extension()->id())) { |
// URL events cannot be lazy therefore can't be pending, hence the GURL(). |
DispatchEventToProcess(host->extension()->id(), GURL(), |
- host->render_process_host(), event, nullptr); |
+ host->render_process_host(), event, nullptr, true); |
} |
} |