Index: chrome/browser/tab_contents/tab_contents.cc |
diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc |
index dbcf1dded11747686c4c68afc2a38acb7bfeb40a..83b7e49d9e9a194f8c070b5a4937523c4aea0aa6 100644 |
--- a/chrome/browser/tab_contents/tab_contents.cc |
+++ b/chrome/browser/tab_contents/tab_contents.cc |
@@ -1106,12 +1106,20 @@ void TabContents::RemoveInfoBar(InfoBarDelegate* delegate) { |
NotificationType::TAB_CONTENTS_INFOBAR_REMOVED, |
Source<TabContents>(this), |
Details<InfoBarDelegate>(delegate)); |
- infobar_delegates_.erase(it); |
- // Remove ourselves as an observer if we are tracking no more InfoBars. |
- if (infobar_delegates_.empty()) { |
- registrar_.Remove(this, NotificationType::NAV_ENTRY_COMMITTED, |
- Source<NavigationController>(&controller_)); |
+ // Just to be safe, make sure the delegate was not removed by an observer. |
+ it = find(infobar_delegates_.begin(), infobar_delegates_.end(), delegate); |
+ if (it != infobar_delegates_.end()) { |
+ infobar_delegates_.erase(it); |
+ // Remove ourselves as an observer if we are tracking no more InfoBars. |
+ if (infobar_delegates_.empty()) { |
+ registrar_.Remove(this, NotificationType::NAV_ENTRY_COMMITTED, |
+ Source<NavigationController>(&controller_)); |
+ } |
+ } else { |
+ // If you hit this NOTREACHED, please comment in bug |
+ // http://crbug.com/50428 how you got there. |
+ NOTREACHED(); |
} |
} |
} |
@@ -1136,10 +1144,21 @@ void TabContents::ReplaceInfoBar(InfoBarDelegate* old_delegate, |
Source<TabContents>(this), |
Details<std::pair<InfoBarDelegate*, InfoBarDelegate*> >(details.get())); |
- // Remove the old one. |
- infobar_delegates_.erase(it); |
+ // Just to be safe, make sure the delegate was not removed by an observer. |
+ it = find(infobar_delegates_.begin(), infobar_delegates_.end(), old_delegate); |
+ if (it != infobar_delegates_.end()) { |
+ // Remove the old one. |
+ infobar_delegates_.erase(it); |
+ } else { |
+ // If you hit this NOTREACHED, please comment in bug |
+ // http://crbug.com/50428 how you got there. |
+ NOTREACHED(); |
+ } |
// Add the new one. |
+ DCHECK(find(infobar_delegates_.begin(), |
+ infobar_delegates_.end(), new_delegate) == |
+ infobar_delegates_.end()); |
infobar_delegates_.push_back(new_delegate); |
} |
@@ -1502,6 +1521,13 @@ void TabContents::ExpireInfoBars( |
for (int i = infobar_delegate_count() - 1; i >= 0; --i) { |
InfoBarDelegate* delegate = GetInfoBarDelegateAt(i); |
+ if (!delegate) { |
+ // If you hit this NOTREACHED, please comment in bug |
+ // http://crbug.com/50428 how you got there. |
+ NOTREACHED(); |
+ continue; |
+ } |
+ |
if (delegate->ShouldExpire(details)) |
RemoveInfoBar(delegate); |
} |