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

Unified Diff: chrome/browser/tab_contents/tab_contents.cc

Issue 4767001: Make TabContents own its infobar delegates.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 1 month 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/tab_contents/tab_contents.cc
===================================================================
--- chrome/browser/tab_contents/tab_contents.cc (revision 65558)
+++ chrome/browser/tab_contents/tab_contents.cc (working copy)
@@ -477,10 +477,9 @@
// notification may trigger infobars calls that access their delegate. (and
// some implementations of InfoBarDelegate do delete themselves on
// InfoBarClosed()).
- for (int i = 0; i < infobar_delegate_count(); ++i) {
- InfoBarDelegate* delegate = GetInfoBarDelegateAt(i);
- delegate->InfoBarClosed();
- }
+ for (InfoBarDelegates::reverse_iterator i(infobar_delegates_.rbegin());
+ i != infobar_delegates_.rend(); ++i)
+ (*i)->InfoBarClosed();
infobar_delegates_.clear();
// TODO(brettw) this should be moved to the view.
@@ -1066,6 +1065,7 @@
}
void TabContents::AddInfoBar(InfoBarDelegate* delegate) {
+ DCHECK(delegate != NULL);
if (delegate_ && !delegate_->infobars_enabled()) {
delegate->InfoBarClosed();
return;
@@ -1073,19 +1073,19 @@
// Look through the existing InfoBarDelegates we have for a match. If we've
// already got one that matches, then we don't add the new one.
- for (int i = 0; i < infobar_delegate_count(); ++i) {
- if (GetInfoBarDelegateAt(i)->EqualsDelegate(delegate)) {
- // Tell the new infobar to close so that it can clean itself up.
- delegate->InfoBarClosed();
- return;
- }
+ InfoBarDelegates::iterator i(std::find_if(infobar_delegates_.begin(),
+ infobar_delegates_.end(),
+ std::bind2nd(std::mem_fun(&InfoBarDelegate::EqualsDelegate), delegate)));
+ if (i != infobar_delegates_.end()) {
+ // Tell the new infobar to close so that it can clean itself up.
+ delegate->InfoBarClosed();
+ return;
}
infobar_delegates_.push_back(delegate);
NotificationService::current()->Notify(
NotificationType::TAB_CONTENTS_INFOBAR_ADDED,
- Source<TabContents>(this),
- Details<InfoBarDelegate>(delegate));
+ Source<TabContents>(this), Details<InfoBarDelegate>(delegate));
// Add ourselves as an observer for navigations the first time a delegate is
// added. We use this notification to expire InfoBars that need to expire on
@@ -1097,71 +1097,67 @@
}
void TabContents::RemoveInfoBar(InfoBarDelegate* delegate) {
+ DCHECK(delegate != NULL);
if (delegate_ && !delegate_->infobars_enabled()) {
+ delegate->InfoBarClosed();
return;
}
- std::vector<InfoBarDelegate*>::iterator it =
- find(infobar_delegates_.begin(), infobar_delegates_.end(), delegate);
- if (it != infobar_delegates_.end()) {
- InfoBarDelegate* delegate = *it;
- NotificationService::current()->Notify(
- NotificationType::TAB_CONTENTS_INFOBAR_REMOVED,
- Source<TabContents>(this),
- Details<InfoBarDelegate>(delegate));
+ InfoBarDelegates::iterator i(std::find(infobar_delegates_.begin(),
+ infobar_delegates_.end(), delegate));
+ DCHECK(i != infobar_delegates_.end());
+ NotificationService::current()->Notify(
+ NotificationType::TAB_CONTENTS_INFOBAR_REMOVED,
+ Source<TabContents>(this), Details<InfoBarDelegate>(delegate));
- // 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();
- }
+ // Just to be safe, make sure the delegate was not removed by an observer. If
+ // you hit this DCHECK, please comment in http://crbug.com/50428 how you got
+ // there.
+ i = std::find(infobar_delegates_.begin(), infobar_delegates_.end(), delegate);
+ DCHECK(i != infobar_delegates_.end());
+ infobar_delegates_.erase(i);
+ delegate->InfoBarClosed();
+
+ // 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_));
}
}
void TabContents::ReplaceInfoBar(InfoBarDelegate* old_delegate,
InfoBarDelegate* new_delegate) {
+ DCHECK(old_delegate != NULL);
+ DCHECK(new_delegate != NULL);
if (delegate_ && !delegate_->infobars_enabled()) {
new_delegate->InfoBarClosed();
return;
}
- std::vector<InfoBarDelegate*>::iterator it =
- find(infobar_delegates_.begin(), infobar_delegates_.end(), old_delegate);
- DCHECK(it != infobar_delegates_.end());
+ InfoBarDelegates::iterator i(std::find(infobar_delegates_.begin(),
+ infobar_delegates_.end(), old_delegate));
+ DCHECK(i != infobar_delegates_.end());
// Notify the container about the change of plans.
- scoped_ptr<std::pair<InfoBarDelegate*, InfoBarDelegate*> > details(
- new std::pair<InfoBarDelegate*, InfoBarDelegate*>(
- old_delegate, new_delegate));
+ typedef std::pair<InfoBarDelegate*, InfoBarDelegate*> Delegates;
+ scoped_ptr<Delegates> details(new Delegates(old_delegate, new_delegate));
NotificationService::current()->Notify(
NotificationType::TAB_CONTENTS_INFOBAR_REPLACED,
- Source<TabContents>(this),
- Details<std::pair<InfoBarDelegate*, InfoBarDelegate*> >(details.get()));
+ Source<TabContents>(this), Details<Delegates>(details.get()));
- // 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();
- }
+ // Just to be safe, make sure the delegate was not removed by an observer. If
+ // you hit this DCHECK, please comment in http://crbug.com/50428 how you got
+ // there.
+ i = std::find(infobar_delegates_.begin(), infobar_delegates_.end(),
+ old_delegate);
+ DCHECK(i != infobar_delegates_.end());
+ // Remove the old one.
+ infobar_delegates_.erase(i);
+ old_delegate->InfoBarClosed();
// Add the new one.
- DCHECK(find(infobar_delegates_.begin(),
- infobar_delegates_.end(), new_delegate) ==
- infobar_delegates_.end());
+ DCHECK(std::find(infobar_delegates_.begin(), infobar_delegates_.end(),
+ new_delegate) == infobar_delegates_.end());
infobar_delegates_.push_back(new_delegate);
}
@@ -1178,9 +1174,8 @@
// is so the bookmarks bar disappears at the same time the page does.
if (controller_.GetLastCommittedEntry()) {
// Not the first load, always use the committed DOM UI.
- if (render_manager_.dom_ui())
- return render_manager_.dom_ui()->force_bookmark_bar_visible();
- return false; // Default.
+ return (render_manager_.dom_ui() == NULL) ?
tfarina 2010/11/10 13:11:57 This change to ternary operator just make it *less
+ false : render_manager_.dom_ui()->force_bookmark_bar_visible();
}
// When it's the first load, we know either the pending one or the committed
@@ -1188,9 +1183,8 @@
// of them will be valid, so we can just check both.
if (render_manager_.pending_dom_ui())
return render_manager_.pending_dom_ui()->force_bookmark_bar_visible();
- if (render_manager_.dom_ui())
- return render_manager_.dom_ui()->force_bookmark_bar_visible();
- return false; // Default.
+ return (render_manager_.dom_ui() == NULL) ?
+ false : render_manager_.dom_ui()->force_bookmark_bar_visible();
}
void TabContents::ToolbarSizeChanged(bool is_animating) {
@@ -1217,18 +1211,17 @@
}
void TabContents::WillClose(ConstrainedWindow* window) {
- ConstrainedWindowList::iterator it =
- find(child_windows_.begin(), child_windows_.end(), window);
- bool removed_topmost_window = it == child_windows_.begin();
- if (it != child_windows_.end())
- child_windows_.erase(it);
- if (child_windows_.size() > 0) {
- if (removed_topmost_window) {
+ ConstrainedWindowList::iterator i(
+ std::find(child_windows_.begin(), child_windows_.end(), window));
+ bool removed_topmost_window = (i == child_windows_.begin());
+ if (i != child_windows_.end())
+ child_windows_.erase(i);
+ if (child_windows_.empty()) {
+ BlockTabContent(false);
+ } else {
+ if (removed_topmost_window)
child_windows_[0]->ShowConstrainedWindow();
- }
BlockTabContent(true);
- } else {
- BlockTabContent(false);
}
}
@@ -1559,17 +1552,10 @@
if (!details.is_user_initiated_main_frame_load())
return;
- 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);
+ for (InfoBarDelegates::reverse_iterator i(infobar_delegates_.rbegin());
+ i != infobar_delegates_.rend(); ++i) {
+ if ((*i)->ShouldExpire(details))
+ RemoveInfoBar(*i);
}
}
@@ -2420,8 +2406,8 @@
SetIsCrashed(true);
// Remove all infobars.
- for (int i = infobar_delegate_count() - 1; i >=0 ; --i)
- RemoveInfoBar(GetInfoBarDelegateAt(i));
+ while (!infobar_delegates_.empty())
tfarina 2010/11/10 13:11:57 What is wrong with the for loop? I guess this is s
+ RemoveInfoBar(infobar_delegates_.front());
// Tell the view that we've crashed so it can prepare the sad tab page.
// Only do this if we're not in browser shutdown, so that TabContents

Powered by Google App Engine
This is Rietveld 408576698