summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-28 17:11:32 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-06-28 17:11:32 +0000
commit9ba2696056dd3370326a8bacd084b487ca4e97e6 (patch)
treeb235a66e29a900881612b78c755a7a7ac46110d0
parentba0f12fdd22b5defc8752d6b754fad6beabb1b24 (diff)
downloadchromium_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.cc13
-rw-r--r--chrome/browser/chromeos/frame/panel_controller.h14
-rw-r--r--chrome/browser/views/tabs/browser_tab_strip_controller.cc6
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;