diff options
author | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-23 18:23:02 +0000 |
---|---|---|
committer | jcampan@chromium.org <jcampan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-23 18:23:02 +0000 |
commit | 6689a7fc32e4949dd6efccdbebcb73f42edf20da (patch) | |
tree | 381da56252515d37f1f93241057337d971d2b1dc | |
parent | 9719a89d33e1bb6c677d521607862aa9dbae9a54 (diff) | |
download | chromium_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.cc | 13 |
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() { |