| 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 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 return event_name_ == other->event_name_ && | 56 return event_name_ == other->event_name_ && |
| 57 extension_id_ == other->extension_id_ && | 57 extension_id_ == other->extension_id_ && |
| 58 listener_url_ == other->listener_url_ && process_ == other->process_ && | 58 listener_url_ == other->listener_url_ && process_ == other->process_ && |
| 59 ((!!filter_.get()) == (!!other->filter_.get())) && | 59 ((!!filter_.get()) == (!!other->filter_.get())) && |
| 60 (!filter_.get() || filter_->Equals(other->filter_.get())); | 60 (!filter_.get() || filter_->Equals(other->filter_.get())); |
| 61 } | 61 } |
| 62 | 62 |
| 63 std::unique_ptr<EventListener> EventListener::Copy() const { | 63 std::unique_ptr<EventListener> EventListener::Copy() const { |
| 64 std::unique_ptr<DictionaryValue> filter_copy; | 64 std::unique_ptr<DictionaryValue> filter_copy; |
| 65 if (filter_) | 65 if (filter_) |
| 66 filter_copy.reset(filter_->DeepCopy()); | 66 filter_copy = filter_->CreateDeepCopy(); |
| 67 return std::unique_ptr<EventListener>( | 67 return base::WrapUnique(new EventListener(event_name_, extension_id_, |
| 68 new EventListener(event_name_, extension_id_, listener_url_, process_, | 68 listener_url_, process_, |
| 69 std::move(filter_copy))); | 69 std::move(filter_copy))); |
| 70 } | 70 } |
| 71 | 71 |
| 72 bool EventListener::IsLazy() const { | 72 bool EventListener::IsLazy() const { |
| 73 return !process_; | 73 return !process_; |
| 74 } | 74 } |
| 75 | 75 |
| 76 void EventListener::MakeLazy() { | 76 void EventListener::MakeLazy() { |
| 77 process_ = NULL; | 77 process_ = nullptr; |
| 78 } | 78 } |
| 79 | 79 |
| 80 content::BrowserContext* EventListener::GetBrowserContext() const { | 80 content::BrowserContext* EventListener::GetBrowserContext() const { |
| 81 return process_ ? process_->GetBrowserContext() : NULL; | 81 return process_ ? process_->GetBrowserContext() : nullptr; |
| 82 } | 82 } |
| 83 | 83 |
| 84 EventListener::EventListener(const std::string& event_name, | 84 EventListener::EventListener(const std::string& event_name, |
| 85 const std::string& extension_id, | 85 const std::string& extension_id, |
| 86 const GURL& listener_url, | 86 const GURL& listener_url, |
| 87 content::RenderProcessHost* process, | 87 content::RenderProcessHost* process, |
| 88 std::unique_ptr<DictionaryValue> filter) | 88 std::unique_ptr<DictionaryValue> filter) |
| 89 : event_name_(event_name), | 89 : event_name_(event_name), |
| 90 extension_id_(extension_id), | 90 extension_id_(extension_id), |
| 91 listener_url_(listener_url), | 91 listener_url_(listener_url), |
| (...skipping 22 matching lines...) Expand all Loading... |
| 114 EventListener* listener_ptr = listener.get(); | 114 EventListener* listener_ptr = listener.get(); |
| 115 listeners_[listener->event_name()].push_back(std::move(listener)); | 115 listeners_[listener->event_name()].push_back(std::move(listener)); |
| 116 | 116 |
| 117 delegate_->OnListenerAdded(listener_ptr); | 117 delegate_->OnListenerAdded(listener_ptr); |
| 118 | 118 |
| 119 return true; | 119 return true; |
| 120 } | 120 } |
| 121 | 121 |
| 122 std::unique_ptr<EventMatcher> EventListenerMap::ParseEventMatcher( | 122 std::unique_ptr<EventMatcher> EventListenerMap::ParseEventMatcher( |
| 123 DictionaryValue* filter_dict) { | 123 DictionaryValue* filter_dict) { |
| 124 return std::unique_ptr<EventMatcher>(new EventMatcher( | 124 return base::MakeUnique<EventMatcher>(filter_dict->CreateDeepCopy(), |
| 125 base::WrapUnique(filter_dict->DeepCopy()), MSG_ROUTING_NONE)); | 125 MSG_ROUTING_NONE); |
| 126 } | 126 } |
| 127 | 127 |
| 128 bool EventListenerMap::RemoveListener(const EventListener* listener) { | 128 bool EventListenerMap::RemoveListener(const EventListener* listener) { |
| 129 ListenerList& listeners = listeners_[listener->event_name()]; | 129 ListenerList& listeners = listeners_[listener->event_name()]; |
| 130 for (ListenerList::iterator it = listeners.begin(); it != listeners.end(); | 130 for (auto& it : listeners) { |
| 131 it++) { | 131 if (it->Equals(listener)) { |
| 132 if ((*it)->Equals(listener)) { | 132 CleanupListener(it.get()); |
| 133 CleanupListener(it->get()); | |
| 134 // Popping from the back should be cheaper than erase(it). | 133 // Popping from the back should be cheaper than erase(it). |
| 135 std::swap(*it, listeners.back()); | 134 std::swap(it, listeners.back()); |
| 136 listeners.pop_back(); | 135 listeners.pop_back(); |
| 137 delegate_->OnListenerRemoved(listener); | 136 delegate_->OnListenerRemoved(listener); |
| 138 return true; | 137 return true; |
| 139 } | 138 } |
| 140 } | 139 } |
| 141 return false; | 140 return false; |
| 142 } | 141 } |
| 143 | 142 |
| 144 bool EventListenerMap::HasListenerForEvent(const std::string& event_name) { | 143 bool EventListenerMap::HasListenerForEvent( |
| 145 ListenerMap::iterator it = listeners_.find(event_name); | 144 const std::string& event_name) const { |
| 145 ListenerMap::const_iterator it = listeners_.find(event_name); |
| 146 return it != listeners_.end() && !it->second.empty(); | 146 return it != listeners_.end() && !it->second.empty(); |
| 147 } | 147 } |
| 148 | 148 |
| 149 bool EventListenerMap::HasListenerForExtension( | 149 bool EventListenerMap::HasListenerForExtension( |
| 150 const std::string& extension_id, | 150 const std::string& extension_id, |
| 151 const std::string& event_name) { | 151 const std::string& event_name) const { |
| 152 ListenerMap::iterator it = listeners_.find(event_name); | 152 auto it = listeners_.find(event_name); |
| 153 if (it == listeners_.end()) | 153 if (it == listeners_.end()) |
| 154 return false; | 154 return false; |
| 155 | 155 |
| 156 for (ListenerList::iterator it2 = it->second.begin(); | 156 for (const auto& listener_to_search : it->second) { |
| 157 it2 != it->second.end(); it2++) { | 157 if (listener_to_search->extension_id() == extension_id) |
| 158 if ((*it2)->extension_id() == extension_id) | |
| 159 return true; | 158 return true; |
| 160 } | 159 } |
| 161 return false; | 160 return false; |
| 162 } | 161 } |
| 163 | 162 |
| 164 bool EventListenerMap::HasListener(const EventListener* listener) { | 163 bool EventListenerMap::HasListener(const EventListener* listener) const { |
| 165 ListenerMap::iterator it = listeners_.find(listener->event_name()); | 164 auto it = listeners_.find(listener->event_name()); |
| 166 if (it == listeners_.end()) | 165 if (it == listeners_.end()) |
| 167 return false; | 166 return false; |
| 168 for (ListenerList::iterator it2 = it->second.begin(); | 167 |
| 169 it2 != it->second.end(); it2++) { | 168 for (const auto& listener_to_search : it->second) { |
| 170 if ((*it2)->Equals(listener)) { | 169 if (listener_to_search->Equals(listener)) |
| 171 return true; | 170 return true; |
| 172 } | |
| 173 } | 171 } |
| 174 return false; | 172 return false; |
| 175 } | 173 } |
| 176 | 174 |
| 177 bool EventListenerMap::HasProcessListener(content::RenderProcessHost* process, | 175 bool EventListenerMap::HasProcessListener( |
| 178 const std::string& extension_id) { | 176 content::RenderProcessHost* process, |
| 179 for (ListenerMap::iterator it = listeners_.begin(); it != listeners_.end(); | 177 const std::string& extension_id) const { |
| 180 it++) { | 178 for (const auto& it : listeners_) { |
| 181 for (ListenerList::iterator it2 = it->second.begin(); | 179 for (const auto& listener : it.second) { |
| 182 it2 != it->second.end(); it2++) { | 180 if (listener->process() == process && |
| 183 if ((*it2)->process() == process && | 181 listener->extension_id() == extension_id) |
| 184 (*it2)->extension_id() == extension_id) | |
| 185 return true; | 182 return true; |
| 186 } | 183 } |
| 187 } | 184 } |
| 188 return false; | 185 return false; |
| 189 } | 186 } |
| 190 | 187 |
| 191 void EventListenerMap::RemoveListenersForExtension( | 188 void EventListenerMap::RemoveListenersForExtension( |
| 192 const std::string& extension_id) { | 189 const std::string& extension_id) { |
| 193 for (ListenerMap::iterator it = listeners_.begin(); it != listeners_.end(); | 190 for (auto& it : listeners_) { |
| 194 it++) { | 191 auto& listener_map = it.second; |
| 195 for (ListenerList::iterator it2 = it->second.begin(); | 192 for (ListenerList::iterator it2 = listener_map.begin(); |
| 196 it2 != it->second.end();) { | 193 it2 != listener_map.end();) { |
| 197 if ((*it2)->extension_id() == extension_id) { | 194 if ((*it2)->extension_id() == extension_id) { |
| 198 std::unique_ptr<EventListener> listener_removed = std::move(*it2); | 195 std::unique_ptr<EventListener> listener_removed = std::move(*it2); |
| 199 CleanupListener(listener_removed.get()); | 196 CleanupListener(listener_removed.get()); |
| 200 it2 = it->second.erase(it2); | 197 it2 = listener_map.erase(it2); |
| 201 delegate_->OnListenerRemoved(listener_removed.get()); | 198 delegate_->OnListenerRemoved(listener_removed.get()); |
| 202 } else { | 199 } else { |
| 203 it2++; | 200 ++it2; |
| 204 } | 201 } |
| 205 } | 202 } |
| 206 } | 203 } |
| 207 } | 204 } |
| 208 | 205 |
| 209 void EventListenerMap::LoadUnfilteredLazyListeners( | 206 void EventListenerMap::LoadUnfilteredLazyListeners( |
| 210 const std::string& extension_id, | 207 const std::string& extension_id, |
| 211 const std::set<std::string>& event_names) { | 208 const std::set<std::string>& event_names) { |
| 212 for (std::set<std::string>::const_iterator it = event_names.begin(); | 209 for (const auto& name : event_names) { |
| 213 it != event_names.end(); ++it) { | |
| 214 AddListener(EventListener::ForExtension( | 210 AddListener(EventListener::ForExtension( |
| 215 *it, extension_id, NULL, std::unique_ptr<DictionaryValue>())); | 211 name, extension_id, nullptr, std::unique_ptr<DictionaryValue>())); |
| 216 } | 212 } |
| 217 } | 213 } |
| 218 | 214 |
| 219 void EventListenerMap::LoadFilteredLazyListeners( | 215 void EventListenerMap::LoadFilteredLazyListeners( |
| 220 const std::string& extension_id, | 216 const std::string& extension_id, |
| 221 const DictionaryValue& filtered) { | 217 const DictionaryValue& filtered) { |
| 222 for (DictionaryValue::Iterator it(filtered); !it.IsAtEnd(); it.Advance()) { | 218 for (DictionaryValue::Iterator it(filtered); !it.IsAtEnd(); it.Advance()) { |
| 223 // We skip entries if they are malformed. | 219 // We skip entries if they are malformed. |
| 224 const base::ListValue* filter_list = NULL; | 220 const base::ListValue* filter_list = nullptr; |
| 225 if (!it.value().GetAsList(&filter_list)) | 221 if (!it.value().GetAsList(&filter_list)) |
| 226 continue; | 222 continue; |
| 227 for (size_t i = 0; i < filter_list->GetSize(); i++) { | 223 for (size_t i = 0; i < filter_list->GetSize(); i++) { |
| 228 const DictionaryValue* filter = NULL; | 224 const DictionaryValue* filter = nullptr; |
| 229 if (!filter_list->GetDictionary(i, &filter)) | 225 if (!filter_list->GetDictionary(i, &filter)) |
| 230 continue; | 226 continue; |
| 231 AddListener(EventListener::ForExtension( | 227 AddListener( |
| 232 it.key(), extension_id, NULL, base::WrapUnique(filter->DeepCopy()))); | 228 EventListener::ForExtension(it.key(), extension_id, nullptr, |
| 229 base::WrapUnique(filter->DeepCopy()))); |
| 233 } | 230 } |
| 234 } | 231 } |
| 235 } | 232 } |
| 236 | 233 |
| 237 std::set<const EventListener*> EventListenerMap::GetEventListeners( | 234 std::set<const EventListener*> EventListenerMap::GetEventListeners( |
| 238 const Event& event) { | 235 const Event& event) { |
| 239 std::set<const EventListener*> interested_listeners; | 236 std::set<const EventListener*> interested_listeners; |
| 240 if (IsFilteredEvent(event)) { | 237 if (IsFilteredEvent(event)) { |
| 241 // Look up the interested listeners via the EventFilter. | 238 // Look up the interested listeners via the EventFilter. |
| 242 std::set<MatcherID> ids = | 239 std::set<MatcherID> ids = |
| 243 event_filter_.MatchEvent(event.event_name, event.filter_info, | 240 event_filter_.MatchEvent(event.event_name, event.filter_info, |
| 244 MSG_ROUTING_NONE); | 241 MSG_ROUTING_NONE); |
| 245 for (std::set<MatcherID>::iterator id = ids.begin(); id != ids.end(); | 242 for (const MatcherID& id : ids) { |
| 246 id++) { | 243 EventListener* listener = listeners_by_matcher_id_[id]; |
| 247 EventListener* listener = listeners_by_matcher_id_[*id]; | |
| 248 CHECK(listener); | 244 CHECK(listener); |
| 249 interested_listeners.insert(listener); | 245 interested_listeners.insert(listener); |
| 250 } | 246 } |
| 251 } else { | 247 } else { |
| 252 ListenerList& listeners = listeners_[event.event_name]; | 248 for (const auto& listener : listeners_[event.event_name]) |
| 253 for (ListenerList::const_iterator it = listeners.begin(); | 249 interested_listeners.insert(listener.get()); |
| 254 it != listeners.end(); it++) { | |
| 255 interested_listeners.insert(it->get()); | |
| 256 } | |
| 257 } | 250 } |
| 258 | 251 |
| 259 return interested_listeners; | 252 return interested_listeners; |
| 260 } | 253 } |
| 261 | 254 |
| 262 void EventListenerMap::RemoveListenersForProcess( | 255 void EventListenerMap::RemoveListenersForProcess( |
| 263 const content::RenderProcessHost* process) { | 256 const content::RenderProcessHost* process) { |
| 264 CHECK(process); | 257 CHECK(process); |
| 265 for (ListenerMap::iterator it = listeners_.begin(); it != listeners_.end(); | 258 for (auto& it : listeners_) { |
| 266 it++) { | 259 auto& listener_map = it.second; |
| 267 for (ListenerList::iterator it2 = it->second.begin(); | 260 for (ListenerList::iterator it2 = listener_map.begin(); |
| 268 it2 != it->second.end();) { | 261 it2 != listener_map.end();) { |
| 269 if ((*it2)->process() == process) { | 262 if ((*it2)->process() == process) { |
| 270 std::unique_ptr<EventListener> listener_removed = std::move(*it2); | 263 std::unique_ptr<EventListener> listener_removed = std::move(*it2); |
| 271 CleanupListener(listener_removed.get()); | 264 CleanupListener(listener_removed.get()); |
| 272 it2 = it->second.erase(it2); | 265 it2 = listener_map.erase(it2); |
| 273 delegate_->OnListenerRemoved(listener_removed.get()); | 266 delegate_->OnListenerRemoved(listener_removed.get()); |
| 274 } else { | 267 } else { |
| 275 it2++; | 268 ++it2; |
| 276 } | 269 } |
| 277 } | 270 } |
| 278 } | 271 } |
| 279 } | 272 } |
| 280 | 273 |
| 281 void EventListenerMap::CleanupListener(EventListener* listener) { | 274 void EventListenerMap::CleanupListener(EventListener* listener) { |
| 282 // If the listener doesn't have a filter then we have nothing to clean up. | 275 // If the listener doesn't have a filter then we have nothing to clean up. |
| 283 if (listener->matcher_id() == -1) | 276 if (listener->matcher_id() == -1) |
| 284 return; | 277 return; |
| 285 event_filter_.RemoveEventMatcher(listener->matcher_id()); | 278 event_filter_.RemoveEventMatcher(listener->matcher_id()); |
| 286 CHECK_EQ(1u, listeners_by_matcher_id_.erase(listener->matcher_id())); | 279 CHECK_EQ(1u, listeners_by_matcher_id_.erase(listener->matcher_id())); |
| 287 } | 280 } |
| 288 | 281 |
| 289 bool EventListenerMap::IsFilteredEvent(const Event& event) const { | 282 bool EventListenerMap::IsFilteredEvent(const Event& event) const { |
| 290 return filtered_events_.count(event.event_name) > 0u; | 283 return base::ContainsKey(filtered_events_, event.event_name); |
| 291 } | 284 } |
| 292 | 285 |
| 293 } // namespace extensions | 286 } // namespace extensions |
| OLD | NEW |