diff options
author | tapted <tapted@chromium.org> | 2015-04-10 18:25:46 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-11 01:27:04 +0000 |
commit | a473689bf790b2622ccd5c220695c74f76779cdb (patch) | |
tree | 310f37b85a767516f49e90dc0ce47e679189d35b /ui/views | |
parent | f8bbca92938bf5216257f6fd64f50f41bfcb61c5 (diff) | |
download | chromium_src-a473689bf790b2622ccd5c220695c74f76779cdb.zip chromium_src-a473689bf790b2622ccd5c220695c74f76779cdb.tar.gz chromium_src-a473689bf790b2622ccd5c220695c74f76779cdb.tar.bz2 |
MacViews: Implement NativeWidgetMac::GetWindowPlacement, add WidgetTest
GetWindowPlacement was previously NOTIMPLEMENTED().
It needed test coverage, so a cross-platform test is added. Add
WidgetTest::CreateNativeDesktopWidget() for this which creates *desktop*
widgets everywhere except ChromeOS. This makes the tests more
interesting by using DesktopWindowTreeHosts on Windows and (eventually)
Linux. Currently most WidgetTests just use NativeWidgetAuras or #ifdef
!OS_CHROMEOS to test desktop widgets. This approach is neater and helps
retain test coverage once DesktopWindowTreeHostMac appears.
Adds WidgetTest.GetWindowPlacement which works as-advertised on
MacViews. The test still runs everywhere, but has some special
traps on every other platform. Document them.
BUG=454698, 475813
Review URL: https://codereview.chromium.org/1072713002
Cr-Commit-Position: refs/heads/master@{#324742}
Diffstat (limited to 'ui/views')
-rw-r--r-- | ui/views/test/widget_test.cc | 54 | ||||
-rw-r--r-- | ui/views/test/widget_test.h | 17 | ||||
-rw-r--r-- | ui/views/widget/native_widget_mac.h | 2 | ||||
-rw-r--r-- | ui/views/widget/native_widget_mac.mm | 13 | ||||
-rw-r--r-- | ui/views/widget/widget_unittest.cc | 72 |
5 files changed, 124 insertions, 34 deletions
diff --git a/ui/views/test/widget_test.cc b/ui/views/test/widget_test.cc index 4f2705d..57fc8c3 100644 --- a/ui/views/test/widget_test.cc +++ b/ui/views/test/widget_test.cc @@ -9,6 +9,22 @@ namespace views { namespace test { +namespace { + +// Helper to encapsulate common parts of the WidgetTest::Create* methods, +template <class NativeWidgetType> +Widget* CreateHelper(Widget::InitParams params) { + Widget* widget = new Widget; + params.native_widget = new NativeWidgetType(widget); + widget->Init(params); + return widget; +} + +Widget* CreateHelper(Widget::InitParams params) { + return CreateHelper<NativeWidgetCapture>(params); +} + +} // namespace // A widget that assumes mouse capture always works. It won't in testing, so we // mock it. @@ -36,37 +52,19 @@ bool NativeWidgetCapture::HasCapture() const { WidgetTest::WidgetTest() {} WidgetTest::~WidgetTest() {} -NativeWidget* WidgetTest::CreatePlatformNativeWidget( - internal::NativeWidgetDelegate* delegate) { - return new NativeWidgetCapture(delegate); -} - Widget* WidgetTest::CreateTopLevelPlatformWidget() { - Widget* toplevel = new Widget; - Widget::InitParams toplevel_params = - CreateParams(Widget::InitParams::TYPE_WINDOW); - toplevel_params.native_widget = CreatePlatformNativeWidget(toplevel); - toplevel->Init(toplevel_params); - return toplevel; + return CreateHelper(CreateParams(Widget::InitParams::TYPE_WINDOW)); } Widget* WidgetTest::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; + return CreateHelper(CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS)); } Widget* WidgetTest::CreateChildPlatformWidget( gfx::NativeView parent_native_view) { - Widget* child = new Widget; - Widget::InitParams child_params = - CreateParams(Widget::InitParams::TYPE_CONTROL); - child_params.native_widget = CreatePlatformNativeWidget(child); - child_params.parent = parent_native_view; - child->Init(child_params); + Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_CONTROL); + params.parent = parent_native_view; + Widget* child = CreateHelper(params); child->SetContentsView(new View); return child; } @@ -91,6 +89,16 @@ Widget* WidgetTest::CreateChildNativeWidget() { return CreateChildNativeWidgetWithParent(NULL); } +Widget* WidgetTest::CreateNativeDesktopWidget() { +#if defined(OS_CHROMEOS) + return CreateHelper<PlatformNativeWidget>( + CreateParams(Widget::InitParams::TYPE_WINDOW)); +#else + return CreateHelper<PlatformDesktopNativeWidget>( + CreateParams(Widget::InitParams::TYPE_WINDOW)); +#endif +} + View* WidgetTest::GetMousePressedHandler(internal::RootView* root_view) { return root_view->mouse_pressed_handler_; } diff --git a/ui/views/test/widget_test.h b/ui/views/test/widget_test.h index c4bfce6..e820191 100644 --- a/ui/views/test/widget_test.h +++ b/ui/views/test/widget_test.h @@ -81,21 +81,24 @@ class WidgetTest : public ViewsTestBase { WidgetTest(); ~WidgetTest() override; - NativeWidget* CreatePlatformNativeWidget( - internal::NativeWidgetDelegate* delegate); - + // Create Widgets with |native_widget| in InitParams set to an instance of + // test::NativeWidgetCapture. Widget* CreateTopLevelPlatformWidget(); - Widget* CreateTopLevelFramelessPlatformWidget(); - Widget* CreateChildPlatformWidget(gfx::NativeView parent_native_view); + // Create Widgets initialized without a |native_widget| set in InitParams. + // Depending on the test environment, ViewsDelegate::OnBeforeWidgetInit() may + // still provide one. Widget* CreateTopLevelNativeWidget(); - Widget* CreateChildNativeWidgetWithParent(Widget* parent); - Widget* CreateChildNativeWidget(); + // Create a top-level Widget with |native_widget| in InitParams set to an + // instance of the "native desktop" type. This is a PlatformNativeWidget on + // ChromeOS, and a PlatformDesktopNativeWidget everywhere else. + Widget* CreateNativeDesktopWidget(); + View* GetMousePressedHandler(internal::RootView* root_view); View* GetMouseMoveHandler(internal::RootView* root_view); diff --git a/ui/views/widget/native_widget_mac.h b/ui/views/widget/native_widget_mac.h index e8bdf28..1481ec5 100644 --- a/ui/views/widget/native_widget_mac.h +++ b/ui/views/widget/native_widget_mac.h @@ -57,7 +57,7 @@ class VIEWS_EXPORT NativeWidgetMac : public internal::NativeWidgetPrivate { ui::InputMethod* GetHostInputMethod() override; void CenterWindow(const gfx::Size& size) override; void GetWindowPlacement(gfx::Rect* bounds, - ui::WindowShowState* maximized) const override; + ui::WindowShowState* show_state) const override; bool SetWindowTitle(const base::string16& title) override; void SetWindowIcons(const gfx::ImageSkia& window_icon, const gfx::ImageSkia& app_icon) override; diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 16705e3..8c3daaf 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm @@ -213,9 +213,16 @@ void NativeWidgetMac::CenterWindow(const gfx::Size& size) { [GetNativeWindow() center]; } -void NativeWidgetMac::GetWindowPlacement(gfx::Rect* bounds, - ui::WindowShowState* maximized) const { - NOTIMPLEMENTED(); +void NativeWidgetMac::GetWindowPlacement( + gfx::Rect* bounds, + ui::WindowShowState* show_state) const { + *bounds = GetRestoredBounds(); + if (IsFullscreen()) + *show_state = ui::SHOW_STATE_FULLSCREEN; + else if (IsMinimized()) + *show_state = ui::SHOW_STATE_MINIMIZED; + else + *show_state = ui::SHOW_STATE_NORMAL; } bool NativeWidgetMac::SetWindowTitle(const base::string16& title) { diff --git a/ui/views/widget/widget_unittest.cc b/ui/views/widget/widget_unittest.cc index 1c5f67b..be4c1df 100644 --- a/ui/views/widget/widget_unittest.cc +++ b/ui/views/widget/widget_unittest.cc @@ -1045,6 +1045,78 @@ TEST_F(WidgetObserverTest, ClosingOnHiddenParent) { parent->CloseNow(); } +// Test behavior of NativeWidget*::GetWindowPlacement on the native desktop. +TEST_F(WidgetTest, GetWindowPlacement) { + Widget* widget; +#if defined(OS_LINUX) && !defined(OS_CHROMEOS) + // On desktop-Linux cheat and use non-desktop widgets. On X11, minimize is + // asynchronous. Also (harder) showing a window doesn't activate it without + // user interaction (or extra steps only done for interactive ui tests). + // Without that, show_state remains in ui::SHOW_STATE_INACTIVE throughout. + // TODO(tapted): Find a nice way to run this with desktop widgets on Linux. + widget = CreateTopLevelPlatformWidget(); +#else + widget = CreateNativeDesktopWidget(); +#endif + + gfx::Rect expected_bounds(100, 110, 200, 220); + widget->SetBounds(expected_bounds); + widget->Show(); + + // Start with something invalid to ensure it changes. + ui::WindowShowState show_state = ui::SHOW_STATE_END; + gfx::Rect restored_bounds; + + internal::NativeWidgetPrivate* native_widget = + widget->native_widget_private(); + + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + EXPECT_EQ(expected_bounds, restored_bounds); +#if defined(OS_LINUX) + // Non-desktop/Ash widgets start off in "default" until a Restore(). + EXPECT_EQ(ui::SHOW_STATE_DEFAULT, show_state); + widget->Restore(); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); +#endif + EXPECT_EQ(ui::SHOW_STATE_NORMAL, show_state); + + widget->Minimize(); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + EXPECT_EQ(ui::SHOW_STATE_MINIMIZED, show_state); + EXPECT_EQ(expected_bounds, restored_bounds); + + widget->Restore(); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, show_state); + EXPECT_EQ(expected_bounds, restored_bounds); + + expected_bounds = gfx::Rect(130, 140, 230, 250); + widget->SetBounds(expected_bounds); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, show_state); + EXPECT_EQ(expected_bounds, restored_bounds); + + widget->SetFullscreen(true); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + +#if defined(OS_WIN) + // Desktop Aura widgets on Windows currently don't update show_state when + // going fullscreen, and report restored_bounds as the full screen size. + // See http://crbug.com/475813. + EXPECT_EQ(ui::SHOW_STATE_NORMAL, show_state); +#else + EXPECT_EQ(ui::SHOW_STATE_FULLSCREEN, show_state); + EXPECT_EQ(expected_bounds, restored_bounds); +#endif + + widget->SetFullscreen(false); + native_widget->GetWindowPlacement(&restored_bounds, &show_state); + EXPECT_EQ(ui::SHOW_STATE_NORMAL, show_state); + EXPECT_EQ(expected_bounds, restored_bounds); + + widget->CloseNow(); +} + // Tests that SetBounds() and GetWindowBoundsInScreen() is symmetric when the // widget is visible and not maximized or fullscreen. TEST_F(WidgetTest, GetWindowBoundsInScreen) { |