Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(72)

Side by Side Diff: extensions/browser/event_listener_map.cc

Issue 2887293003: Modernize some extensions code. (Closed)
Patch Set: address comments Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « extensions/browser/event_listener_map.h ('k') | extensions/browser/event_listener_map_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698