summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
authormattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-02 04:43:14 +0000
committermattm@chromium.org <mattm@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-02 04:43:14 +0000
commit96acdf132ef5c70a39cb79f41c58beca6167dd82 (patch)
treec9baa9289dc7372705a95a1d87254bd5fa7fa55b /chrome/browser/gtk
parent582fab735a08f7eba5c5ccdbf5f62d5bdb4ff09a (diff)
downloadchromium_src-96acdf132ef5c70a39cb79f41c58beca6167dd82.zip
chromium_src-96acdf132ef5c70a39cb79f41c58beca6167dd82.tar.gz
chromium_src-96acdf132ef5c70a39cb79f41c58beca6167dd82.tar.bz2
Fix bookmark bar observer callbacks accessing gtk widgets after they are destroyed.
BUG=none TEST=run browser_tests, look for Gtk-CRITICAL errors. Review URL: http://codereview.chromium.org/562009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@37795 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc18
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.h1
2 files changed, 13 insertions, 6 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index ed9cffb..f2f6c73 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -154,15 +154,9 @@ BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window,
}
BookmarkBarGtk::~BookmarkBarGtk() {
- if (model_)
- model_->RemoveObserver(this);
-
RemoveAllBookmarkButtons();
bookmark_toolbar_.Destroy();
event_box_.Destroy();
-
- if (sync_service_)
- sync_service_->RemoveObserver(this);
}
void BookmarkBarGtk::SetProfile(Profile* profile) {
@@ -194,6 +188,8 @@ void BookmarkBarGtk::SetPageNavigator(PageNavigator* navigator) {
void BookmarkBarGtk::Init(Profile* profile) {
event_box_.Own(gtk_event_box_new());
+ g_signal_connect(event_box_.get(), "destroy",
+ G_CALLBACK(&OnEventBoxDestroy), this);
g_signal_connect(event_box_.get(), "button-press-event",
G_CALLBACK(&OnButtonPressed), this);
@@ -1223,6 +1219,16 @@ gboolean BookmarkBarGtk::OnEventBoxExpose(GtkWidget* widget,
}
// static
+void BookmarkBarGtk::OnEventBoxDestroy(GtkWidget* widget,
+ BookmarkBarGtk* bar) {
+ if (bar->model_)
+ bar->model_->RemoveObserver(bar);
+
+ if (bar->sync_service_)
+ bar->sync_service_->RemoveObserver(bar);
+}
+
+// static
void BookmarkBarGtk::OnParentSizeAllocate(GtkWidget* widget,
GtkAllocation* allocation,
BookmarkBarGtk* bar) {
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.h b/chrome/browser/gtk/bookmark_bar_gtk.h
index 68a0e4a..2770fc5 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.h
+++ b/chrome/browser/gtk/bookmark_bar_gtk.h
@@ -261,6 +261,7 @@ class BookmarkBarGtk : public AnimationDelegate,
// GtkEventBox callbacks.
static gboolean OnEventBoxExpose(GtkWidget* widget, GdkEventExpose* event,
BookmarkBarGtk* bar);
+ static void OnEventBoxDestroy(GtkWidget* widget, BookmarkBarGtk* bar);
// GtkVSeparator callbacks.
static gboolean OnSeparatorExpose(GtkWidget* widget, GdkEventExpose* event,