diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-25 19:09:41 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-05-25 19:09:41 +0000 |
commit | 51620d0b22f462ec2290d3426e010b476690c924 (patch) | |
tree | ecc8b72cbd5c31d12ff73b46957e1bb93e4eed77 /views | |
parent | e20d693415d52499e9d4ae9c9e394a3c0123dd99 (diff) | |
download | chromium_src-51620d0b22f462ec2290d3426e010b476690c924.zip chromium_src-51620d0b22f462ec2290d3426e010b476690c924.tar.gz chromium_src-51620d0b22f462ec2290d3426e010b476690c924.tar.bz2 |
Make Widget ownership a little clearer by expressing it in terms of an enum.
BUG=72040
TEST=none
Review URL: http://codereview.chromium.org/7031053
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@86669 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'views')
-rw-r--r-- | views/focus/focus_manager_unittest.cc | 2 | ||||
-rw-r--r-- | views/view_unittest.cc | 10 | ||||
-rw-r--r-- | views/widget/native_widget_gtk.cc | 11 | ||||
-rw-r--r-- | views/widget/native_widget_gtk.h | 2 | ||||
-rw-r--r-- | views/widget/native_widget_test_utils_gtk.cc | 4 | ||||
-rw-r--r-- | views/widget/native_widget_test_utils_win.cc | 4 | ||||
-rw-r--r-- | views/widget/native_widget_win.cc | 8 | ||||
-rw-r--r-- | views/widget/native_widget_win.h | 2 | ||||
-rw-r--r-- | views/widget/native_widget_win_unittest.cc | 2 | ||||
-rw-r--r-- | views/widget/widget.cc | 10 | ||||
-rw-r--r-- | views/widget/widget.h | 25 |
11 files changed, 47 insertions, 33 deletions
diff --git a/views/focus/focus_manager_unittest.cc b/views/focus/focus_manager_unittest.cc index 4f59eaa..ddd74f1 100644 --- a/views/focus/focus_manager_unittest.cc +++ b/views/focus/focus_manager_unittest.cc @@ -1595,7 +1595,7 @@ TEST_F(FocusManagerTest, CreationForNativeRoot) { // Create a view window parented to native dialog. scoped_ptr<Widget> widget1(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = hwnd; params.bounds = gfx::Rect(0, 0, 100, 100); widget1->Init(params); diff --git a/views/view_unittest.cc b/views/view_unittest.cc index 5f86edd..263fc66 100644 --- a/views/view_unittest.cc +++ b/views/view_unittest.cc @@ -295,7 +295,7 @@ TEST_F(ViewTest, MouseEvent) { scoped_ptr<Widget> widget(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(50, 50, 650, 650); widget->Init(params); View* root = widget->GetRootView(); @@ -404,7 +404,7 @@ TEST_F(ViewTest, TouchEvent) { scoped_ptr<Widget> widget(new Widget()); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(50, 50, 650, 650); widget->Init(params); View* root = widget->GetRootView(); @@ -935,7 +935,7 @@ TEST_F(ViewTest, ActivateAccelerator) { // Create a window and add the view as its child. scoped_ptr<Widget> widget(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(0, 0, 100, 100); widget->Init(params); View* root = widget->GetRootView(); @@ -1000,7 +1000,7 @@ TEST_F(ViewTest, HiddenViewWithAccelerator) { scoped_ptr<Widget> widget(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(0, 0, 100, 100); widget->Init(params); View* root = widget->GetRootView(); @@ -1822,7 +1822,7 @@ TEST_F(ViewTest, OnVisibleBoundsChanged) { scoped_ptr<Widget> widget(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = viewport_bounds; widget->Init(params); widget->GetRootView()->SetBoundsRect(viewport_bounds); diff --git a/views/widget/native_widget_gtk.cc b/views/widget/native_widget_gtk.cc index e160e85..410e4de 100644 --- a/views/widget/native_widget_gtk.cc +++ b/views/widget/native_widget_gtk.cc @@ -289,7 +289,7 @@ NativeWidgetGtk::NativeWidgetGtk(internal::NativeWidgetDelegate* delegate) window_contents_(NULL), child_(false), ALLOW_THIS_IN_INITIALIZER_LIST(close_widget_factory_(this)), - delete_on_destroy_(true), + ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), transparent_(false), ignore_events_(false), ignore_drag_leave_(false), @@ -323,8 +323,9 @@ NativeWidgetGtk::~NativeWidgetGtk() { // We need to delete the input method before calling DestroyRootView(), // because it'll set focus_manager_ to NULL. input_method_.reset(); - DCHECK(delete_on_destroy_ || widget_ == NULL); - if (delete_on_destroy_) + DCHECK(ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET || + widget_ == NULL); + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) delete delegate_; // TODO(altimofeev): investigate why OnDestroy could not be called. if (!child_) @@ -1334,7 +1335,7 @@ void NativeWidgetGtk::OnDestroy(GtkWidget* object) { // NULL out pointers here since we might still be in an observer list // until delstion happens. widget_ = window_contents_ = NULL; - if (delete_on_destroy_) { + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) { // Delays the deletion of this NativeWidgetGtk as we want its children to // have access to it when destroyed. MessageLoop::current()->DeleteSoon(FROM_HERE, this); @@ -1415,7 +1416,7 @@ void NativeWidgetGtk::DispatchKeyEventPostIME(const KeyEvent& key) { void NativeWidgetGtk::SetInitParams(const Widget::InitParams& params) { DCHECK(!GetNativeView()); - delete_on_destroy_ = params.delete_on_destroy; + ownership_ = params.ownership; child_ = params.child; // TODO(beng): The secondary checks here actually obviate the need for diff --git a/views/widget/native_widget_gtk.h b/views/widget/native_widget_gtk.h index fb54b45..d29fee3 100644 --- a/views/widget/native_widget_gtk.h +++ b/views/widget/native_widget_gtk.h @@ -326,7 +326,7 @@ class NativeWidgetGtk : public NativeWidget, ScopedRunnableMethodFactory<NativeWidgetGtk> close_widget_factory_; // See class documentation for Widget in widget.h for a note about ownership. - bool delete_on_destroy_; + Widget::InitParams::Ownership ownership_; // See description above make_transparent for details. bool transparent_; diff --git a/views/widget/native_widget_test_utils_gtk.cc b/views/widget/native_widget_test_utils_gtk.cc index 2e0a820..2f93ea6 100644 --- a/views/widget/native_widget_test_utils_gtk.cc +++ b/views/widget/native_widget_test_utils_gtk.cc @@ -18,7 +18,7 @@ NativeWidget* CreateNativeWidget() { NativeWidget* CreateNativeWidgetWithContents(View* contents_view) { Widget* widget = new Widget; Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(10, 10, 200, 200); widget->Init(params); return widget->native_widget(); @@ -27,7 +27,7 @@ NativeWidget* CreateNativeWidgetWithContents(View* contents_view) { NativeWidget* CreateNativeWidgetWithParent(NativeWidget* parent) { Widget* widget = new Widget; Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = parent ? parent->GetWidget()->GetNativeView() : NULL; params.bounds = gfx::Rect(10, 10, 200, 200); widget->Init(params); diff --git a/views/widget/native_widget_test_utils_win.cc b/views/widget/native_widget_test_utils_win.cc index 5f70439..8963f48 100644 --- a/views/widget/native_widget_test_utils_win.cc +++ b/views/widget/native_widget_test_utils_win.cc @@ -18,7 +18,7 @@ NativeWidget* CreateNativeWidget() { NativeWidget* CreateNativeWidgetWithContents(View* contents_view) { Widget* widget = new Widget; Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(10, 10, 200, 200); widget->Init(params); return widget->native_widget(); @@ -27,7 +27,7 @@ NativeWidget* CreateNativeWidgetWithContents(View* contents_view) { NativeWidget* CreateNativeWidgetWithParent(NativeWidget* parent) { Widget* widget = new Widget; Widget::InitParams params(Widget::InitParams::TYPE_CONTROL); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.child = false; // Implicitly set to true by ctor with TYPE_CONTROL. params.parent = parent ? parent->GetWidget()->GetNativeView() : NULL; params.bounds = gfx::Rect(10, 10, 200, 200); diff --git a/views/widget/native_widget_win.cc b/views/widget/native_widget_win.cc index 6ca61bc..20799fa 100644 --- a/views/widget/native_widget_win.cc +++ b/views/widget/native_widget_win.cc @@ -139,7 +139,7 @@ NativeWidgetWin::NativeWidgetWin(internal::NativeWidgetDelegate* delegate) use_layered_buffer_(false), layered_alpha_(255), ALLOW_THIS_IN_INITIALIZER_LIST(paint_layered_window_factory_(this)), - delete_on_destroy_(true), + ownership_(Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET), can_update_layered_window_(true), is_window_(false), restore_focus_when_enabled_(false), @@ -153,7 +153,7 @@ NativeWidgetWin::~NativeWidgetWin() { // We need to delete the input method before calling DestroyRootView(), // because it'll set focus_manager_ to NULL. input_method_.reset(); - if (delete_on_destroy_) + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) delete delegate_; } @@ -954,7 +954,7 @@ void NativeWidgetWin::OnWindowPosChanged(WINDOWPOS* window_pos) { } void NativeWidgetWin::OnFinalMessage(HWND window) { - if (delete_on_destroy_) + if (ownership_ == Widget::InitParams::NATIVE_WIDGET_OWNS_WIDGET) delete this; } @@ -1048,7 +1048,7 @@ void NativeWidgetWin::PostProcessActivateMessage(NativeWidgetWin* widget, void NativeWidgetWin::SetInitParams(const Widget::InitParams& params) { // Set non-style attributes. - delete_on_destroy_ = params.delete_on_destroy; + ownership_ = params.ownership; DWORD style = WS_CLIPCHILDREN | WS_CLIPSIBLINGS; DWORD ex_style = 0; diff --git a/views/widget/native_widget_win.h b/views/widget/native_widget_win.h index 53adfd1..8fc0589 100644 --- a/views/widget/native_widget_win.h +++ b/views/widget/native_widget_win.h @@ -475,7 +475,7 @@ class NativeWidgetWin : public ui::WindowImpl, ScopedRunnableMethodFactory<NativeWidgetWin> paint_layered_window_factory_; // See class documentation for Widget in widget.h for a note about ownership. - bool delete_on_destroy_; + Widget::InitParams::Ownership ownership_; // True if we are allowed to update the layered window from the DIB backing // store if necessary. diff --git a/views/widget/native_widget_win_unittest.cc b/views/widget/native_widget_win_unittest.cc index cc59e75..d4345a8 100644 --- a/views/widget/native_widget_win_unittest.cc +++ b/views/widget/native_widget_win_unittest.cc @@ -45,7 +45,7 @@ class NativeWidgetWinTest : public testing::Test { NativeWidgetWin* NativeWidgetWinTest::CreateNativeWidgetWin() { scoped_ptr<Widget> widget(new Widget); Widget::InitParams params(Widget::InitParams::TYPE_WINDOW); - params.delete_on_destroy = false; + params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(50, 50, 650, 650); widget->Init(params); return static_cast<NativeWidgetWin*>(widget.release()->native_widget()); diff --git a/views/widget/widget.cc b/views/widget/widget.cc index 85a9e58..c6d2556 100644 --- a/views/widget/widget.cc +++ b/views/widget/widget.cc @@ -33,7 +33,7 @@ Widget::InitParams::InitParams() accept_events(true), can_activate(true), keep_on_top(false), - delete_on_destroy(true), + ownership(NATIVE_WIDGET_OWNS_WIDGET), mirror_origin_in_rtl(false), has_dropshadow(false), double_buffer(false), @@ -50,7 +50,7 @@ Widget::InitParams::InitParams(Type type) accept_events(true), can_activate(type != TYPE_POPUP && type != TYPE_MENU), keep_on_top(type == TYPE_MENU), - delete_on_destroy(true), + ownership(NATIVE_WIDGET_OWNS_WIDGET), mirror_origin_in_rtl(false), has_dropshadow(false), double_buffer(false), @@ -73,14 +73,14 @@ Widget::Widget() native_widget_(NULL), widget_delegate_(NULL), dragged_view_(NULL), - delete_on_destroy_(false), + ownership_(InitParams::NATIVE_WIDGET_OWNS_WIDGET), is_secondary_widget_(true) { } Widget::~Widget() { DestroyRootView(); - if (!delete_on_destroy_) + if (ownership_ == InitParams::WIDGET_OWNS_NATIVE_WIDGET) delete native_widget_; } @@ -95,7 +95,7 @@ bool Widget::IsPureViews() { } void Widget::Init(const InitParams& params) { - delete_on_destroy_ = params.delete_on_destroy; + ownership_ = params.ownership; native_widget_ = params.native_widget ? params.native_widget : NativeWidget::CreateNativeWidget(this); diff --git a/views/widget/widget.h b/views/widget/widget.h index 945ddaa..c6f8158 100644 --- a/views/widget/widget.h +++ b/views/widget/widget.h @@ -56,14 +56,14 @@ class RootView; // // A special note on ownership: // -// Depending on the value of "delete_on_destroy", the Widget either owns or -// is owned by its NativeWidget: +// Depending on the value of the InitParams' ownership field, the Widget +// either owns or is owned by its NativeWidget: // -// delete_on_destroy = true (default) +// ownership = NATIVE_WIDGET_OWNS_WIDGET (default) // The Widget instance is owned by its NativeWidget. When the NativeWidget // is destroyed (in response to a native destruction message), it deletes // the Widget from its destructor. -// delete_on_destroy = false (non-default) +// ownership = WIDGET_OWNS_NATIVE_WIDGET (non-default) // The Widget instance owns its NativeWidget. This state implies someone // else wants to control the lifetime of this object. When they destroy // the Widget it is responsible for destroying the NativeWidget (from its @@ -80,6 +80,15 @@ class Widget : public internal::NativeWidgetDelegate, TYPE_MENU // An undecorated Window, with transient properties // specialized to menus. }; + enum Ownership { + // Default. Creator is not responsible for managing the lifetime of the + // Widget, it is destroyed when the corresponding NativeWidget is + // destroyed. + NATIVE_WIDGET_OWNS_WIDGET, + // Used when the Widget is owned by someone other than the NativeWidget, + // e.g. a scoped_ptr in tests. + WIDGET_OWNS_NATIVE_WIDGET + }; InitParams(); explicit InitParams(Type type); @@ -91,14 +100,18 @@ class Widget : public internal::NativeWidgetDelegate, bool accept_events; bool can_activate; bool keep_on_top; - bool delete_on_destroy; + Ownership ownership; bool mirror_origin_in_rtl; bool has_dropshadow; // Should the widget be double buffered? Default is false. bool double_buffer; gfx::NativeView parent; Widget* parent_widget; + // Specifies the initial bounds of the Widget. Default is empty, which means + // the NativeWidget may specify a default size. gfx::Rect bounds; + // When set, this value is used as the Widget's NativeWidget implementation. + // The Widget will not construct a default one. Default is NULL. NativeWidget* native_widget; }; static InitParams WindowInitParams(); @@ -400,7 +413,7 @@ class Widget : public internal::NativeWidgetDelegate, scoped_refptr<ui::Compositor> compositor_; // See class documentation for Widget above for a note about ownership. - bool delete_on_destroy_; + InitParams::Ownership ownership_; // See set_is_secondary_widget(). bool is_secondary_widget_; |