summaryrefslogtreecommitdiffstats
path: root/ui/views/window/dialog_delegate.cc
diff options
context:
space:
mode:
authorxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-29 00:56:10 +0000
committerxiyuan@chromium.org <xiyuan@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-01-29 00:56:10 +0000
commit98ca8224b564679f9c14fcce4a697e71e927d65d (patch)
tree5ea9ca1c2ff7234bef633d0d0e84114e731d169d /ui/views/window/dialog_delegate.cc
parent7b04ae1c29c2c0420ae1ddfe066935b847b3b232 (diff)
downloadchromium_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.cc9
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();
}