| Index: extensions/browser/event_router.cc
|
| diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc
|
| index e70d02b65a88c5d2cb1ee5cd19904d5958413246..c483f456eeb96228437b3cf6d1a7d16f9636c8c5 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,28 @@ 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 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,
|
| + 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, event_id, histogram_value,
|
| + event_name));
|
| }
|
|
|
| DispatchExtensionMessage(ipc_sender, browser_context_id, extension_id,
|
| @@ -500,9 +504,7 @@ void EventRouter::DispatchEventImpl(const std::string& restrict_to_extension_id,
|
| // background page, and as that event needs to be delivered before we dispatch
|
| // the event we are dispatching here, we dispatch to the lazy listeners here
|
| // first.
|
| - for (std::set<const EventListener*>::iterator it = listeners.begin();
|
| - it != listeners.end(); it++) {
|
| - const EventListener* listener = *it;
|
| + for (const EventListener* listener : listeners) {
|
| if (restrict_to_extension_id.empty() ||
|
| restrict_to_extension_id == listener->extension_id()) {
|
| if (listener->IsLazy()) {
|
| @@ -512,9 +514,7 @@ void EventRouter::DispatchEventImpl(const std::string& restrict_to_extension_id,
|
| }
|
| }
|
|
|
| - for (std::set<const EventListener*>::iterator it = listeners.begin();
|
| - it != listeners.end(); it++) {
|
| - const EventListener* listener = *it;
|
| + for (const EventListener* listener : listeners) {
|
| if (restrict_to_extension_id.empty() ||
|
| restrict_to_extension_id == listener->extension_id()) {
|
| if (listener->process()) {
|
| @@ -523,7 +523,8 @@ 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 /* did_enqueue */);
|
| }
|
| }
|
| }
|
| @@ -567,7 +568,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);
|
|
|
| @@ -637,6 +639,7 @@ void EventRouter::DispatchEventToProcess(
|
| event->user_gesture, event->filter_info);
|
|
|
| if (extension) {
|
| + ReportEvent(event->histogram_value, extension, did_enqueue);
|
| IncrementInFlightEvents(listener_context, extension, event_id,
|
| event->event_name);
|
| }
|
| @@ -693,25 +696,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,
|
| + 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, extension,
|
| + false /* did_enqueue */);
|
| }
|
|
|
| void EventRouter::IncrementInFlightEvents(BrowserContext* context,
|
| @@ -747,6 +752,35 @@ void EventRouter::OnEventAck(BrowserContext* context,
|
| pm->DecrementLazyKeepaliveCount(host->extension());
|
| }
|
|
|
| +void EventRouter::ReportEvent(events::HistogramValue histogram_value,
|
| + const Extension* extension,
|
| + bool did_enqueue) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| +
|
| + // TODO(kalman): UMA for dispatched event.
|
| + // TODO(kalman): UMA specifically for component extensions.
|
| +
|
| + // Note: for these, all we know is that the extension *has* a persistent or
|
| + // event page, not that the event is being dispatched *to* such a page.
|
| + //
|
| + // However, this is an academic distinction, since extensions with any
|
| + // background page have that background page running (or in the case of
|
| + // dormant event pages, must be started) regardless of where the event is
|
| + // being dispatched. Events are dispatched to a *process* not a *frame*.
|
| + if (BackgroundInfo::HasPersistentBackgroundPage(extension)) {
|
| + // TODO(kalman): UMA for dispatched event to an extension with a persistent
|
| + // background page.
|
| + } else if (BackgroundInfo::HasLazyBackgroundPage(extension)) {
|
| + if (did_enqueue) {
|
| + // TODO(kalman): UMA for dispatched event to an extension with an event
|
| + // page, and the event page was woken up to do so.
|
| + } else {
|
| + // TODO(kalman): UMA for dispatched event to an extension with an event
|
| + // page that was already running.
|
| + }
|
| + }
|
| +}
|
| +
|
| void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event,
|
| ExtensionHost* host) {
|
| if (!host)
|
| @@ -754,9 +788,9 @@ void EventRouter::DispatchPendingEvent(const linked_ptr<Event>& event,
|
|
|
| if (listeners_.HasProcessListener(host->render_process_host(),
|
| 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);
|
| + DispatchEventToProcess(host->extension()->id(), host->GetURL(),
|
| + host->render_process_host(), event, nullptr,
|
| + true /* did_enqueue */);
|
| }
|
| }
|
|
|
|
|