From 9ba2696056dd3370326a8bacd084b487ca4e97e6 Mon Sep 17 00:00:00 2001 From: "xiyuan@chromium.org" Date: Mon, 28 Jun 2010 17:11:32 +0000 Subject: Fix a couple crashes. - chromium-os:4237 is a crash where button listener is released before the button. And there could be such a case in PanelController where close button and its listener is not coupled as other part of the code. Potentially, a PanelController as the button listener could be released before the button. The fix is to use the TitleCotnentView as button listener and because it's the parent view of the button, it is always valid for the life time of the button. - Fix a crash in BrowserTabStripController::CreateNewTab when trying to dig out cause for 4237. It could happen that user clicks quickly on close tab and then on new tab button and model_->GetSelectedTabContents() returns NULL; BUG=chromium-os:4237 TEST=No more crashes coming in as in chromius-os:4237. Review URL: http://codereview.chromium.org/2803024 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@50990 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/browser/chromeos/frame/panel_controller.cc | 13 +++++++++---- chrome/browser/chromeos/frame/panel_controller.h | 14 +++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) (limited to 'chrome/browser/chromeos') diff --git a/chrome/browser/chromeos/frame/panel_controller.cc b/chrome/browser/chromeos/frame/panel_controller.cc index 7d0e5f3..4cfcea1 100644 --- a/chrome/browser/chromeos/frame/panel_controller.cc +++ b/chrome/browser/chromeos/frame/panel_controller.cc @@ -271,10 +271,9 @@ void PanelController::Close() { } } -void PanelController::ButtonPressed( - views::Button* sender, const views::Event& event) { +void PanelController::OnCloseButtonPressed() { DCHECK(title_content_); - if (title_window_ && sender == title_content_->close_button()) { + if (title_window_) { if (delegate_) delegate_->ClosePanel(); Close(); @@ -285,7 +284,7 @@ PanelController::TitleContentView::TitleContentView( PanelController* panel_controller) : panel_controller_(panel_controller) { InitializeResources(); - close_button_ = new views::ImageButton(panel_controller_); + close_button_ = new views::ImageButton(this); close_button_->SetImage(views::CustomButton::BS_NORMAL, close_button_n); close_button_->SetImage(views::CustomButton::BS_HOT, close_button_h); close_button_->SetImage(views::CustomButton::BS_PUSHED, close_button_p); @@ -363,4 +362,10 @@ void PanelController::TitleContentView::OnClose() { panel_controller_ = NULL; } +void PanelController::TitleContentView::ButtonPressed( + views::Button* sender, const views::Event& event) { + if (panel_controller_ && sender == close_button_) + panel_controller_->OnCloseButtonPressed(); +} + } // namespace chromeos diff --git a/chrome/browser/chromeos/frame/panel_controller.h b/chrome/browser/chromeos/frame/panel_controller.h index 58a1660..63b1898 100644 --- a/chrome/browser/chromeos/frame/panel_controller.h +++ b/chrome/browser/chromeos/frame/panel_controller.h @@ -25,7 +25,7 @@ class WidgetGtk; namespace chromeos { // Controls interactions with the WM for popups / panels. -class PanelController : public views::ButtonListener { +class PanelController { public: enum State { INITIAL, @@ -66,11 +66,9 @@ class PanelController : public views::ButtonListener { void SetState(State state); - // ButtonListener methods. - virtual void ButtonPressed(views::Button* sender, const views::Event& event); - private: - class TitleContentView : public views::View { + class TitleContentView : public views::View, + public views::ButtonListener { public: explicit TitleContentView(PanelController* panelController); virtual ~TitleContentView() {} @@ -86,6 +84,9 @@ class PanelController : public views::ButtonListener { views::Label* title_label() { return title_label_; } views::ImageButton* close_button() { return close_button_; } + // ButtonListener methods. + virtual void ButtonPressed(views::Button* sender, + const views::Event& event); private: views::ImageView* title_icon_; views::Label* title_label_; @@ -94,6 +95,9 @@ class PanelController : public views::ButtonListener { DISALLOW_COPY_AND_ASSIGN(TitleContentView); }; + // Called from TitleContentView's ButtonPressed handler. + void OnCloseButtonPressed(); + // Dispatches client events to PanelController instances static bool OnPanelClientEvent( GtkWidget* widget, -- cgit v1.1