summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 18:23:02 +0000
committerjcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-23 18:23:02 +0000
commit6689a7fc32e4949dd6efccdbebcb73f42edf20da (patch)
tree381da56252515d37f1f93241057337d971d2b1dc
parent9719a89d33e1bb6c677d521607862aa9dbae9a54 (diff)
downloadchromium_src-6689a7fc32e4949dd6efccdbebcb73f42edf20da.zip
chromium_src-6689a7fc32e4949dd6efccdbebcb73f42edf20da.tar.gz
chromium_src-6689a7fc32e4949dd6efccdbebcb73f42edf20da.tar.bz2
Fix for a focus related NOTREACHED when closing Chrome
A focus related asserion was hit when closing Chrome. It was caused by the top level widget being destroyed and deleting itself before its children. When deleted it would delete the focus manager without giving child widgets a chance to remove focus change listener causing the assert. We now delay the deletion of the WidgetGtk so child widget get the destroy message when the top WidgetGtk is still alive. BUG=None TEST=Close Chrome toolkit views. It should not assert because of the focus manager. Review URL: http://codereview.chromium.org/231003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26952 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--views/widget/widget_gtk.cc13
1 files changed, 9 insertions, 4 deletions
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index be3c102..8f43603 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -390,8 +390,10 @@ gfx::NativeView WidgetGtk::GetNativeView() const {
}
void WidgetGtk::PaintNow(const gfx::Rect& update_rect) {
- gtk_widget_queue_draw_area(widget_, update_rect.x(), update_rect.y(),
- update_rect.width(), update_rect.height());
+ if (widget_) {
+ gtk_widget_queue_draw_area(widget_, update_rect.x(), update_rect.y(),
+ update_rect.width(), update_rect.height());
+ }
}
void WidgetGtk::SetOpacity(unsigned char opacity) {
@@ -726,8 +728,11 @@ void WidgetGtk::OnGrabNotify(GtkWidget* widget, gboolean was_grabbed) {
void WidgetGtk::OnDestroy() {
widget_ = window_contents_ = NULL;
- if (delete_on_destroy_)
- delete this;
+ if (delete_on_destroy_) {
+ // Delays the deletion of this WidgetGtk as we want its children to have
+ // access to it when destroyed.
+ MessageLoop::current()->DeleteSoon(FROM_HERE, this);
+ }
}
void WidgetGtk::DoGrab() {