Index: chrome/browser/infobars/infobar_container.cc |
=================================================================== |
--- chrome/browser/infobars/infobar_container.cc (revision 238220) |
+++ chrome/browser/infobars/infobar_container.cc (working copy) |
@@ -47,9 +47,7 @@ |
for (size_t i = 0; i < infobar_service_->infobar_count(); ++i) { |
// As when we removed the infobars above, we prevent callbacks to |
// OnInfoBarAnimated() for each infobar. |
- AddInfoBar( |
- infobar_service_->infobar_at(i)->CreateInfoBar(infobar_service_), |
- i, false, NO_CALLBACK); |
+ AddInfoBar(infobar_service_->infobar_at(i), i, false, NO_CALLBACK); |
} |
} |
@@ -114,16 +112,15 @@ |
const content::NotificationDetails& details) { |
switch (type) { |
case chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED: |
- AddInfoBar( |
- content::Details<InfoBar::AddedDetails>(details)->CreateInfoBar( |
- infobar_service_), |
- infobars_.size(), true, WANT_CALLBACK); |
+ AddInfoBar(content::Details<InfoBar::AddedDetails>(details).ptr(), |
+ infobars_.size(), true, WANT_CALLBACK); |
break; |
case chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REMOVED: { |
InfoBar::RemovedDetails* removed_details = |
content::Details<InfoBar::RemovedDetails>(details).ptr(); |
- HideInfoBar(FindInfoBar(removed_details->first), removed_details->second); |
+ removed_details->first->Hide(removed_details->second); |
+ UpdateInfoBarArrowTargetHeights(); |
break; |
} |
@@ -130,12 +127,15 @@ |
case chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_REPLACED: { |
InfoBar::ReplacedDetails* replaced_details = |
content::Details<InfoBar::ReplacedDetails>(details).ptr(); |
- InfoBar* old_infobar = FindInfoBar(replaced_details->first); |
- InfoBar* new_infobar = |
- replaced_details->second->CreateInfoBar(infobar_service_); |
+ InfoBar* old_infobar = replaced_details->first; |
+ InfoBar* new_infobar = replaced_details->second; |
PlatformSpecificReplaceInfoBar(old_infobar, new_infobar); |
- AddInfoBar(new_infobar, HideInfoBar(old_infobar, false), false, |
- WANT_CALLBACK); |
+ InfoBars::const_iterator i(std::find(infobars_.begin(), infobars_.end(), |
+ old_infobar)); |
+ DCHECK(i != infobars_.end()); |
+ size_t position = i - infobars_.begin(); |
+ old_infobar->Hide(false); |
+ AddInfoBar(new_infobar, position, false, WANT_CALLBACK); |
break; |
} |
@@ -145,33 +145,6 @@ |
} |
} |
-InfoBar* InfoBarContainer::FindInfoBar(InfoBarDelegate* delegate) { |
- // Search for the infobar associated with |delegate|. We cannot search for |
- // |delegate| in |tab_helper_|, because an InfoBar remains alive until its |
- // close animation completes, while the delegate is removed from the tab |
- // immediately. |
- for (InfoBars::iterator i(infobars_.begin()); i != infobars_.end(); ++i) { |
- InfoBar* infobar = *i; |
- if (infobar->delegate() == delegate) |
- return infobar; |
- } |
- NOTREACHED(); |
- return NULL; |
-} |
- |
-size_t InfoBarContainer::HideInfoBar(InfoBar* infobar, bool use_animation) { |
- InfoBars::iterator it = |
- std::find(infobars_.begin(), infobars_.end(), infobar); |
- DCHECK(it != infobars_.end()); |
- size_t position = it - infobars_.begin(); |
- // We merely need hide the infobar; it will call back to RemoveInfoBar() |
- // itself once it's hidden. |
- infobar->Hide(use_animation); |
- infobar->CloseSoon(); |
- UpdateInfoBarArrowTargetHeights(); |
- return position; |
-} |
- |
void InfoBarContainer::HideAllInfoBars() { |
registrar_.RemoveAll(); |
@@ -178,7 +151,8 @@ |
while (!infobars_.empty()) { |
InfoBar* infobar = infobars_.front(); |
// Inform the infobar that it's hidden. If it was already closing, this |
- // closes its delegate. |
+ // deletes it. Otherwise, this ensures the infobar will be deleted if it's |
+ // closed while it's not in an InfoBarContainer. |
infobar->Hide(false); |
} |
} |