1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/notifications/balloon_collection_base.h" 6 7 #include "base/stl_util-inl.h" 8 #include "chrome/browser/notifications/balloon.h" 9 #include "chrome/browser/notifications/notification.h" 10 #include "googleurl/src/gurl.h" 11 12 BalloonCollectionBase::BalloonCollectionBase() { 13 } 14 15 BalloonCollectionBase::~BalloonCollectionBase() { 16 STLDeleteElements(&balloons_); 17 } 18 19 void BalloonCollectionBase::Add(Balloon* balloon) { 20 balloons_.push_back(balloon); 21 } 22 23 void BalloonCollectionBase::Remove(Balloon* balloon) { 24 // Free after removing. 25 scoped_ptr<Balloon> to_delete(balloon); 26 Balloons::iterator iter; 27 for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) { 28 if ((*iter) == balloon) { 29 balloons_.erase(iter); 30 return; 31 } 32 } 33 } 34 35 bool BalloonCollectionBase::CloseById(const std::string& id) { 36 // Use a local list of balloons to close to avoid breaking 37 // iterator changes on each close. 38 Balloons to_close; 39 Balloons::iterator iter; 40 for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) { 41 if ((*iter)->notification().notification_id() == id) 42 to_close.push_back(*iter); 43 } 44 for (iter = to_close.begin(); iter != to_close.end(); ++iter) 45 (*iter)->CloseByScript(); 46 47 return !to_close.empty(); 48 } 49 50 bool BalloonCollectionBase::CloseAllBySourceOrigin( 51 const GURL& source_origin) { 52 // Use a local list of balloons to close to avoid breaking 53 // iterator changes on each close. 54 Balloons to_close; 55 Balloons::iterator iter; 56 for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) { 57 if ((*iter)->notification().origin_url() == source_origin) 58 to_close.push_back(*iter); 59 } 60 for (iter = to_close.begin(); iter != to_close.end(); ++iter) 61 (*iter)->CloseByScript(); 62 63 return !to_close.empty(); 64 } 65 66 void BalloonCollectionBase::CloseAll() { 67 // Use a local list of balloons to close to avoid breaking 68 // iterator changes on each close. 69 Balloons to_close = balloons_; 70 for (Balloons::iterator iter = to_close.begin(); 71 iter != to_close.end(); ++iter) 72 (*iter)->CloseByScript(); 73 } 74 75 Balloon* BalloonCollectionBase::FindBalloon( 76 const Notification& notification) { 77 Balloons::iterator iter; 78 for (iter = balloons_.begin(); iter != balloons_.end(); ++iter) { 79 if ((*iter)->notification().notification_id() == 80 notification.notification_id()) { 81 return *iter; 82 } 83 } 84 return NULL; 85 } 86