diff options
author | benwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 13:25:43 +0000 |
---|---|---|
committer | benwells@chromium.org <benwells@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-13 13:25:43 +0000 |
commit | 091489588de414de3a4ffd386895b49808ce8ae9 (patch) | |
tree | 5d2b71a06403c8f1d9c5af852611b813081383af | |
parent | 8f6af03725c187128d3689614ff22bb8d0477979 (diff) | |
download | chromium_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.cc | 2 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_aura_unittest.cc | 1 | ||||
-rw-r--r-- | ui/views/controls/native/native_view_host_unittest.cc | 1 | ||||
-rw-r--r-- | ui/views/widget/native_widget_aura_unittest.cc | 4 | ||||
-rw-r--r-- | ui/views/widget/widget.cc | 10 | ||||
-rw-r--r-- | ui/views/widget/widget_unittest.cc | 26 |
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); |