Index: ash/display/mirror_window_controller_unittest.cc |
diff --git a/ash/display/mirror_window_controller_unittest.cc b/ash/display/mirror_window_controller_unittest.cc |
index 06e233eb86eb692c20b17ab575e20d7c3c51f466..15bdefaf5871fa086d2ac579464c12ded8976377 100644 |
--- a/ash/display/mirror_window_controller_unittest.cc |
+++ b/ash/display/mirror_window_controller_unittest.cc |
@@ -5,13 +5,17 @@ |
#include "ash/display/mirror_window_controller.h" |
#include "ash/ash_switches.h" |
+#include "ash/display/display_controller.h" |
#include "ash/display/display_manager.h" |
+#include "ash/screen_util.h" |
#include "ash/shell.h" |
#include "ash/test/ash_test_base.h" |
+#include "ash/test/cursor_manager_test_api.h" |
#include "ash/test/display_manager_test_api.h" |
#include "ash/test/mirror_window_test_api.h" |
#include "base/command_line.h" |
#include "base/strings/stringprintf.h" |
+#include "ui/aura/env.h" |
#include "ui/aura/test/test_window_delegate.h" |
#include "ui/aura/test/test_windows.h" |
#include "ui/aura/window.h" |
@@ -54,12 +58,14 @@ typedef test::AshTestBase MirrorWindowControllerTest; |
// Software mirroring does not work on win. |
#define MAYBE_MirrorCursorBasic DISABLED_MirrorCursorBasic |
#define MAYBE_MirrorCursorLocations DISABLED_MirrorCursorLocations |
+#define MAYBE_MirrorCursorMoveOnEnter DISABLED_MirrorCursorMoveOnEnter |
#define MAYBE_MirrorCursorRotate DISABLED_MirrorCursorRotate |
#define MAYBE_DockMode DISABLED_DockMode |
#define MAYBE_MirrorOnBoot DISABLED_MirrorOnBoot |
#else |
#define MAYBE_MirrorCursorBasic MirrorCursorBasic |
#define MAYBE_MirrorCursorLocations MirrorCursorLocations |
+#define MAYBE_MirrorCursorMoveOnEnter MirrorCursorMoveOnEnter |
#define MAYBE_MirrorCursorRotate MirrorCursorRotate |
#define MAYBE_DockMode DockMode |
#define MAYBE_MirrorOnBoot MirrorOnBoot |
@@ -89,21 +95,16 @@ TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorBasic) { |
generator.MoveMouseTo(10, 10); |
// Test if cursor movement is propertly reflected in mirror window. |
- gfx::Point hot_point = test_api.GetCursorHotPoint(); |
- gfx::Point cursor_window_origin = |
- test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ("4,4", hot_point.ToString()); |
- EXPECT_EQ(10 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(10 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("4,4", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("10,10", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
EXPECT_EQ(ui::kCursorNull, test_api.GetCurrentCursorType()); |
EXPECT_TRUE(test_api.GetCursorWindow()->IsVisible()); |
// Test if cursor type change is propertly reflected in mirror window. |
generator.MoveMouseTo(100, 100); |
- hot_point = test_api.GetCursorHotPoint(); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ(100 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(100 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("100,100", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType()); |
// Test if visibility change is propertly reflected in mirror window. |
@@ -114,10 +115,8 @@ TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorBasic) { |
// Mouse event makes it visible again. |
generator.MoveMouseTo(300, 300); |
- hot_point = test_api.GetCursorHotPoint(); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ(300 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(300 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("300,300", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
EXPECT_EQ(ui::kCursorNull, test_api.GetCurrentCursorType()); |
EXPECT_TRUE(test_api.GetCursorWindow()->IsVisible()); |
} |
@@ -146,44 +145,35 @@ TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorRotate) { |
generator.MoveMouseToInHost(100, 100); |
// Test if cursor movement is propertly reflected in mirror window. |
- gfx::Point hot_point = test_api.GetCursorHotPoint(); |
- gfx::Point cursor_window_origin = |
- test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ("11,12", hot_point.ToString()); |
- EXPECT_EQ(100 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(100 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("11,12", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("100,100", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType()); |
UpdateDisplay("400x400/r,400x400"); // 90 degrees. |
generator.MoveMouseToInHost(300, 100); |
- hot_point = test_api.GetCursorHotPoint(); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType()); |
// The size of cursor image is 25x25, so the rotated hot point must |
// be (25-12, 11). |
- EXPECT_EQ("13,11", hot_point.ToString()); |
- EXPECT_EQ(300 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(100 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("13,11", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("300,100", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
UpdateDisplay("400x400/u,400x400"); // 180 degrees. |
generator.MoveMouseToInHost(300, 300); |
- hot_point = test_api.GetCursorHotPoint(); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType()); |
// Rotated hot point must be (25-11, 25-12). |
- EXPECT_EQ("14,13", hot_point.ToString()); |
- EXPECT_EQ(300 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(300 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("14,13", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("300,300", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
UpdateDisplay("400x400/l,400x400"); // 270 degrees. |
generator.MoveMouseToInHost(100, 300); |
- hot_point = test_api.GetCursorHotPoint(); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
EXPECT_EQ(ui::kCursorNorthResize, test_api.GetCurrentCursorType()); |
// Rotated hot point must be (12, 25-11). |
- EXPECT_EQ("12,14", hot_point.ToString()); |
- EXPECT_EQ(100 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(300 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("12,14", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("100,300", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
} |
// Make sure that the mirror cursor's location is same as |
@@ -201,32 +191,71 @@ TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorLocations) { |
ui::test::EventGenerator generator(root); |
generator.MoveMouseToInHost(10, 20); |
- gfx::Point hot_point = test_api.GetCursorHotPoint(); |
- EXPECT_EQ("8,9", hot_point.ToString()); |
- gfx::Point cursor_window_origin = |
- test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ(10 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(20 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("8,9", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("10,20", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
// Test with ui scale |
UpdateDisplay("400x600*0.5,400x600"); |
generator.MoveMouseToInHost(20, 30); |
- hot_point = test_api.GetCursorHotPoint(); |
- EXPECT_EQ("4,4", hot_point.ToString()); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ(20 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(30 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("4,4", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("20,30", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
// Test with rotation |
UpdateDisplay("400x600/r,400x600"); |
generator.MoveMouseToInHost(30, 40); |
- hot_point = test_api.GetCursorHotPoint(); |
- EXPECT_EQ("21,4", hot_point.ToString()); |
- cursor_window_origin = test_api.GetCursorWindow()->bounds().origin(); |
- EXPECT_EQ(30 - hot_point.x(), cursor_window_origin.x()); |
- EXPECT_EQ(40 - hot_point.y(), cursor_window_origin.y()); |
+ EXPECT_EQ("21,4", test_api.GetCursorHotPoint().ToString()); |
+ EXPECT_EQ("30,40", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
+} |
+ |
+// Test the behavior of the cursor when entering software mirror mode swaps the |
+// cursor's display. |
+TEST_F(MirrorWindowControllerTest, MAYBE_MirrorCursorMoveOnEnter) { |
+ aura::Env* env = aura::Env::GetInstance(); |
+ Shell* shell = Shell::GetInstance(); |
+ DisplayController* display_controller = shell->display_controller(); |
+ DisplayManager* display_manager = shell->display_manager(); |
+ |
+ UpdateDisplay("400x400*2/r,400x400"); |
+ int64 primary_display_id = display_controller->GetPrimaryDisplayId(); |
+ int64 secondary_display_id = ScreenUtil::GetSecondaryDisplay().id(); |
+ test::DisplayManagerTestApi(display_manager) |
+ .SetInternalDisplayId(primary_display_id); |
+ |
+ // Chrome uses the internal display as the source display for software mirror |
+ // mode. Move the cursor to the external display. |
+ aura::Window* secondary_root_window = |
+ display_controller->GetRootWindowForDisplayId(secondary_display_id); |
+ secondary_root_window->MoveCursorTo(gfx::Point(100, 200)); |
+ EXPECT_EQ("300,200", env->last_mouse_location().ToString()); |
+ test::CursorManagerTestApi cursor_test_api(shell->cursor_manager()); |
+ EXPECT_EQ(1.0f, cursor_test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_0, cursor_test_api.GetCurrentCursorRotation()); |
+ |
+ display_manager->SetSecondDisplayMode(DisplayManager::MIRRORING); |
+ UpdateDisplay("400x400*2/r,400x400"); |
+ |
+ // Entering mirror mode should have centered the cursor on the primary display |
+ // because the cursor's previous position is out of bounds. |
+ // Check real cursor's position and properties. |
+ EXPECT_EQ("100,100", env->last_mouse_location().ToString()); |
+ EXPECT_EQ(2.0f, cursor_test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_90, |
+ cursor_test_api.GetCurrentCursorRotation()); |
+ |
+ // Check mirrored cursor's location. |
+ test::MirrorWindowTestApi test_api; |
+ gfx::Point hot_point = test_api.GetCursorHotPoint(); |
+ // Rotated hot point must be (25-9, 8). |
+ EXPECT_EQ("16,8", test_api.GetCursorHotPoint().ToString()); |
+ // New coordinates are not (200,200) because (200,200) is not the center of |
+ // the display. |
+ EXPECT_EQ("199,200", |
+ test_api.GetCursorHotPointLocationInRootWindow().ToString()); |
} |
// Make sure that the compositor based mirroring can switch |