| OLD | NEW | 
|    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 #include "extensions/browser/event_router.h" |    5 #include "extensions/browser/event_router.h" | 
|    6  |    6  | 
|    7 #include <utility> |    7 #include <utility> | 
|    8  |    8  | 
|    9 #include "base/bind.h" |    9 #include "base/bind.h" | 
|   10 #include "base/command_line.h" |   10 #include "base/command_line.h" | 
| (...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  248                                   listener->GetBrowserContext()); |  248                                   listener->GetBrowserContext()); | 
|  249   std::string base_event_name = GetBaseEventName(listener->event_name()); |  249   std::string base_event_name = GetBaseEventName(listener->event_name()); | 
|  250   ObserverMap::iterator observer = observers_.find(base_event_name); |  250   ObserverMap::iterator observer = observers_.find(base_event_name); | 
|  251   if (observer != observers_.end()) |  251   if (observer != observers_.end()) | 
|  252     observer->second->OnListenerRemoved(details); |  252     observer->second->OnListenerRemoved(details); | 
|  253 } |  253 } | 
|  254  |  254  | 
|  255 void EventRouter::AddLazyEventListener(const std::string& event_name, |  255 void EventRouter::AddLazyEventListener(const std::string& event_name, | 
|  256                                        const std::string& extension_id) { |  256                                        const std::string& extension_id) { | 
|  257   bool is_new = listeners_.AddListener(EventListener::ForExtension( |  257   bool is_new = listeners_.AddListener(EventListener::ForExtension( | 
|  258       event_name, extension_id, NULL, scoped_ptr<DictionaryValue>())); |  258       event_name, extension_id, nullptr, scoped_ptr<DictionaryValue>())); | 
|  259  |  259  | 
|  260   if (is_new) { |  260   if (is_new) { | 
|  261     std::set<std::string> events = GetRegisteredEvents(extension_id); |  261     std::set<std::string> events = GetRegisteredEvents(extension_id); | 
|  262     bool prefs_is_new = events.insert(event_name).second; |  262     bool prefs_is_new = events.insert(event_name).second; | 
|  263     if (prefs_is_new) |  263     if (prefs_is_new) | 
|  264       SetRegisteredEvents(extension_id, events); |  264       SetRegisteredEvents(extension_id, events); | 
|  265   } |  265   } | 
|  266 } |  266 } | 
|  267  |  267  | 
|  268 void EventRouter::RemoveLazyEventListener(const std::string& event_name, |  268 void EventRouter::RemoveLazyEventListener(const std::string& event_name, | 
|  269                                           const std::string& extension_id) { |  269                                           const std::string& extension_id) { | 
|  270   scoped_ptr<EventListener> listener = EventListener::ForExtension( |  270   scoped_ptr<EventListener> listener = EventListener::ForExtension( | 
|  271       event_name, extension_id, NULL, scoped_ptr<DictionaryValue>()); |  271       event_name, extension_id, nullptr, scoped_ptr<DictionaryValue>()); | 
|  272   bool did_exist = listeners_.RemoveListener(listener.get()); |  272   bool did_exist = listeners_.RemoveListener(listener.get()); | 
|  273  |  273  | 
|  274   if (did_exist) { |  274   if (did_exist) { | 
|  275     std::set<std::string> events = GetRegisteredEvents(extension_id); |  275     std::set<std::string> events = GetRegisteredEvents(extension_id); | 
|  276     bool prefs_did_exist = events.erase(event_name) > 0; |  276     bool prefs_did_exist = events.erase(event_name) > 0; | 
|  277     DCHECK(prefs_did_exist); |  277     DCHECK(prefs_did_exist); | 
|  278     SetRegisteredEvents(extension_id, events); |  278     SetRegisteredEvents(extension_id, events); | 
|  279   } |  279   } | 
|  280 } |  280 } | 
|  281  |  281  | 
|  282 void EventRouter::AddFilteredEventListener(const std::string& event_name, |  282 void EventRouter::AddFilteredEventListener(const std::string& event_name, | 
|  283                                            content::RenderProcessHost* process, |  283                                            content::RenderProcessHost* process, | 
|  284                                            const std::string& extension_id, |  284                                            const std::string& extension_id, | 
|  285                                            const base::DictionaryValue& filter, |  285                                            const base::DictionaryValue& filter, | 
|  286                                            bool add_lazy_listener) { |  286                                            bool add_lazy_listener) { | 
|  287   listeners_.AddListener(EventListener::ForExtension( |  287   listeners_.AddListener(EventListener::ForExtension( | 
|  288       event_name, |  288       event_name, | 
|  289       extension_id, |  289       extension_id, | 
|  290       process, |  290       process, | 
|  291       scoped_ptr<DictionaryValue>(filter.DeepCopy()))); |  291       scoped_ptr<DictionaryValue>(filter.DeepCopy()))); | 
|  292  |  292  | 
|  293   if (add_lazy_listener) { |  293   if (add_lazy_listener) { | 
|  294     bool added = listeners_.AddListener(EventListener::ForExtension( |  294     bool added = listeners_.AddListener(EventListener::ForExtension( | 
|  295         event_name, |  295         event_name, | 
|  296         extension_id, |  296         extension_id, | 
|  297         NULL, |  297         nullptr, | 
|  298         scoped_ptr<DictionaryValue>(filter.DeepCopy()))); |  298         scoped_ptr<DictionaryValue>(filter.DeepCopy()))); | 
|  299  |  299  | 
|  300     if (added) |  300     if (added) | 
|  301       AddFilterToEvent(event_name, extension_id, &filter); |  301       AddFilterToEvent(event_name, extension_id, &filter); | 
|  302   } |  302   } | 
|  303 } |  303 } | 
|  304  |  304  | 
|  305 void EventRouter::RemoveFilteredEventListener( |  305 void EventRouter::RemoveFilteredEventListener( | 
|  306     const std::string& event_name, |  306     const std::string& event_name, | 
|  307     content::RenderProcessHost* process, |  307     content::RenderProcessHost* process, | 
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  349        listener != listeners.end(); ++listener) { |  349        listener != listeners.end(); ++listener) { | 
|  350     if (listener->extension_id == extension_id) |  350     if (listener->extension_id == extension_id) | 
|  351       return true; |  351       return true; | 
|  352   } |  352   } | 
|  353   return false; |  353   return false; | 
|  354 } |  354 } | 
|  355  |  355  | 
|  356 std::set<std::string> EventRouter::GetRegisteredEvents( |  356 std::set<std::string> EventRouter::GetRegisteredEvents( | 
|  357     const std::string& extension_id) { |  357     const std::string& extension_id) { | 
|  358   std::set<std::string> events; |  358   std::set<std::string> events; | 
|  359   const ListValue* events_value = NULL; |  359   const ListValue* events_value = nullptr; | 
|  360  |  360  | 
|  361   if (!extension_prefs_ || |  361   if (!extension_prefs_ || | 
|  362       !extension_prefs_->ReadPrefAsList( |  362       !extension_prefs_->ReadPrefAsList( | 
|  363            extension_id, kRegisteredEvents, &events_value)) { |  363            extension_id, kRegisteredEvents, &events_value)) { | 
|  364     return events; |  364     return events; | 
|  365   } |  365   } | 
|  366  |  366  | 
|  367   for (size_t i = 0; i < events_value->GetSize(); ++i) { |  367   for (size_t i = 0; i < events_value->GetSize(); ++i) { | 
|  368     std::string event; |  368     std::string event; | 
|  369     if (events_value->GetString(i, &event)) |  369     if (events_value->GetString(i, &event)) | 
| (...skipping 15 matching lines...) Expand all  Loading... | 
|  385  |  385  | 
|  386 void EventRouter::AddFilterToEvent(const std::string& event_name, |  386 void EventRouter::AddFilterToEvent(const std::string& event_name, | 
|  387                                    const std::string& extension_id, |  387                                    const std::string& extension_id, | 
|  388                                    const DictionaryValue* filter) { |  388                                    const DictionaryValue* filter) { | 
|  389   ExtensionPrefs::ScopedDictionaryUpdate update( |  389   ExtensionPrefs::ScopedDictionaryUpdate update( | 
|  390       extension_prefs_, extension_id, kFilteredEvents); |  390       extension_prefs_, extension_id, kFilteredEvents); | 
|  391   DictionaryValue* filtered_events = update.Get(); |  391   DictionaryValue* filtered_events = update.Get(); | 
|  392   if (!filtered_events) |  392   if (!filtered_events) | 
|  393     filtered_events = update.Create(); |  393     filtered_events = update.Create(); | 
|  394  |  394  | 
|  395   ListValue* filter_list = NULL; |  395   ListValue* filter_list = nullptr; | 
|  396   if (!filtered_events->GetList(event_name, &filter_list)) { |  396   if (!filtered_events->GetList(event_name, &filter_list)) { | 
|  397     filter_list = new ListValue; |  397     filter_list = new ListValue; | 
|  398     filtered_events->SetWithoutPathExpansion(event_name, filter_list); |  398     filtered_events->SetWithoutPathExpansion(event_name, filter_list); | 
|  399   } |  399   } | 
|  400  |  400  | 
|  401   filter_list->Append(filter->DeepCopy()); |  401   filter_list->Append(filter->DeepCopy()); | 
|  402 } |  402 } | 
|  403  |  403  | 
|  404 void EventRouter::RemoveFilterFromEvent(const std::string& event_name, |  404 void EventRouter::RemoveFilterFromEvent(const std::string& event_name, | 
|  405                                         const std::string& extension_id, |  405                                         const std::string& extension_id, | 
|  406                                         const DictionaryValue* filter) { |  406                                         const DictionaryValue* filter) { | 
|  407   ExtensionPrefs::ScopedDictionaryUpdate update( |  407   ExtensionPrefs::ScopedDictionaryUpdate update( | 
|  408       extension_prefs_, extension_id, kFilteredEvents); |  408       extension_prefs_, extension_id, kFilteredEvents); | 
|  409   DictionaryValue* filtered_events = update.Get(); |  409   DictionaryValue* filtered_events = update.Get(); | 
|  410   ListValue* filter_list = NULL; |  410   ListValue* filter_list = nullptr; | 
|  411   if (!filtered_events || |  411   if (!filtered_events || | 
|  412       !filtered_events->GetListWithoutPathExpansion(event_name, &filter_list)) { |  412       !filtered_events->GetListWithoutPathExpansion(event_name, &filter_list)) { | 
|  413     return; |  413     return; | 
|  414   } |  414   } | 
|  415  |  415  | 
|  416   for (size_t i = 0; i < filter_list->GetSize(); i++) { |  416   for (size_t i = 0; i < filter_list->GetSize(); i++) { | 
|  417     DictionaryValue* filter = NULL; |  417     DictionaryValue* filter = nullptr; | 
|  418     CHECK(filter_list->GetDictionary(i, &filter)); |  418     CHECK(filter_list->GetDictionary(i, &filter)); | 
|  419     if (filter->Equals(filter)) { |  419     if (filter->Equals(filter)) { | 
|  420       filter_list->Remove(i, NULL); |  420       filter_list->Remove(i, nullptr); | 
|  421       break; |  421       break; | 
|  422     } |  422     } | 
|  423   } |  423   } | 
|  424 } |  424 } | 
|  425  |  425  | 
|  426 const DictionaryValue* EventRouter::GetFilteredEvents( |  426 const DictionaryValue* EventRouter::GetFilteredEvents( | 
|  427     const std::string& extension_id) { |  427     const std::string& extension_id) { | 
|  428   const DictionaryValue* events = NULL; |  428   const DictionaryValue* events = nullptr; | 
|  429   extension_prefs_->ReadPrefAsDictionary( |  429   extension_prefs_->ReadPrefAsDictionary( | 
|  430       extension_id, kFilteredEvents, &events); |  430       extension_id, kFilteredEvents, &events); | 
|  431   return events; |  431   return events; | 
|  432 } |  432 } | 
|  433  |  433  | 
|  434 void EventRouter::BroadcastEvent(scoped_ptr<Event> event) { |  434 void EventRouter::BroadcastEvent(scoped_ptr<Event> event) { | 
|  435   DispatchEventImpl(std::string(), linked_ptr<Event>(event.release())); |  435   DispatchEventImpl(std::string(), linked_ptr<Event>(event.release())); | 
|  436 } |  436 } | 
|  437  |  437  | 
|  438 void EventRouter::DispatchEventToExtension(const std::string& extension_id, |  438 void EventRouter::DispatchEventToExtension(const std::string& extension_id, | 
| (...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  759                                       const Extension* extension, |  759                                       const Extension* extension, | 
|  760                                       UnloadedExtensionInfo::Reason reason) { |  760                                       UnloadedExtensionInfo::Reason reason) { | 
|  761   // Remove all registered lazy listeners from our cache. |  761   // Remove all registered lazy listeners from our cache. | 
|  762   listeners_.RemoveLazyListenersForExtension(extension->id()); |  762   listeners_.RemoveLazyListenersForExtension(extension->id()); | 
|  763 } |  763 } | 
|  764  |  764  | 
|  765 Event::Event(const std::string& event_name, |  765 Event::Event(const std::string& event_name, | 
|  766              scoped_ptr<base::ListValue> event_args) |  766              scoped_ptr<base::ListValue> event_args) | 
|  767     : event_name(event_name), |  767     : event_name(event_name), | 
|  768       event_args(event_args.Pass()), |  768       event_args(event_args.Pass()), | 
|  769       restrict_to_browser_context(NULL), |  769       restrict_to_browser_context(nullptr), | 
|  770       user_gesture(EventRouter::USER_GESTURE_UNKNOWN) { |  770       user_gesture(EventRouter::USER_GESTURE_UNKNOWN) { | 
|  771   DCHECK(this->event_args.get()); |  771   DCHECK(this->event_args.get()); | 
|  772 } |  772 } | 
|  773  |  773  | 
|  774 Event::Event(const std::string& event_name, |  774 Event::Event(const std::string& event_name, | 
|  775              scoped_ptr<base::ListValue> event_args, |  775              scoped_ptr<base::ListValue> event_args, | 
|  776              BrowserContext* restrict_to_browser_context) |  776              BrowserContext* restrict_to_browser_context) | 
|  777     : event_name(event_name), |  777     : event_name(event_name), | 
|  778       event_args(event_args.Pass()), |  778       event_args(event_args.Pass()), | 
|  779       restrict_to_browser_context(restrict_to_browser_context), |  779       restrict_to_browser_context(restrict_to_browser_context), | 
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  813                                      const std::string& extension_id, |  813                                      const std::string& extension_id, | 
|  814                                      const GURL& listener_url, |  814                                      const GURL& listener_url, | 
|  815                                      content::BrowserContext* browser_context) |  815                                      content::BrowserContext* browser_context) | 
|  816     : event_name(event_name), |  816     : event_name(event_name), | 
|  817       extension_id(extension_id), |  817       extension_id(extension_id), | 
|  818       listener_url(listener_url), |  818       listener_url(listener_url), | 
|  819       browser_context(browser_context) { |  819       browser_context(browser_context) { | 
|  820 } |  820 } | 
|  821  |  821  | 
|  822 }  // namespace extensions |  822 }  // namespace extensions | 
| OLD | NEW |