Index: extensions/browser/event_router.cc |
diff --git a/extensions/browser/event_router.cc b/extensions/browser/event_router.cc |
index 41bccc57ec1b03164965969ba0e680a24933377c..81c98d099917b2e37d7494a1a292be1ce8fa5ad0 100644 |
--- a/extensions/browser/event_router.cc |
+++ b/extensions/browser/event_router.cc |
@@ -77,10 +77,25 @@ void NotifyApiEventDispatched(void* browser_context_id, |
monitor->OnApiEventDispatched(extension_id, event_name, args.Pass()); |
} |
+// A global identifier used to distinguish extension events and is |
+// incremented every time an event is dispatched. |
+int g_extension_message_id = 0; |
+ |
} // namespace |
const char EventRouter::kRegisteredEvents[] = "events"; |
+EventRouter::DispatchDetails::DispatchDetails(const std::string& extension_id, |
+ const std::string& event_name, |
+ int message_id) |
+ : extension_id_(extension_id), |
+ event_name_(event_name), |
+ message_id_(message_id) { |
+} |
+ |
+EventRouter::DispatchDetails::~DispatchDetails() { |
+} |
+ |
struct EventRouter::ListenerProcess { |
content::RenderProcessHost* process; |
std::string extension_id; |
@@ -111,10 +126,12 @@ void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender, |
event_name, |
make_scoped_ptr(event_args->DeepCopy())); |
+ int message_id = g_extension_message_id++; |
ListValue args; |
args.Set(0, new base::StringValue(event_name)); |
args.Set(1, event_args); |
args.Set(2, info.AsValue().release()); |
+ args.Set(3, new base::FundamentalValue(message_id)); |
ipc_sender->Send(new ExtensionMsg_MessageInvoke( |
MSG_ROUTING_CONTROL, |
extension_id, |
@@ -123,6 +140,13 @@ void EventRouter::DispatchExtensionMessage(IPC::Sender* ipc_sender, |
args, |
user_gesture == USER_GESTURE_ENABLED)); |
+ DispatchDetails details(extension_id, event_name, message_id); |
+ content::NotificationService::current()->Notify( |
Ken Rockot(use gerrit already)
2015/01/08 01:24:02
This function runs on the IO thread, but Notificat
Ken Rockot(use gerrit already)
2015/01/08 01:25:58
I realize my pronoun may be ambiguous here. What I
|
+ NOTIFICATION_EXTENSION_MESSAGE_DISPATCHED, |
+ content::Source<content::BrowserContext>( |
+ static_cast<content::BrowserContext*>(browser_context_id)), |
+ content::Details<EventRouter::DispatchDetails>(&details)); |
+ |
// DispatchExtensionMessage does _not_ take ownership of event_args, so we |
// must ensure that the destruction of args does not attempt to free it. |
scoped_ptr<base::Value> removed_event_args; |