summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbenwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-13 13:25:43 +0000
committerbenwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-03-13 13:25:43 +0000
commit091489588de414de3a4ffd386895b49808ce8ae9 (patch)
tree5d2b71a06403c8f1d9c5af852611b813081383af
parent8f6af03725c187128d3689614ff22bb8d0477979 (diff)
downloadchromium_src-091489588de414de3a4ffd386895b49808ce8ae9.zip
chromium_src-091489588de414de3a4ffd386895b49808ce8ae9.tar.gz
chromium_src-091489588de414de3a4ffd386895b49808ce8ae9.tar.bz2
Add DCHECK to ensure SetContentsView is not called incorrectlly.
I foolishly did this and it caused a hard to track down crash. BUG=None Review URL: https://chromiumcodereview.appspot.com/12529004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@187851 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ash/extended_desktop_unittest.cc2
-rw-r--r--ui/views/controls/native/native_view_host_aura_unittest.cc1
-rw-r--r--ui/views/controls/native/native_view_host_unittest.cc1
-rw-r--r--ui/views/widget/native_widget_aura_unittest.cc4
-rw-r--r--ui/views/widget/widget.cc10
-rw-r--r--ui/views/widget/widget_unittest.cc26
6 files changed, 28 insertions, 16 deletions
diff --git a/ash/extended_desktop_unittest.cc b/ash/extended_desktop_unittest.cc
index d69a918..45d01ed 100644
--- a/ash/extended_desktop_unittest.cc
+++ b/ash/extended_desktop_unittest.cc
@@ -696,7 +696,7 @@ TEST_F(ExtendedDesktopTest, KeyEventsOnLockScreen) {
views::Widget* lock_widget = CreateTestWidget(
Shell::GetScreen()->GetPrimaryDisplay().bounds());
views::Textfield* textfield = new views::Textfield;
- lock_widget->SetContentsView(textfield);
+ lock_widget->client_view()->AddChildView(textfield);
ash::Shell::GetContainer(
Shell::GetPrimaryRootWindow(),
diff --git a/ui/views/controls/native/native_view_host_aura_unittest.cc b/ui/views/controls/native/native_view_host_aura_unittest.cc
index e18b224..3099932 100644
--- a/ui/views/controls/native/native_view_host_aura_unittest.cc
+++ b/ui/views/controls/native/native_view_host_aura_unittest.cc
@@ -34,7 +34,6 @@ class NativeViewHostAuraTest : public ViewsTestBase {
CreateParams(Widget::InitParams::TYPE_WINDOW);
toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
toplevel_->Init(toplevel_params);
- toplevel_->SetContentsView(new View);
// And the child widget.
View* test_view = new View;
diff --git a/ui/views/controls/native/native_view_host_unittest.cc b/ui/views/controls/native/native_view_host_unittest.cc
index ba31db1d..db8dd45 100644
--- a/ui/views/controls/native/native_view_host_unittest.cc
+++ b/ui/views/controls/native/native_view_host_unittest.cc
@@ -82,7 +82,6 @@ TEST_F(NativeViewHostTest, NativeViewHierarchyChanged) {
CreateParams(Widget::InitParams::TYPE_WINDOW);
toplevel_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
toplevel->Init(toplevel_params);
- toplevel->SetContentsView(new View);
// And the child widget.
NativeViewHierarchyChangedTestView* test_view =
diff --git a/ui/views/widget/native_widget_aura_unittest.cc b/ui/views/widget/native_widget_aura_unittest.cc
index f8eb67f..ae236eb 100644
--- a/ui/views/widget/native_widget_aura_unittest.cc
+++ b/ui/views/widget/native_widget_aura_unittest.cc
@@ -247,7 +247,7 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
view->SetLayoutManager(new FillLayout);
view->AddChildView(child);
scoped_ptr<TestWidget> widget(new TestWidget());
- Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
params.bounds = gfx::Rect(0, 0, 100, 200);
@@ -283,7 +283,7 @@ TEST_F(NativeWidgetAuraTest, DontCaptureOnGesture) {
TEST_F(NativeWidgetAuraTest, ReleaseCaptureOnTouchRelease) {
GestureTrackingView* view = new GestureTrackingView();
scoped_ptr<TestWidget> widget(new TestWidget());
- Widget::InitParams params(Widget::InitParams::TYPE_WINDOW);
+ Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
params.context = root_window();
params.bounds = gfx::Rect(0, 0, 100, 200);
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc
index 65c65da..394715d 100644
--- a/ui/views/widget/widget.cc
+++ b/ui/views/widget/widget.cc
@@ -452,8 +452,16 @@ void Widget::SetContentsView(View* view) {
if (view == GetContentsView())
return;
root_view_->SetContentsView(view);
- if (non_client_view_ != view)
+ if (non_client_view_ != view) {
+ // |non_client_view_| can only be non-NULL here if RequiresNonClientView()
+ // was true when the widget was initialized. Creating widgets with non
+ // client views and then setting the contents view can cause subtle
+ // problems on Windows, where the native widget thinks there is still a
+ // |non_client_view_|. If you get this error, either use a different type
+ // when initializing the widget, or don't call SetContentsView().
+ DCHECK(!non_client_view_);
non_client_view_ = NULL;
+ }
}
View* Widget::GetContentsView() {
diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc
index db0e876..445c2af 100644
--- a/ui/views/widget/widget_unittest.cc
+++ b/ui/views/widget/widget_unittest.cc
@@ -264,6 +264,15 @@ class WidgetTest : public ViewsTestBase {
return toplevel;
}
+ Widget* CreateTopLevelFramelessPlatformWidget() {
+ Widget* toplevel = new Widget;
+ Widget::InitParams toplevel_params =
+ CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
+ toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel);
+ toplevel->Init(toplevel_params);
+ return toplevel;
+ }
+
Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view) {
Widget* child = new Widget;
Widget::InitParams child_params =
@@ -295,7 +304,6 @@ class WidgetTest : public ViewsTestBase {
Widget* toplevel = new Widget;
Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW);
toplevel->Init(params);
- toplevel->SetContentsView(new View);
return toplevel;
}
@@ -992,12 +1000,10 @@ TEST_F(WidgetObserverTest, DISABLED_VisibilityChange) {
TEST_F(WidgetObserverTest, DestroyBubble) {
Widget* anchor = CreateTopLevelPlatformWidget();
- View* view = new View;
- anchor->SetContentsView(view);
anchor->Show();
BubbleDelegateView* bubble_delegate =
- new BubbleDelegateView(view, BubbleBorder::NONE);
+ new BubbleDelegateView(anchor->client_view(), BubbleBorder::NONE);
Widget* bubble_widget(BubbleDelegateView::CreateBubble(bubble_delegate));
bubble_widget->Show();
bubble_widget->CloseNow();
@@ -1093,7 +1099,7 @@ TEST_F(WidgetTest, ExitFullscreenRestoreState) {
}
TEST_F(WidgetTest, ResetCaptureOnGestureEnd) {
- Widget* toplevel = CreateTopLevelPlatformWidget();
+ Widget* toplevel = CreateTopLevelFramelessPlatformWidget();
View* container = new View;
toplevel->SetContentsView(container);
@@ -1120,6 +1126,7 @@ TEST_F(WidgetTest, ResetCaptureOnGestureEnd) {
// Now try to click on |mouse|. Since |gesture| will have capture, |mouse|
// will not receive the event.
gfx::Point click_location(45, 15);
+
ui::MouseEvent press(ui::ET_MOUSE_PRESSED, click_location, click_location,
ui::EF_LEFT_MOUSE_BUTTON);
ui::MouseEvent release(ui::ET_MOUSE_RELEASED, click_location, click_location,
@@ -1146,8 +1153,7 @@ TEST_F(WidgetTest, ResetCaptureOnGestureEnd) {
// aura.
TEST_F(WidgetTest, KeyboardInputEvent) {
Widget* toplevel = CreateTopLevelPlatformWidget();
- View* container = new View;
- toplevel->SetContentsView(container);
+ View* container = toplevel->client_view();
Textfield* textfield = new Textfield();
textfield->SetText(ASCIIToUTF16("some text"));
@@ -1173,7 +1179,7 @@ TEST_F(WidgetTest, FocusChangesOnBubble) {
contents_view->set_focusable(true);
Widget widget;
Widget::InitParams init_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW);
+ CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
init_params.bounds = gfx::Rect(0, 0, 200, 200);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
#if !defined(OS_CHROMEOS)
@@ -1256,7 +1262,7 @@ TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterCloseTest) {
contents_view->set_focusable(true);
DesktopAuraTestValidPaintWidget widget;
Widget::InitParams init_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW);
+ CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
init_params.bounds = gfx::Rect(0, 0, 200, 200);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.native_widget = new DesktopNativeWidgetAura(&widget);
@@ -1276,7 +1282,7 @@ TEST_F(WidgetTest, DesktopNativeWidgetAuraNoPaintAfterHideTest) {
contents_view->set_focusable(true);
DesktopAuraTestValidPaintWidget widget;
Widget::InitParams init_params =
- CreateParams(Widget::InitParams::TYPE_WINDOW);
+ CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS);
init_params.bounds = gfx::Rect(0, 0, 200, 200);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
init_params.native_widget = new DesktopNativeWidgetAura(&widget);