summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
authorben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-25 19:09:41 +0000
committerben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-05-25 19:09:41 +0000
commit51620d0b22f462ec2290d3426e010b476690c924 (patch)
treeecc8b72cbd5c31d12ff73b46957e1bb93e4eed77 /views
parente20d693415d52499e9d4ae9c9e394a3c0123dd99 (diff)
downloadchromium_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.cc2
-rw-r--r--views/view_unittest.cc10
-rw-r--r--views/widget/native_widget_gtk.cc11
-rw-r--r--views/widget/native_widget_gtk.h2
-rw-r--r--views/widget/native_widget_test_utils_gtk.cc4
-rw-r--r--views/widget/native_widget_test_utils_win.cc4
-rw-r--r--views/widget/native_widget_win.cc8
-rw-r--r--views/widget/native_widget_win.h2
-rw-r--r--views/widget/native_widget_win_unittest.cc2
-rw-r--r--views/widget/widget.cc10
-rw-r--r--views/widget/widget.h25
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_;