| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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_listener_map.h" | 5 #include "extensions/browser/event_listener_map.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| 11 #include "base/memory/ptr_util.h" |
| 11 #include "base/values.h" | 12 #include "base/values.h" |
| 12 #include "content/public/browser/render_process_host.h" | 13 #include "content/public/browser/render_process_host.h" |
| 13 #include "extensions/browser/event_router.h" | 14 #include "extensions/browser/event_router.h" |
| 14 #include "ipc/ipc_message.h" | 15 #include "ipc/ipc_message.h" |
| 15 #include "url/gurl.h" | 16 #include "url/gurl.h" |
| 16 | 17 |
| 17 using base::DictionaryValue; | 18 using base::DictionaryValue; |
| 18 | 19 |
| 19 namespace extensions { | 20 namespace extensions { |
| 20 | 21 |
| 21 typedef EventFilter::MatcherID MatcherID; | 22 typedef EventFilter::MatcherID MatcherID; |
| 22 | 23 |
| 23 // static | 24 // static |
| 24 scoped_ptr<EventListener> EventListener::ForExtension( | 25 std::unique_ptr<EventListener> EventListener::ForExtension( |
| 25 const std::string& event_name, | 26 const std::string& event_name, |
| 26 const std::string& extension_id, | 27 const std::string& extension_id, |
| 27 content::RenderProcessHost* process, | 28 content::RenderProcessHost* process, |
| 28 scoped_ptr<base::DictionaryValue> filter) { | 29 std::unique_ptr<base::DictionaryValue> filter) { |
| 29 return make_scoped_ptr(new EventListener(event_name, extension_id, GURL(), | 30 return base::WrapUnique(new EventListener(event_name, extension_id, GURL(), |
| 30 process, std::move(filter))); | 31 process, std::move(filter))); |
| 31 } | 32 } |
| 32 | 33 |
| 33 // static | 34 // static |
| 34 scoped_ptr<EventListener> EventListener::ForURL( | 35 std::unique_ptr<EventListener> EventListener::ForURL( |
| 35 const std::string& event_name, | 36 const std::string& event_name, |
| 36 const GURL& listener_url, | 37 const GURL& listener_url, |
| 37 content::RenderProcessHost* process, | 38 content::RenderProcessHost* process, |
| 38 scoped_ptr<base::DictionaryValue> filter) { | 39 std::unique_ptr<base::DictionaryValue> filter) { |
| 39 return make_scoped_ptr(new EventListener(event_name, "", listener_url, | 40 return base::WrapUnique(new EventListener(event_name, "", listener_url, |
| 40 process, std::move(filter))); | 41 process, std::move(filter))); |
| 41 } | 42 } |
| 42 | 43 |
| 43 EventListener::~EventListener() {} | 44 EventListener::~EventListener() {} |
| 44 | 45 |
| 45 bool EventListener::Equals(const EventListener* other) const { | 46 bool EventListener::Equals(const EventListener* other) const { |
| 46 // We don't check matcher_id equality because we want a listener with a | 47 // We don't check matcher_id equality because we want a listener with a |
| 47 // filter that hasn't been added to EventFilter to match one that is | 48 // filter that hasn't been added to EventFilter to match one that is |
| 48 // equivalent but has. | 49 // equivalent but has. |
| 49 return event_name_ == other->event_name_ && | 50 return event_name_ == other->event_name_ && |
| 50 extension_id_ == other->extension_id_ && | 51 extension_id_ == other->extension_id_ && |
| 51 listener_url_ == other->listener_url_ && process_ == other->process_ && | 52 listener_url_ == other->listener_url_ && process_ == other->process_ && |
| 52 ((!!filter_.get()) == (!!other->filter_.get())) && | 53 ((!!filter_.get()) == (!!other->filter_.get())) && |
| 53 (!filter_.get() || filter_->Equals(other->filter_.get())); | 54 (!filter_.get() || filter_->Equals(other->filter_.get())); |
| 54 } | 55 } |
| 55 | 56 |
| 56 scoped_ptr<EventListener> EventListener::Copy() const { | 57 std::unique_ptr<EventListener> EventListener::Copy() const { |
| 57 scoped_ptr<DictionaryValue> filter_copy; | 58 std::unique_ptr<DictionaryValue> filter_copy; |
| 58 if (filter_) | 59 if (filter_) |
| 59 filter_copy.reset(filter_->DeepCopy()); | 60 filter_copy.reset(filter_->DeepCopy()); |
| 60 return scoped_ptr<EventListener>(new EventListener(event_name_, extension_id_, | 61 return std::unique_ptr<EventListener>( |
| 61 listener_url_, process_, | 62 new EventListener(event_name_, extension_id_, listener_url_, process_, |
| 62 std::move(filter_copy))); | 63 std::move(filter_copy))); |
| 63 } | 64 } |
| 64 | 65 |
| 65 bool EventListener::IsLazy() const { | 66 bool EventListener::IsLazy() const { |
| 66 return !process_; | 67 return !process_; |
| 67 } | 68 } |
| 68 | 69 |
| 69 void EventListener::MakeLazy() { | 70 void EventListener::MakeLazy() { |
| 70 process_ = NULL; | 71 process_ = NULL; |
| 71 } | 72 } |
| 72 | 73 |
| 73 content::BrowserContext* EventListener::GetBrowserContext() const { | 74 content::BrowserContext* EventListener::GetBrowserContext() const { |
| 74 return process_ ? process_->GetBrowserContext() : NULL; | 75 return process_ ? process_->GetBrowserContext() : NULL; |
| 75 } | 76 } |
| 76 | 77 |
| 77 EventListener::EventListener(const std::string& event_name, | 78 EventListener::EventListener(const std::string& event_name, |
| 78 const std::string& extension_id, | 79 const std::string& extension_id, |
| 79 const GURL& listener_url, | 80 const GURL& listener_url, |
| 80 content::RenderProcessHost* process, | 81 content::RenderProcessHost* process, |
| 81 scoped_ptr<DictionaryValue> filter) | 82 std::unique_ptr<DictionaryValue> filter) |
| 82 : event_name_(event_name), | 83 : event_name_(event_name), |
| 83 extension_id_(extension_id), | 84 extension_id_(extension_id), |
| 84 listener_url_(listener_url), | 85 listener_url_(listener_url), |
| 85 process_(process), | 86 process_(process), |
| 86 filter_(std::move(filter)), | 87 filter_(std::move(filter)), |
| 87 matcher_id_(-1) {} | 88 matcher_id_(-1) {} |
| 88 | 89 |
| 89 EventListenerMap::EventListenerMap(Delegate* delegate) | 90 EventListenerMap::EventListenerMap(Delegate* delegate) |
| 90 : delegate_(delegate) { | 91 : delegate_(delegate) { |
| 91 } | 92 } |
| 92 | 93 |
| 93 EventListenerMap::~EventListenerMap() {} | 94 EventListenerMap::~EventListenerMap() {} |
| 94 | 95 |
| 95 bool EventListenerMap::AddListener(scoped_ptr<EventListener> listener) { | 96 bool EventListenerMap::AddListener(std::unique_ptr<EventListener> listener) { |
| 96 if (HasListener(listener.get())) | 97 if (HasListener(listener.get())) |
| 97 return false; | 98 return false; |
| 98 if (listener->filter()) { | 99 if (listener->filter()) { |
| 99 scoped_ptr<EventMatcher> matcher(ParseEventMatcher(listener->filter())); | 100 std::unique_ptr<EventMatcher> matcher( |
| 101 ParseEventMatcher(listener->filter())); |
| 100 MatcherID id = event_filter_.AddEventMatcher(listener->event_name(), | 102 MatcherID id = event_filter_.AddEventMatcher(listener->event_name(), |
| 101 std::move(matcher)); | 103 std::move(matcher)); |
| 102 listener->set_matcher_id(id); | 104 listener->set_matcher_id(id); |
| 103 listeners_by_matcher_id_[id] = listener.get(); | 105 listeners_by_matcher_id_[id] = listener.get(); |
| 104 filtered_events_.insert(listener->event_name()); | 106 filtered_events_.insert(listener->event_name()); |
| 105 } | 107 } |
| 106 linked_ptr<EventListener> listener_ptr(listener.release()); | 108 linked_ptr<EventListener> listener_ptr(listener.release()); |
| 107 listeners_[listener_ptr->event_name()].push_back(listener_ptr); | 109 listeners_[listener_ptr->event_name()].push_back(listener_ptr); |
| 108 | 110 |
| 109 delegate_->OnListenerAdded(listener_ptr.get()); | 111 delegate_->OnListenerAdded(listener_ptr.get()); |
| 110 | 112 |
| 111 return true; | 113 return true; |
| 112 } | 114 } |
| 113 | 115 |
| 114 scoped_ptr<EventMatcher> EventListenerMap::ParseEventMatcher( | 116 std::unique_ptr<EventMatcher> EventListenerMap::ParseEventMatcher( |
| 115 DictionaryValue* filter_dict) { | 117 DictionaryValue* filter_dict) { |
| 116 return scoped_ptr<EventMatcher>(new EventMatcher( | 118 return std::unique_ptr<EventMatcher>(new EventMatcher( |
| 117 make_scoped_ptr(filter_dict->DeepCopy()), MSG_ROUTING_NONE)); | 119 base::WrapUnique(filter_dict->DeepCopy()), MSG_ROUTING_NONE)); |
| 118 } | 120 } |
| 119 | 121 |
| 120 bool EventListenerMap::RemoveListener(const EventListener* listener) { | 122 bool EventListenerMap::RemoveListener(const EventListener* listener) { |
| 121 ListenerList& listeners = listeners_[listener->event_name()]; | 123 ListenerList& listeners = listeners_[listener->event_name()]; |
| 122 for (ListenerList::iterator it = listeners.begin(); it != listeners.end(); | 124 for (ListenerList::iterator it = listeners.begin(); it != listeners.end(); |
| 123 it++) { | 125 it++) { |
| 124 if ((*it)->Equals(listener)) { | 126 if ((*it)->Equals(listener)) { |
| 125 CleanupListener(it->get()); | 127 CleanupListener(it->get()); |
| 126 // Popping from the back should be cheaper than erase(it). | 128 // Popping from the back should be cheaper than erase(it). |
| 127 std::swap(*it, listeners.back()); | 129 std::swap(*it, listeners.back()); |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 } | 199 } |
| 198 } | 200 } |
| 199 } | 201 } |
| 200 | 202 |
| 201 void EventListenerMap::LoadUnfilteredLazyListeners( | 203 void EventListenerMap::LoadUnfilteredLazyListeners( |
| 202 const std::string& extension_id, | 204 const std::string& extension_id, |
| 203 const std::set<std::string>& event_names) { | 205 const std::set<std::string>& event_names) { |
| 204 for (std::set<std::string>::const_iterator it = event_names.begin(); | 206 for (std::set<std::string>::const_iterator it = event_names.begin(); |
| 205 it != event_names.end(); ++it) { | 207 it != event_names.end(); ++it) { |
| 206 AddListener(EventListener::ForExtension( | 208 AddListener(EventListener::ForExtension( |
| 207 *it, extension_id, NULL, scoped_ptr<DictionaryValue>())); | 209 *it, extension_id, NULL, std::unique_ptr<DictionaryValue>())); |
| 208 } | 210 } |
| 209 } | 211 } |
| 210 | 212 |
| 211 void EventListenerMap::LoadFilteredLazyListeners( | 213 void EventListenerMap::LoadFilteredLazyListeners( |
| 212 const std::string& extension_id, | 214 const std::string& extension_id, |
| 213 const DictionaryValue& filtered) { | 215 const DictionaryValue& filtered) { |
| 214 for (DictionaryValue::Iterator it(filtered); !it.IsAtEnd(); it.Advance()) { | 216 for (DictionaryValue::Iterator it(filtered); !it.IsAtEnd(); it.Advance()) { |
| 215 // We skip entries if they are malformed. | 217 // We skip entries if they are malformed. |
| 216 const base::ListValue* filter_list = NULL; | 218 const base::ListValue* filter_list = NULL; |
| 217 if (!it.value().GetAsList(&filter_list)) | 219 if (!it.value().GetAsList(&filter_list)) |
| 218 continue; | 220 continue; |
| 219 for (size_t i = 0; i < filter_list->GetSize(); i++) { | 221 for (size_t i = 0; i < filter_list->GetSize(); i++) { |
| 220 const DictionaryValue* filter = NULL; | 222 const DictionaryValue* filter = NULL; |
| 221 if (!filter_list->GetDictionary(i, &filter)) | 223 if (!filter_list->GetDictionary(i, &filter)) |
| 222 continue; | 224 continue; |
| 223 AddListener(EventListener::ForExtension( | 225 AddListener(EventListener::ForExtension( |
| 224 it.key(), extension_id, NULL, make_scoped_ptr(filter->DeepCopy()))); | 226 it.key(), extension_id, NULL, base::WrapUnique(filter->DeepCopy()))); |
| 225 } | 227 } |
| 226 } | 228 } |
| 227 } | 229 } |
| 228 | 230 |
| 229 std::set<const EventListener*> EventListenerMap::GetEventListeners( | 231 std::set<const EventListener*> EventListenerMap::GetEventListeners( |
| 230 const Event& event) { | 232 const Event& event) { |
| 231 std::set<const EventListener*> interested_listeners; | 233 std::set<const EventListener*> interested_listeners; |
| 232 if (IsFilteredEvent(event)) { | 234 if (IsFilteredEvent(event)) { |
| 233 // Look up the interested listeners via the EventFilter. | 235 // Look up the interested listeners via the EventFilter. |
| 234 std::set<MatcherID> ids = | 236 std::set<MatcherID> ids = |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 return; | 278 return; |
| 277 event_filter_.RemoveEventMatcher(listener->matcher_id()); | 279 event_filter_.RemoveEventMatcher(listener->matcher_id()); |
| 278 CHECK_EQ(1u, listeners_by_matcher_id_.erase(listener->matcher_id())); | 280 CHECK_EQ(1u, listeners_by_matcher_id_.erase(listener->matcher_id())); |
| 279 } | 281 } |
| 280 | 282 |
| 281 bool EventListenerMap::IsFilteredEvent(const Event& event) const { | 283 bool EventListenerMap::IsFilteredEvent(const Event& event) const { |
| 282 return filtered_events_.count(event.event_name) > 0u; | 284 return filtered_events_.count(event.event_name) > 0u; |
| 283 } | 285 } |
| 284 | 286 |
| 285 } // namespace extensions | 287 } // namespace extensions |
| OLD | NEW |