| Index: chrome/browser/tab_contents/infobar_container.cc
|
| ===================================================================
|
| --- chrome/browser/tab_contents/infobar_container.cc (revision 88583)
|
| +++ chrome/browser/tab_contents/infobar_container.cc (working copy)
|
| @@ -56,7 +56,7 @@
|
| // OnInfoBarAnimated() for each infobar.
|
| AddInfoBar(
|
| tab_contents_->GetInfoBarDelegateAt(i)->CreateInfoBar(tab_contents_),
|
| - false, NO_CALLBACK);
|
| + i, false, NO_CALLBACK);
|
| }
|
| }
|
|
|
| @@ -124,8 +124,8 @@
|
| switch (type.value) {
|
| case NotificationType::TAB_CONTENTS_INFOBAR_ADDED:
|
| AddInfoBar(
|
| - Details<InfoBarDelegate>(details)->CreateInfoBar(tab_contents_), true,
|
| - WANT_CALLBACK);
|
| + Details<InfoBarDelegate>(details)->CreateInfoBar(tab_contents_),
|
| + infobars_.size(), true, WANT_CALLBACK);
|
| break;
|
|
|
| case NotificationType::TAB_CONTENTS_INFOBAR_REMOVED: {
|
| @@ -138,9 +138,8 @@
|
| case NotificationType::TAB_CONTENTS_INFOBAR_REPLACED: {
|
| typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> ReplaceDetails;
|
| ReplaceDetails* replace_details = Details<ReplaceDetails>(details).ptr();
|
| - RemoveInfoBar(replace_details->first, false);
|
| - AddInfoBar(replace_details->second->CreateInfoBar(tab_contents_), false,
|
| - WANT_CALLBACK);
|
| + AddInfoBar(replace_details->second->CreateInfoBar(tab_contents_),
|
| + RemoveInfoBar(replace_details->first, false), false, WANT_CALLBACK);
|
| break;
|
| }
|
|
|
| @@ -150,8 +149,8 @@
|
| }
|
| }
|
|
|
| -void InfoBarContainer::RemoveInfoBar(InfoBarDelegate* delegate,
|
| - bool use_animation) {
|
| +size_t InfoBarContainer::RemoveInfoBar(InfoBarDelegate* delegate,
|
| + bool use_animation) {
|
| // Search for the infobar associated with |delegate|. We cannot search for
|
| // |delegate| in |tab_contents_|, because an InfoBar remains alive until its
|
| // close animation completes, while the delegate is removed from the tab
|
| @@ -159,23 +158,28 @@
|
| for (InfoBars::iterator i(infobars_.begin()); i != infobars_.end(); ++i) {
|
| InfoBar* infobar = *i;
|
| if (infobar->delegate() == delegate) {
|
| + size_t position = i - infobars_.begin();
|
| // We merely need hide the infobar; it will call back to RemoveInfoBar()
|
| // itself once it's hidden.
|
| infobar->Hide(use_animation);
|
| UpdateInfoBarArrowTargetHeights();
|
| - break;
|
| + return position;
|
| }
|
| }
|
| + NOTREACHED();
|
| + return infobars_.size();
|
| }
|
|
|
| void InfoBarContainer::AddInfoBar(InfoBar* infobar,
|
| + size_t position,
|
| bool animate,
|
| CallbackStatus callback_status) {
|
| DCHECK(std::find(infobars_.begin(), infobars_.end(), infobar) ==
|
| infobars_.end());
|
| - infobars_.push_back(infobar);
|
| + DCHECK_LE(position, infobars_.size());
|
| + infobars_.insert(infobars_.begin() + position, infobar);
|
| UpdateInfoBarArrowTargetHeights();
|
| - PlatformSpecificAddInfoBar(infobar);
|
| + PlatformSpecificAddInfoBar(infobar, position);
|
| if (callback_status == WANT_CALLBACK)
|
| infobar->set_container(this);
|
| infobar->Show(animate);
|
|
|