Index: chrome/browser/extensions/extension_event_router.cc |
diff --git a/chrome/browser/extensions/extension_event_router.cc b/chrome/browser/extensions/extension_event_router.cc |
index 166d378cd4616b818b467d1d3ded193afe272029..ae763ec9011fa7cff6d80c14574f0af73b8ecb6d 100644 |
--- a/chrome/browser/extensions/extension_event_router.cc |
+++ b/chrome/browser/extensions/extension_event_router.cc |
@@ -65,88 +65,46 @@ struct ExtensionEventRouter::ListenerProcess { |
} |
}; |
-struct ExtensionEventRouter::ExtensionEvent { |
- std::string event_name; |
- scoped_ptr<Value> event_args; |
- GURL event_url; |
- Profile* restrict_to_profile; |
- scoped_ptr<Value> cross_incognito_args; |
- UserGestureState user_gesture; |
- |
- ExtensionEvent(const std::string& event_name, |
- const Value& event_args, |
- const GURL& event_url, |
- Profile* restrict_to_profile, |
- const Value& cross_incognito_args, |
- UserGestureState user_gesture) |
- : event_name(event_name), |
- event_args(event_args.DeepCopy()), |
- event_url(event_url), |
- restrict_to_profile(restrict_to_profile), |
- cross_incognito_args(cross_incognito_args.DeepCopy()), |
- user_gesture(user_gesture) {} |
- |
- ExtensionEvent(const std::string& event_name, |
- const Value& event_args, |
- const GURL& event_url, |
- Profile* restrict_to_profile, |
- UserGestureState user_gesture) |
- : event_name(event_name), |
- event_args(event_args.DeepCopy()), |
- event_url(event_url), |
- restrict_to_profile(restrict_to_profile), |
- cross_incognito_args(NULL), |
- user_gesture(user_gesture) {} |
- |
- // TODO(gdk): This variant should be retired once the callers are switched to |
- // providing Values instead of just strings. |
- ExtensionEvent(const std::string& event_name, |
- const std::string& event_args, |
- const GURL& event_url, |
- Profile* restrict_to_profile, |
- const std::string& cross_incognito_args, |
- UserGestureState user_gesture) |
- : event_name(event_name), |
- event_args(Value::CreateStringValue(event_args)), |
- event_url(event_url), |
- restrict_to_profile(restrict_to_profile), |
- cross_incognito_args(Value::CreateStringValue(cross_incognito_args)), |
- user_gesture(user_gesture) {} |
-}; |
- |
// static |
-void ExtensionEventRouter::DispatchEvent(IPC::Sender* ipc_sender, |
- const std::string& extension_id, |
- const std::string& event_name, |
- const Value& event_args, |
- const GURL& event_url, |
- UserGestureState user_gesture) { |
+void ExtensionEventRouter::DispatchEvent( |
+ IPC::Sender* ipc_sender, |
+ const std::string& extension_id, |
+ const std::string& event_name, |
+ const Value& event_args, |
+ const GURL& event_url, |
+ UserGestureState user_gesture, |
+ const extensions::EventFilteringInfo& info) { |
// TODO(gdk): Reduce number of DeepCopy() calls throughout the event dispatch |
// chain, starting by replacing the event_args with a Value*. |
ListValue args; |
args.Set(0, Value::CreateStringValue(event_name)); |
args.Set(1, event_args.DeepCopy()); |
+ args.Set(2, info.AsValue().release()); |
+ |
ipc_sender->Send(new ExtensionMsg_MessageInvoke(MSG_ROUTING_CONTROL, |
extension_id, kDispatchEvent, args, event_url, |
user_gesture == USER_GESTURE_ENABLED)); |
} |
// static |
-void ExtensionEventRouter::DispatchEvent(IPC::Sender* ipc_sender, |
- const std::string& extension_id, |
- const std::string& event_name, |
- const std::string& event_args, |
- const GURL& event_url, |
- UserGestureState user_gesture) { |
+void ExtensionEventRouter::DispatchEvent( |
+ IPC::Sender* ipc_sender, |
+ const std::string& extension_id, |
+ const std::string& event_name, |
+ const std::string& event_args, |
+ const GURL& event_url, |
+ UserGestureState user_gesture, |
+ const extensions::EventFilteringInfo& info) { |
scoped_ptr<Value> event_args_value(Value::CreateStringValue(event_args)); |
DispatchEvent(ipc_sender, extension_id, event_name, *event_args_value.get(), |
- event_url, user_gesture); |
+ event_url, user_gesture, info); |
} |
ExtensionEventRouter::ExtensionEventRouter(Profile* profile) |
: profile_(profile), |
extension_devtools_manager_( |
- ExtensionSystem::Get(profile)->devtools_manager()) { |
+ ExtensionSystem::Get(profile)->devtools_manager()), |
+ listeners_(ALLOW_THIS_IN_INITIALIZER_LIST(this)) { |
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_TERMINATED, |
content::NotificationService::AllSources()); |
registrar_.Add(this, content::NOTIFICATION_RENDERER_PROCESS_CLOSED, |
@@ -165,37 +123,46 @@ void ExtensionEventRouter::AddEventListener( |
const std::string& event_name, |
content::RenderProcessHost* process, |
const std::string& extension_id) { |
- ListenerProcess listener(process, extension_id); |
- DCHECK_EQ(listeners_[event_name].count(listener), 0u) << event_name; |
- listeners_[event_name].insert(listener); |
+ listeners_.AddListener(scoped_ptr<EventListener>(new EventListener( |
+ event_name, extension_id, process, scoped_ptr<DictionaryValue>()))); |
+} |
+ |
+void ExtensionEventRouter::RemoveEventListener( |
+ const std::string& event_name, |
+ content::RenderProcessHost* process, |
+ const std::string& extension_id) { |
+ EventListener listener(event_name, extension_id, process, |
+ scoped_ptr<DictionaryValue>()); |
+ listeners_.RemoveListener(&listener); |
+} |
+ |
+void ExtensionEventRouter::OnListenerAdded(const EventListener* listener) { |
+ // We don't care about lazy events being added. |
+ if (!listener->process) |
+ return; |
if (extension_devtools_manager_.get()) |
- extension_devtools_manager_->AddEventListener(event_name, |
- process->GetID()); |
+ extension_devtools_manager_->AddEventListener(listener->event_name, |
+ listener->process->GetID()); |
// We lazily tell the TaskManager to start updating when listeners to the |
// processes.onUpdated or processes.onUpdatedWithMemory events arrive. |
+ const std::string& event_name = listener->event_name; |
if (event_name.compare(extension_processes_api_constants::kOnUpdated) == 0 || |
event_name.compare( |
extension_processes_api_constants::kOnUpdatedWithMemory) == 0) |
ExtensionProcessesEventRouter::GetInstance()->ListenerAdded(); |
} |
-void ExtensionEventRouter::RemoveEventListener( |
- const std::string& event_name, |
- content::RenderProcessHost* process, |
- const std::string& extension_id) { |
- ListenerProcess listener(process, extension_id); |
- DCHECK_EQ(listeners_[event_name].count(listener), 1u) << |
- " PID=" << process->GetID() << " extension=" << extension_id << |
- " event=" << event_name; |
- listeners_[event_name].erase(listener); |
- // Note: extension_id may point to data in the now-deleted listeners_ object. |
- // Do not use. |
+void ExtensionEventRouter::OnListenerRemoved(const EventListener* listener) { |
+ // We don't care about lazy events being removed. |
+ if (!listener->process) |
+ return; |
+ const std::string& event_name = listener->event_name; |
if (extension_devtools_manager_.get()) |
- extension_devtools_manager_->RemoveEventListener(event_name, |
- process->GetID()); |
+ extension_devtools_manager_->RemoveEventListener( |
+ event_name, listener->process->GetID()); |
// If a processes.onUpdated or processes.onUpdatedWithMemory event listener |
// is removed (or a process with one exits), then we let the extension API |
@@ -209,14 +176,16 @@ void ExtensionEventRouter::RemoveEventListener( |
BrowserThread::IO, FROM_HERE, |
base::Bind( |
&NotifyEventListenerRemovedOnIOThread, |
- profile_, listener.extension_id, event_name)); |
+ profile_, listener->extension_id, listener->event_name)); |
} |
void ExtensionEventRouter::AddLazyEventListener( |
const std::string& event_name, |
const std::string& extension_id) { |
- ListenerProcess lazy_listener(NULL, extension_id); |
- bool is_new = lazy_listeners_[event_name].insert(lazy_listener).second; |
+ scoped_ptr<EventListener> listener(new EventListener( |
+ event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); |
+ bool is_new = listeners_.AddListener(listener.Pass()); |
+ |
if (is_new) { |
ExtensionPrefs* prefs = profile_->GetExtensionService()->extension_prefs(); |
std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); |
@@ -229,8 +198,10 @@ void ExtensionEventRouter::AddLazyEventListener( |
void ExtensionEventRouter::RemoveLazyEventListener( |
const std::string& event_name, |
const std::string& extension_id) { |
- ListenerProcess lazy_listener(NULL, extension_id); |
- bool did_exist = lazy_listeners_[event_name].erase(lazy_listener) > 0; |
+ EventListener listener(event_name, extension_id, NULL, |
+ scoped_ptr<DictionaryValue>()); |
+ bool did_exist = listeners_.RemoveListener(&listener); |
+ |
if (did_exist) { |
ExtensionPrefs* prefs = profile_->GetExtensionService()->extension_prefs(); |
std::set<std::string> events = prefs->GetRegisteredEvents(extension_id); |
@@ -240,15 +211,59 @@ void ExtensionEventRouter::RemoveLazyEventListener( |
} |
} |
+void ExtensionEventRouter::AddFilteredEventListener( |
+ const std::string& event_name, |
+ content::RenderProcessHost* process, |
+ const std::string& extension_id, |
+ const base::DictionaryValue& filter, |
+ bool add_lazy_listener) { |
+ listeners_.AddListener(scoped_ptr<EventListener>(new EventListener( |
+ event_name, extension_id, process, |
+ scoped_ptr<DictionaryValue>(filter.DeepCopy())))); |
+ |
+ if (add_lazy_listener) { |
+ bool added = listeners_.AddListener(scoped_ptr<EventListener>( |
+ new EventListener(event_name, extension_id, NULL, |
+ scoped_ptr<DictionaryValue>(filter.DeepCopy())))); |
+ |
+ if (added) { |
+ ExtensionPrefs* prefs = |
+ profile_->GetExtensionService()->extension_prefs(); |
+ prefs->AddFilterToEvent(event_name, extension_id, &filter); |
+ } |
+ } |
+} |
+ |
+void ExtensionEventRouter::RemoveFilteredEventListener( |
+ const std::string& event_name, |
+ content::RenderProcessHost* process, |
+ const std::string& extension_id, |
+ const base::DictionaryValue& filter, |
+ bool remove_lazy_listener) { |
+ EventListener listener(event_name, extension_id, process, |
+ scoped_ptr<DictionaryValue>(filter.DeepCopy())); |
+ |
+ listeners_.RemoveListener(&listener); |
+ |
+ if (remove_lazy_listener) { |
+ listener.process = NULL; |
+ bool removed = listeners_.RemoveListener(&listener); |
+ |
+ if (removed) { |
+ ExtensionPrefs* prefs = |
+ profile_->GetExtensionService()->extension_prefs(); |
+ prefs->RemoveFilterFromEvent(event_name, extension_id, &filter); |
+ } |
+ } |
+} |
+ |
bool ExtensionEventRouter::HasEventListener(const std::string& event_name) { |
- return (HasEventListenerImpl(listeners_, "", event_name) || |
- HasEventListenerImpl(lazy_listeners_, "", event_name)); |
+ return listeners_.HasListenerForEvent(event_name); |
} |
bool ExtensionEventRouter::ExtensionHasEventListener( |
const std::string& extension_id, const std::string& event_name) { |
- return (HasEventListenerImpl(listeners_, extension_id, event_name) || |
- HasEventListenerImpl(lazy_listeners_, extension_id, event_name)); |
+ return listeners_.HasListenerForExtension(extension_id, event_name); |
} |
bool ExtensionEventRouter::HasEventListenerImpl( |
@@ -275,13 +290,25 @@ void ExtensionEventRouter::DispatchEventToRenderers( |
const std::string& event_name, |
const std::string& event_args, |
Profile* restrict_to_profile, |
- const GURL& event_url) { |
+ const GURL& event_url, |
+ extensions::EventFilteringInfo info) { |
+ DCHECK(!event_args.empty()); |
+ StringValue event_args_value(event_args); |
linked_ptr<ExtensionEvent> event( |
- new ExtensionEvent(event_name, event_args, event_url, |
- restrict_to_profile, "", USER_GESTURE_UNKNOWN)); |
+ new ExtensionEvent(event_name, event_args_value, event_url, |
+ restrict_to_profile, USER_GESTURE_UNKNOWN, info)); |
DispatchEventImpl("", event); |
} |
+void ExtensionEventRouter::DispatchEventToRenderers( |
+ const std::string& event_name, |
+ const std::string& event_args, |
+ Profile* restrict_to_profile, |
+ const GURL& event_url) { |
+ DispatchEventToRenderers(event_name, event_args, restrict_to_profile, |
+ event_url, extensions::EventFilteringInfo()); |
+} |
+ |
void ExtensionEventRouter::DispatchEventToExtension( |
const std::string& extension_id, |
const std::string& event_name, |
@@ -291,7 +318,8 @@ void ExtensionEventRouter::DispatchEventToExtension( |
DCHECK(!extension_id.empty()); |
linked_ptr<ExtensionEvent> event( |
new ExtensionEvent(event_name, event_args, event_url, |
- restrict_to_profile, USER_GESTURE_UNKNOWN)); |
+ restrict_to_profile, USER_GESTURE_UNKNOWN, |
+ EventFilteringInfo())); |
DispatchEventImpl(extension_id, event); |
} |
@@ -301,8 +329,8 @@ void ExtensionEventRouter::DispatchEventToExtension( |
const std::string& event_args, |
Profile* restrict_to_profile, |
const GURL& event_url) { |
- scoped_ptr<Value> event_args_value(Value::CreateStringValue(event_args)); |
- DispatchEventToExtension(extension_id, event_name, *event_args_value.get(), |
+ StringValue event_args_value(event_args); |
+ DispatchEventToExtension(extension_id, event_name, event_args_value, |
restrict_to_profile, event_url); |
} |
@@ -314,9 +342,11 @@ void ExtensionEventRouter::DispatchEventToExtension( |
const GURL& event_url, |
UserGestureState user_gesture) { |
DCHECK(!extension_id.empty()); |
+ StringValue event_args_value(event_args); |
linked_ptr<ExtensionEvent> event( |
- new ExtensionEvent(event_name, event_args, event_url, |
- restrict_to_profile, "", user_gesture)); |
+ new ExtensionEvent(event_name, event_args_value, event_url, |
+ restrict_to_profile, user_gesture, |
+ EventFilteringInfo())); |
DispatchEventImpl(extension_id, event); |
} |
@@ -329,39 +359,57 @@ void ExtensionEventRouter::DispatchEventsToRenderersAcrossIncognito( |
linked_ptr<ExtensionEvent> event( |
new ExtensionEvent(event_name, event_args, event_url, |
restrict_to_profile, cross_incognito_args, |
- USER_GESTURE_UNKNOWN)); |
+ USER_GESTURE_UNKNOWN, EventFilteringInfo())); |
DispatchEventImpl("", event); |
} |
void ExtensionEventRouter::DispatchEventImpl( |
- const std::string& extension_id, |
+ const std::string& restrict_to_extension_id, |
const linked_ptr<ExtensionEvent>& event) { |
// We don't expect to get events from a completely different profile. |
DCHECK(!event->restrict_to_profile || |
profile_->IsSameProfile(event->restrict_to_profile)); |
- LoadLazyBackgroundPagesForEvent(extension_id, event); |
- |
- ListenerMap::iterator it = listeners_.find(event->event_name); |
- if (it == listeners_.end()) |
- return; |
- |
- std::set<ListenerProcess>& listeners = it->second; |
- for (std::set<ListenerProcess>::iterator listener = listeners.begin(); |
- listener != listeners.end(); ++listener) { |
- if (!extension_id.empty() && extension_id != listener->extension_id) |
- continue; |
+ std::set<const EventListener*> listeners( |
+ listeners_.GetEventListeners(*event)); |
+ for (std::set<const EventListener*>::iterator it = listeners.begin(); |
+ it != listeners.end(); it++) { |
+ const EventListener* listener = *it; |
+ if (listener->process) { |
+ if (restrict_to_extension_id.empty() || |
+ restrict_to_extension_id == listener->extension_id) |
+ DispatchEventToProcess(listener->extension_id, listener->process, |
+ event); |
+ } else { |
+ DispatchLazyEvent(listener->extension_id, event); |
+ } |
+ } |
+} |
- DispatchEventToListener(*listener, event); |
+void ExtensionEventRouter::DispatchLazyEvent( |
+ const std::string& extension_id, |
+ const linked_ptr<ExtensionEvent>& event) { |
+ ExtensionService* service = profile_->GetExtensionService(); |
+ // Check both the original and the incognito profile to see if we |
+ // should load a lazy bg page to handle the event. The latter case |
+ // occurs in the case of split-mode extensions. |
+ const Extension* extension = service->extensions()->GetByID(extension_id); |
+ if (extension) { |
+ MaybeLoadLazyBackgroundPageToDispatchEvent(profile_, extension, event); |
+ if (profile_->HasOffTheRecordProfile() && |
+ extension->incognito_split_mode()) { |
+ MaybeLoadLazyBackgroundPageToDispatchEvent( |
+ profile_->GetOffTheRecordProfile(), extension, event); |
+ } |
} |
} |
-void ExtensionEventRouter::DispatchEventToListener( |
- const ListenerProcess& listener, |
+void ExtensionEventRouter::DispatchEventToProcess( |
+ const std::string& extension_id, |
+ content::RenderProcessHost* process, |
const linked_ptr<ExtensionEvent>& event) { |
ExtensionService* service = profile_->GetExtensionService(); |
- const Extension* extension = service->extensions()->GetByID( |
- listener.extension_id); |
+ const Extension* extension = service->extensions()->GetByID(extension_id); |
// The extension could have been removed, but we do not unregister it until |
// the extension process is unloaded. |
@@ -369,13 +417,13 @@ void ExtensionEventRouter::DispatchEventToListener( |
return; |
Profile* listener_profile = Profile::FromBrowserContext( |
- listener.process->GetBrowserContext()); |
+ process->GetBrowserContext()); |
extensions::ProcessMap* process_map = |
listener_profile->GetExtensionService()->process_map(); |
// If the event is privileged, only send to extension processes. Otherwise, |
// it's OK to send to normal renderers (e.g., for content scripts). |
if (ExtensionAPI::GetSharedInstance()->IsPrivileged(event->event_name) && |
- !process_map->Contains(extension->id(), listener.process->GetID())) { |
+ !process_map->Contains(extension->id(), process->GetID())) { |
return; |
} |
@@ -385,9 +433,10 @@ void ExtensionEventRouter::DispatchEventToListener( |
return; |
} |
- DispatchEvent(listener.process, listener.extension_id, |
+ DispatchEvent(process, extension_id, |
event->event_name, *event_args, |
- event->event_url, event->user_gesture); |
+ event->event_url, event->user_gesture, |
+ event->info); |
IncrementInFlightEvents(listener_profile, extension); |
} |
@@ -414,38 +463,7 @@ bool ExtensionEventRouter::CanDispatchEventToProfile( |
return true; |
} |
-void ExtensionEventRouter::LoadLazyBackgroundPagesForEvent( |
- const std::string& extension_id, |
- const linked_ptr<ExtensionEvent>& event) { |
- ExtensionService* service = profile_->GetExtensionService(); |
- |
- ListenerMap::iterator it = lazy_listeners_.find(event->event_name); |
- if (it == lazy_listeners_.end()) |
- return; |
- |
- std::set<ListenerProcess>& listeners = it->second; |
- for (std::set<ListenerProcess>::iterator listener = listeners.begin(); |
- listener != listeners.end(); ++listener) { |
- if (!extension_id.empty() && extension_id != listener->extension_id) |
- continue; |
- |
- // Check both the original and the incognito profile to see if we |
- // should load a lazy bg page to handle the event. The latter case |
- // occurs in the case of split-mode extensions. |
- const Extension* extension = service->extensions()->GetByID( |
- listener->extension_id); |
- if (extension) { |
- MaybeLoadLazyBackgroundPage(profile_, extension, event); |
- if (profile_->HasOffTheRecordProfile() && |
- extension->incognito_split_mode()) { |
- MaybeLoadLazyBackgroundPage( |
- profile_->GetOffTheRecordProfile(), extension, event); |
- } |
- } |
- } |
-} |
- |
-void ExtensionEventRouter::MaybeLoadLazyBackgroundPage( |
+void ExtensionEventRouter::MaybeLoadLazyBackgroundPageToDispatchEvent( |
Profile* profile, |
const Extension* extension, |
const linked_ptr<ExtensionEvent>& event) { |
@@ -491,14 +509,15 @@ void ExtensionEventRouter::OnEventAck( |
} |
void ExtensionEventRouter::DispatchPendingEvent( |
- const linked_ptr<ExtensionEvent>& event, ExtensionHost* host) { |
+ const linked_ptr<ExtensionEvent>& event, |
+ ExtensionHost* host) { |
if (!host) |
return; |
- ListenerProcess listener(host->render_process_host(), |
- host->extension()->id()); |
- if (listeners_[event->event_name].count(listener) > 0u) |
- DispatchEventToListener(listener, event); |
+ if (listeners_.HasProcessListener(host->render_process_host(), |
+ host->extension()->id())) |
+ DispatchEventToProcess(host->extension()->id(), |
+ host->render_process_host(), event); |
} |
void ExtensionEventRouter::Observe( |
@@ -511,45 +530,30 @@ void ExtensionEventRouter::Observe( |
content::RenderProcessHost* renderer = |
content::Source<content::RenderProcessHost>(source).ptr(); |
// Remove all event listeners associated with this renderer. |
- for (ListenerMap::iterator it = listeners_.begin(); |
- it != listeners_.end(); ) { |
- ListenerMap::iterator current_it = it++; |
- for (std::set<ListenerProcess>::iterator jt = |
- current_it->second.begin(); |
- jt != current_it->second.end(); ) { |
- std::set<ListenerProcess>::iterator current_jt = jt++; |
- if (current_jt->process == renderer) { |
- RemoveEventListener(current_it->first, |
- current_jt->process, |
- current_jt->extension_id); |
- } |
- } |
- } |
+ listeners_.RemoveListenersForProcess(renderer); |
break; |
} |
case chrome::NOTIFICATION_EXTENSION_LOADED: { |
// Add all registered lazy listeners to our cache. |
const Extension* extension = |
content::Details<const Extension>(details).ptr(); |
+ ExtensionPrefs* prefs = |
+ profile_->GetExtensionService()->extension_prefs(); |
std::set<std::string> registered_events = |
- profile_->GetExtensionService()->extension_prefs()-> |
- GetRegisteredEvents(extension->id()); |
- ListenerProcess lazy_listener(NULL, extension->id()); |
- for (std::set<std::string>::iterator it = registered_events.begin(); |
- it != registered_events.end(); ++it) { |
- lazy_listeners_[*it].insert(lazy_listener); |
- } |
+ prefs->GetRegisteredEvents(extension->id()); |
+ listeners_.LoadUnfilteredLazyListeners(extension->id(), |
+ registered_events); |
+ const DictionaryValue* filtered_events = |
+ prefs->GetFilteredEvents(extension->id()); |
+ if (filtered_events) |
+ listeners_.LoadFilteredLazyListeners(extension->id(), *filtered_events); |
break; |
} |
case chrome::NOTIFICATION_EXTENSION_UNLOADED: { |
// Remove all registered lazy listeners from our cache. |
extensions::UnloadedExtensionInfo* unloaded = |
content::Details<extensions::UnloadedExtensionInfo>(details).ptr(); |
- ListenerProcess lazy_listener(NULL, unloaded->extension->id()); |
- for (ListenerMap::iterator it = lazy_listeners_.begin(); |
- it != lazy_listeners_.end(); ++it) { |
- it->second.erase(lazy_listener); |
- } |
+ listeners_.RemoveLazyListenersForExtension(unloaded->extension->id()); |
break; |
} |
case chrome::NOTIFICATION_EXTENSION_INSTALLED: { |
@@ -566,3 +570,56 @@ void ExtensionEventRouter::Observe( |
return; |
} |
} |
+ |
+ExtensionEvent::ExtensionEvent( |
+ const std::string& event_name, |
+ const Value& event_args, |
+ const GURL& event_url, |
+ Profile* restrict_to_profile, |
+ const Value& cross_incognito_args, |
+ ExtensionEventRouter::UserGestureState user_gesture, |
+ const extensions::EventFilteringInfo& info) |
+ : event_name(event_name), |
+ event_args(event_args.DeepCopy()), |
+ event_url(event_url), |
+ restrict_to_profile(restrict_to_profile), |
+ cross_incognito_args(cross_incognito_args.DeepCopy()), |
+ user_gesture(user_gesture), |
+ info(info) { |
+} |
+ |
+ExtensionEvent::ExtensionEvent( |
+ const std::string& event_name, |
+ const std::string& event_args, |
+ const GURL& event_url, |
+ Profile* restrict_to_profile, |
+ const std::string& cross_incognito_args, |
+ ExtensionEventRouter::UserGestureState user_gesture, |
+ const extensions::EventFilteringInfo& info) |
+ : event_name(event_name), |
+ event_args(Value::CreateStringValue(event_args)), |
+ event_url(event_url), |
+ restrict_to_profile(restrict_to_profile), |
+ cross_incognito_args(Value::CreateStringValue(cross_incognito_args)), |
+ user_gesture(user_gesture), |
+ info(info) { |
+} |
+ |
+ExtensionEvent::ExtensionEvent( |
+ const std::string& event_name, |
+ const Value& event_args, |
+ const GURL& event_url, |
+ Profile* restrict_to_profile, |
+ ExtensionEventRouter::UserGestureState user_gesture, |
+ const extensions::EventFilteringInfo& info) |
+ : event_name(event_name), |
+ event_args(event_args.DeepCopy()), |
+ event_url(event_url), |
+ restrict_to_profile(restrict_to_profile), |
+ cross_incognito_args(NULL), |
+ user_gesture(user_gesture), |
+ info(info) { |
+} |
+ |
+ExtensionEvent::~ExtensionEvent() { |
+} |