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

Unified Diff: chrome/browser/ui/views/infobars/infobars.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/ui/views/infobars/infobars.cc
===================================================================
--- chrome/browser/ui/views/infobars/infobars.cc (revision 65711)
+++ chrome/browser/ui/views/infobars/infobars.cc (working copy)
@@ -143,11 +143,10 @@
void InfoBar::ViewHierarchyChanged(bool is_add, views::View* parent,
views::View* child) {
if (child == this) {
- if (is_add) {
+ if (is_add)
InfoBarAdded();
- } else {
+ else
InfoBarRemoved();
- }
}
if (GetWidget() && GetWidget()->IsAccessibleWidget()) {
@@ -188,9 +187,8 @@
// InfoBar, views::ButtonListener implementation: ------------------
void InfoBar::ButtonPressed(views::Button* sender, const views::Event& event) {
- if (sender == close_button_) {
- if (delegate_)
- delegate_->InfoBarDismissed();
+ if ((sender == close_button_) && delegate_) {
+ delegate_->InfoBarDismissed();
RemoveInfoBar();
}
}
@@ -216,7 +214,6 @@
void InfoBar::AnimationEnded(const Animation* animation) {
if (container_) {
container_->InfoBarAnimated(false);
-
if (!animation_->IsShowing())
Close();
}
@@ -237,6 +234,7 @@
}
void InfoBar::AnimateClose() {
+ delegate_ = NULL;
bool restore_focus = true;
#if defined(OS_WIN)
// Do not restore focus (and active state with it) on Windows if some other
@@ -251,14 +249,8 @@
}
void InfoBar::Close() {
+ delegate_ = NULL;
GetParent()->RemoveChildView(this);
- // Note that we only tell the delegate we're closed here, and not when we're
- // simply destroyed (by virtue of a tab switch or being moved from window to
- // window), since this action can cause the delegate to destroy itself.
- if (delegate_) {
- delegate_->InfoBarClosed();
- delegate_ = NULL;
- }
}
void InfoBar::InfoBarAdded() {
@@ -402,10 +394,9 @@
void LinkInfoBar::LinkActivated(views::Link* source, int event_flags) {
DCHECK(source == link_);
- if (GetDelegate()->LinkClicked(
- event_utils::DispositionFromEventFlags(event_flags))) {
+ if (delegate() && GetDelegate()->LinkClicked(
+ event_utils::DispositionFromEventFlags(event_flags)))
RemoveInfoBar();
- }
}
// LinkInfoBar, views::View overrides: -----------------------------------------
@@ -461,6 +452,7 @@
ConfirmInfoBar::ConfirmInfoBar(ConfirmInfoBarDelegate* delegate)
: AlertInfoBar(delegate),
+ cached_buttons_(delegate->GetButtons()),
ok_button_(NULL),
cancel_button_(NULL),
link_(NULL),
@@ -502,10 +494,9 @@
DCHECK(source == link_);
DCHECK(link_->IsVisible());
DCHECK(!link_->GetText().empty());
- if (GetDelegate()->LinkClicked(
- event_utils::DispositionFromEventFlags(event_flags))) {
+ if (delegate() && GetDelegate()->LinkClicked(
+ event_utils::DispositionFromEventFlags(event_flags)))
RemoveInfoBar();
- }
}
// ConfirmInfoBar, views::View overrides: --------------------------------------
@@ -524,16 +515,18 @@
gfx::Size ok_ps = ok_button_->GetPreferredSize();
gfx::Size cancel_ps = cancel_button_->GetPreferredSize();
- if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_OK) {
+ // Cache the button set so that once the delegate goes away we can still
+ // Layout() (e.g. in the case of AnimateClose()).
+ if (delegate())
+ cached_buttons_ = GetDelegate()->GetButtons();
+ if (cached_buttons_ & ConfirmInfoBarDelegate::BUTTON_OK)
ok_button_width = ok_ps.width();
- } else {
+ else
ok_button_->SetVisible(false);
- }
- if (GetDelegate()->GetButtons() & ConfirmInfoBarDelegate::BUTTON_CANCEL) {
+ if (cached_buttons_ & ConfirmInfoBarDelegate::BUTTON_CANCEL)
cancel_button_width = cancel_ps.width();
- } else {
+ else
cancel_button_->SetVisible(false);
- }
cancel_button_->SetBounds(available_width - cancel_button_width,
OffsetY(this, cancel_ps), cancel_ps.width(),
@@ -565,9 +558,11 @@
// ConfirmInfoBar, views::ButtonListener implementation: ---------------
-void ConfirmInfoBar::ButtonPressed(
- views::Button* sender, const views::Event& event) {
+void ConfirmInfoBar::ButtonPressed(views::Button* sender,
+ const views::Event& event) {
InfoBar::ButtonPressed(sender, event);
+ if (!GetDelegate())
+ return;
if (sender == ok_button_) {
if (GetDelegate()->Accept())
RemoveInfoBar();

Powered by Google App Engine
This is Rietveld 408576698