summaryrefslogtreecommitdiffstats
path: root/ui/views
diff options
context:
space:
mode:
authortapted <tapted@chromium.org>2015-04-10 18:25:46 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-11 01:27:04 +0000
commita473689bf790b2622ccd5c220695c74f76779cdb (patch)
tree310f37b85a767516f49e90dc0ce47e679189d35b /ui/views
parentf8bbca92938bf5216257f6fd64f50f41bfcb61c5 (diff)
downloadchromium_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.cc54
-rw-r--r--ui/views/test/widget_test.h17
-rw-r--r--ui/views/widget/native_widget_mac.h2
-rw-r--r--ui/views/widget/native_widget_mac.mm13
-rw-r--r--ui/views/widget/widget_unittest.cc72
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) {