diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-28 17:11:32 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-06-28 17:11:32 +0000 |
commit | 9ba2696056dd3370326a8bacd084b487ca4e97e6 (patch) | |
tree | b235a66e29a900881612b78c755a7a7ac46110d0 | |
parent | ba0f12fdd22b5defc8752d6b754fad6beabb1b24 (diff) | |
download | chromium_src-9ba2696056dd3370326a8bacd084b487ca4e97e6.zip chromium_src-9ba2696056dd3370326a8bacd084b487ca4e97e6.tar.gz chromium_src-9ba2696056dd3370326a8bacd084b487ca4e97e6.tar.bz2 |
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
-rw-r--r-- | chrome/browser/chromeos/frame/panel_controller.cc | 13 | ||||
-rw-r--r-- | chrome/browser/chromeos/frame/panel_controller.h | 14 | ||||
-rw-r--r-- | chrome/browser/views/tabs/browser_tab_strip_controller.cc | 6 |
3 files changed, 23 insertions, 10 deletions
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, diff --git a/chrome/browser/views/tabs/browser_tab_strip_controller.cc b/chrome/browser/views/tabs/browser_tab_strip_controller.cc index dcb41dd..69af6fa 100644 --- a/chrome/browser/views/tabs/browser_tab_strip_controller.cc +++ b/chrome/browser/views/tabs/browser_tab_strip_controller.cc @@ -276,7 +276,11 @@ void BrowserTabStripController::CreateNewTab() { UserMetrics::RecordAction(UserMetricsAction("NewTab_Button"), model_->profile()); - Browser* browser = model_->GetSelectedTabContents()->delegate()->GetBrowser(); + TabContents* selected_tab = model_->GetSelectedTabContents(); + if (!selected_tab) + return; + + Browser* browser = selected_tab->delegate()->GetBrowser(); if (browser->OpenAppsPanelAsNewTab()) return; |