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

Side by Side Diff: ui/base/gestures/gesture_recognizer_impl.cc

Issue 10826117: Fix memory leak in ~GestureRecognizerImpl (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 4 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 (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 "ui/base/gestures/gesture_recognizer_impl.h" 5 #include "ui/base/gestures/gesture_recognizer_impl.h"
6 6
7 #include "base/logging.h" 7 #include "base/logging.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/time.h" 9 #include "base/time.h"
10 #include "ui/base/events.h" 10 #include "ui/base/events.h"
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
130 template <typename T> 130 template <typename T>
131 void TransferConsumer(GestureConsumer* current_consumer, 131 void TransferConsumer(GestureConsumer* current_consumer,
132 GestureConsumer* new_consumer, 132 GestureConsumer* new_consumer,
133 std::map<GestureConsumer*, T>* map) { 133 std::map<GestureConsumer*, T>* map) {
134 if (map->count(current_consumer)) { 134 if (map->count(current_consumer)) {
135 (*map)[new_consumer] = (*map)[current_consumer]; 135 (*map)[new_consumer] = (*map)[current_consumer];
136 map->erase(current_consumer); 136 map->erase(current_consumer);
137 } 137 }
138 } 138 }
139 139
140 template <typename T>
141 void TransferConsumer(GestureConsumer* current_consumer,
142 GestureConsumer* new_consumer,
143 std::map<GestureConsumer*, scoped_ptr<T>>* map) {
144 if (map->count(current_consumer)) {
145 (*map)[new_consumer].swap((*map)[current_consumer]);
146 map->erase(current_consumer);
girard 2012/08/02 17:14:20 Partial template specialization (from generic Tran
147 }
148 }
149
140 void RemoveConsumerFromMap(GestureConsumer* consumer, 150 void RemoveConsumerFromMap(GestureConsumer* consumer,
141 GestureRecognizerImpl::TouchIdToConsumerMap* map) { 151 GestureRecognizerImpl::TouchIdToConsumerMap* map) {
142 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin(); 152 for (GestureRecognizerImpl::TouchIdToConsumerMap::iterator i = map->begin();
143 i != map->end();) { 153 i != map->end();) {
144 if (i->second == consumer) 154 if (i->second == consumer)
145 map->erase(i++); 155 map->erase(i++);
146 else 156 else
147 ++i; 157 ++i;
148 } 158 }
149 } 159 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 GestureConsumer* target = NULL; 194 GestureConsumer* target = NULL;
185 int touch_id = event->GetLowestTouchId(); 195 int touch_id = event->GetLowestTouchId();
186 target = touch_id_target_for_gestures_[touch_id]; 196 target = touch_id_target_for_gestures_[touch_id];
187 return target; 197 return target;
188 } 198 }
189 199
190 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation( 200 GestureConsumer* GestureRecognizerImpl::GetTargetForLocation(
191 const gfx::Point& location) { 201 const gfx::Point& location) {
192 const GesturePoint* closest_point = NULL; 202 const GesturePoint* closest_point = NULL;
193 int closest_distance_squared = 0; 203 int closest_distance_squared = 0;
194 std::map<GestureConsumer*, GestureSequence*>::iterator i; 204 std::map<GestureConsumer*, scoped_ptr<GestureSequence>>::iterator i;
195 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) { 205 for (i = consumer_sequence_.begin(); i != consumer_sequence_.end(); ++i) {
196 const GesturePoint* points = i->second->points(); 206 const GesturePoint* points = i->second->points();
197 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) { 207 for (int j = 0; j < GestureSequence::kMaxGesturePoints; ++j) {
198 if (!points[j].in_use()) 208 if (!points[j].in_use())
199 continue; 209 continue;
200 gfx::Point delta = 210 gfx::Point delta =
201 points[j].last_touch_position().Subtract(location); 211 points[j].last_touch_position().Subtract(location);
202 int distance = delta.x() * delta.x() + delta.y() * delta.y(); 212 int distance = delta.x() * delta.x() + delta.y() * delta.y();
203 if (!closest_point || distance < closest_distance_squared) { 213 if (!closest_point || distance < closest_distance_squared) {
204 closest_point = &points[j]; 214 closest_point = &points[j];
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
261 GestureSequence* GestureRecognizerImpl::CreateSequence( 271 GestureSequence* GestureRecognizerImpl::CreateSequence(
262 GestureEventHelper* helper) { 272 GestureEventHelper* helper) {
263 return new GestureSequence(helper); 273 return new GestureSequence(helper);
264 } 274 }
265 275
266 //////////////////////////////////////////////////////////////////////////////// 276 ////////////////////////////////////////////////////////////////////////////////
267 // GestureRecognizerImpl, private: 277 // GestureRecognizerImpl, private:
268 278
269 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer( 279 GestureSequence* GestureRecognizerImpl::GetGestureSequenceForConsumer(
270 GestureConsumer* consumer) { 280 GestureConsumer* consumer) {
271 GestureSequence* gesture_sequence = consumer_sequence_[consumer]; 281 GestureSequence* gesture_sequence = consumer_sequence_[consumer].get();
272 if (!gesture_sequence) { 282 if (!gesture_sequence) {
273 gesture_sequence = CreateSequence(helper_); 283 gesture_sequence = CreateSequence(helper_);
274 consumer_sequence_[consumer] = gesture_sequence; 284 consumer_sequence_[consumer].reset(gesture_sequence);
275 } 285 }
276 return gesture_sequence; 286 return gesture_sequence;
277 } 287 }
278 288
279 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture( 289 GestureSequence::Gestures* GestureRecognizerImpl::ProcessTouchEventForGesture(
280 const TouchEvent& event, 290 const TouchEvent& event,
281 ui::TouchStatus status, 291 ui::TouchStatus status,
282 GestureConsumer* target) { 292 GestureConsumer* target) {
283 if (event.GetEventType() == ui::ET_TOUCH_RELEASED || 293 if (event.GetEventType() == ui::ET_TOUCH_RELEASED ||
284 event.GetEventType() == ui::ET_TOUCH_CANCELLED) { 294 event.GetEventType() == ui::ET_TOUCH_CANCELLED) {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 return sequence->ProcessTouchEventForGesture(cancelled, 330 return sequence->ProcessTouchEventForGesture(cancelled,
321 ui::TOUCH_STATUS_UNKNOWN); 331 ui::TOUCH_STATUS_UNKNOWN);
322 } 332 }
323 333
324 return sequence->ProcessTouchEventForGesture( 334 return sequence->ProcessTouchEventForGesture(
325 *event, 335 *event,
326 processed ? ui::TOUCH_STATUS_CONTINUE : ui::TOUCH_STATUS_UNKNOWN); 336 processed ? ui::TOUCH_STATUS_CONTINUE : ui::TOUCH_STATUS_UNKNOWN);
327 } 337 }
328 338
329 void GestureRecognizerImpl::FlushTouchQueue(GestureConsumer* consumer) { 339 void GestureRecognizerImpl::FlushTouchQueue(GestureConsumer* consumer) {
330 if (consumer_sequence_.count(consumer)) { 340 if (consumer_sequence_.count(consumer))
331 delete consumer_sequence_[consumer];
332 consumer_sequence_.erase(consumer); 341 consumer_sequence_.erase(consumer);
333 }
334 342
335 if (event_queue_.count(consumer)) { 343 if (event_queue_.count(consumer)) {
336 delete event_queue_[consumer]; 344 delete event_queue_[consumer];
337 event_queue_.erase(consumer); 345 event_queue_.erase(consumer);
sadrul 2012/08/02 18:29:55 Perhaps we need to do the same for event_queue_ to
girard 2012/08/02 19:33:54 That makes sense. I've updated the CL (second pat
338 } 346 }
339 347
340 RemoveConsumerFromMap(consumer, &touch_id_target_); 348 RemoveConsumerFromMap(consumer, &touch_id_target_);
341 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_); 349 RemoveConsumerFromMap(consumer, &touch_id_target_for_gestures_);
342 } 350 }
343 351
344 // GestureRecognizer, static 352 // GestureRecognizer, static
345 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) { 353 GestureRecognizer* GestureRecognizer::Create(GestureEventHelper* helper) {
346 return new GestureRecognizerImpl(helper); 354 return new GestureRecognizerImpl(helper);
347 } 355 }
348 356
349 } // namespace ui 357 } // namespace ui
OLDNEW
« ui/base/gestures/gesture_recognizer_impl.h ('K') | « ui/base/gestures/gesture_recognizer_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698