diff options
author | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-29 00:56:10 +0000 |
---|---|---|
committer | xiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-01-29 00:56:10 +0000 |
commit | 98ca8224b564679f9c14fcce4a697e71e927d65d (patch) | |
tree | 5ea9ca1c2ff7234bef633d0d0e84114e731d169d /ui/views/window/dialog_delegate.cc | |
parent | 7b04ae1c29c2c0420ae1ddfe066935b847b3b232 (diff) | |
download | chromium_src-98ca8224b564679f9c14fcce4a697e71e927d65d.zip chromium_src-98ca8224b564679f9c14fcce4a697e71e927d65d.tar.gz chromium_src-98ca8224b564679f9c14fcce4a697e71e927d65d.tar.bz2 |
views: Fix a Widget destruction crash.
For WIDGET_OWNS_NATIVE_WIDGET widget, we destroy root view before we delete
|native_widget_|. If a WidgetDelegateView is in root view's hierarchy, the
native widget destruction would crash because |widget_delegate_| is accessed
in OnNativeWidgetDestroying but it is deleted with root view already.
This CL marks WidgetDelegateView as owned by client so that it does not go
away with the root view hierarchy and be deleted on DeleteDelegate.
BUG=164791
TEST=Covered with a new unit test.
R=ben@chromium.org
Review URL: https://chromiumcodereview.appspot.com/11953066
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@179231 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/window/dialog_delegate.cc')
-rw-r--r-- | ui/views/window/dialog_delegate.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index 33a1b9a..711554d 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc @@ -151,7 +151,10 @@ ui::AccessibilityTypes::Role DialogDelegate::GetAccessibleWindowRole() const { //////////////////////////////////////////////////////////////////////////////// // DialogDelegateView: -DialogDelegateView::DialogDelegateView() {} +DialogDelegateView::DialogDelegateView() { + // A WidgetDelegate should be deleted on DeleteDelegate. + set_owned_by_client(); +} DialogDelegateView::~DialogDelegateView() {} @@ -162,6 +165,10 @@ Widget* DialogDelegateView::CreateDialogWidget(DialogDelegateView* dialog, return CreateDialogWidgetImpl(dialog, context, parent); } +void DialogDelegateView::DeleteDelegate() { + delete this; +} + Widget* DialogDelegateView::GetWidget() { return View::GetWidget(); } |