Index: ash/display/display_controller_unittest.cc |
diff --git a/ash/display/display_controller_unittest.cc b/ash/display/display_controller_unittest.cc |
index d298eee41796e40011fd47ab153dbefa49cf34e8..a753d1b9bcf246602c9cfba62f702f4dfef71ea2 100644 |
--- a/ash/display/display_controller_unittest.cc |
+++ b/ash/display/display_controller_unittest.cc |
@@ -961,61 +961,6 @@ TEST_F(DisplayControllerTest, SwapPrimaryById) { |
EXPECT_TRUE(primary_root->Contains(shelf_window)); |
} |
-TEST_F(DisplayControllerTest, CursorDeviceScaleFactorSwapPrimary) { |
- if (!SupportsMultipleDisplays()) |
- return; |
- |
- DisplayController* display_controller = |
- Shell::GetInstance()->display_controller(); |
- |
- UpdateDisplay("200x200,200x200*2"); |
- gfx::Display primary_display = Shell::GetScreen()->GetPrimaryDisplay(); |
- gfx::Display secondary_display = ScreenUtil::GetSecondaryDisplay(); |
- |
- aura::Window* primary_root = |
- display_controller->GetRootWindowForDisplayId(primary_display.id()); |
- aura::Window* secondary_root = |
- display_controller->GetRootWindowForDisplayId(secondary_display.id()); |
- EXPECT_NE(primary_root, secondary_root); |
- |
- test::CursorManagerTestApi test_api(Shell::GetInstance()->cursor_manager()); |
- |
- EXPECT_EQ(1.0f, primary_root->GetHost()->compositor()-> |
- device_scale_factor()); |
- primary_root->MoveCursorTo(gfx::Point(50, 50)); |
- EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
- EXPECT_EQ(2.0f, secondary_root->GetHost()->compositor()-> |
- device_scale_factor()); |
- secondary_root->MoveCursorTo(gfx::Point(50, 50)); |
- EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor()); |
- |
- // Switch primary and secondary |
- display_controller->SetPrimaryDisplay(secondary_display); |
- |
- // Cursor's device scale factor should be updated accroding to the swap of |
- // primary and secondary. |
- EXPECT_EQ(1.0f, secondary_root->GetHost()->compositor()-> |
- device_scale_factor()); |
- secondary_root->MoveCursorTo(gfx::Point(50, 50)); |
- EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
- primary_root->MoveCursorTo(gfx::Point(50, 50)); |
- EXPECT_EQ(2.0f, primary_root->GetHost()->compositor()-> |
- device_scale_factor()); |
- EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor()); |
- |
- // Deleting 2nd display. |
- UpdateDisplay("200x200"); |
- RunAllPendingInMessageLoop(); // RootWindow is deleted in a posted task. |
- |
- // Cursor's device scale factor should be updated even without moving cursor. |
- EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
- |
- primary_root->MoveCursorTo(gfx::Point(50, 50)); |
- EXPECT_EQ(1.0f, primary_root->GetHost()->compositor()-> |
- device_scale_factor()); |
- EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
-} |
- |
TEST_F(DisplayControllerTest, OverscanInsets) { |
if (!SupportsMultipleDisplays()) |
return; |
@@ -1374,4 +1319,145 @@ TEST_F(DisplayControllerTest, XWidowNameForRootWindow) { |
} |
#endif |
+TEST_F(DisplayControllerTest, UpdateMouseLocationAfterDisplayChange) { |
+ if (!SupportsMultipleDisplays()) |
+ return; |
+ |
+ UpdateDisplay("200x200,300x300"); |
+ aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
+ |
+ aura::Env* env = aura::Env::GetInstance(); |
+ |
+ ui::test::EventGenerator generator(root_windows[0]); |
+ |
+ // Set the initial position. |
+ generator.MoveMouseToInHost(350, 150); |
+ EXPECT_EQ("350,150", env->last_mouse_location().ToString()); |
+ |
+ // A mouse pointer will stay in the 2nd display. |
+ UpdateDisplay("300x300,200x200"); |
+ EXPECT_EQ("450,50", env->last_mouse_location().ToString()); |
+ |
+ // A mouse pointer will be outside of displays and move to the |
+ // center of 2nd display. |
+ UpdateDisplay("300x300,100x100"); |
+ EXPECT_EQ("350,50", env->last_mouse_location().ToString()); |
+ |
+ // 2nd display was disconnected, and the cursor is |
+ // now in the 1st display. |
+ UpdateDisplay("400x400"); |
+ EXPECT_EQ("50,350", env->last_mouse_location().ToString()); |
+ |
+ // 1st display's resolution has changed, and the mouse pointer is |
+ // now outside. Move the mouse pointer to the center of 1st display. |
+ UpdateDisplay("300x300"); |
+ EXPECT_EQ("150,150", env->last_mouse_location().ToString()); |
+ |
+ // Move the mouse pointer to the bottom of 1st display. |
+ generator.MoveMouseToInHost(150, 290); |
+ EXPECT_EQ("150,290", env->last_mouse_location().ToString()); |
+ |
+ // The mouse pointer is now on 2nd display. |
+ UpdateDisplay("300x280,200x200"); |
+ EXPECT_EQ("450,10", env->last_mouse_location().ToString()); |
+} |
+ |
+TEST_F(DisplayControllerTest, UpdateMouseLocationAfterDisplayChange_2ndOnLeft) { |
+ if (!SupportsMultipleDisplays()) |
+ return; |
+ |
+ // Set the 2nd display on the left. |
+ DisplayLayoutStore* layout_store = |
+ Shell::GetInstance()->display_manager()->layout_store(); |
+ DisplayLayout layout = layout_store->default_display_layout(); |
+ layout.position = DisplayLayout::LEFT; |
+ layout_store->SetDefaultDisplayLayout(layout); |
+ |
+ UpdateDisplay("200x200,300x300"); |
+ aura::Window::Windows root_windows = Shell::GetAllRootWindows(); |
+ |
+ EXPECT_EQ("-300,0 300x300", |
+ ScreenUtil::GetSecondaryDisplay().bounds().ToString()); |
+ |
+ aura::Env* env = aura::Env::GetInstance(); |
+ |
+ // Set the initial position. |
+ root_windows[0]->MoveCursorTo(gfx::Point(-150, 250)); |
+ EXPECT_EQ("-150,250", env->last_mouse_location().ToString()); |
+ |
+ // A mouse pointer will stay in 2nd display. |
+ UpdateDisplay("300x300,200x300"); |
+ EXPECT_EQ("-50,150", env->last_mouse_location().ToString()); |
+ |
+ // A mouse pointer will be outside of displays and move to the |
+ // center of 2nd display. |
+ UpdateDisplay("300x300,200x100"); |
+ EXPECT_EQ("-100,50", env->last_mouse_location().ToString()); |
+ |
+ // 2nd display was disconnected. Mouse pointer should move to |
+ // 1st display. |
+ UpdateDisplay("300x300"); |
+ EXPECT_EQ("150,150", env->last_mouse_location().ToString()); |
+} |
+ |
+// Test that the cursor swaps displays and that its scale factor and rotation |
+// are updated when the primary display is swapped. |
+TEST_F(DisplayControllerTest, |
+ UpdateMouseLocationAfterDisplayChange_SwapPrimary) { |
+ if (!SupportsMultipleDisplays()) |
+ return; |
+ |
+ UpdateDisplay("200x200,200x200*2/r"); |
+ |
+ aura::Env* env = aura::Env::GetInstance(); |
+ Shell* shell = Shell::GetInstance(); |
+ DisplayController* display_controller = shell->display_controller(); |
+ test::CursorManagerTestApi test_api(shell->cursor_manager()); |
+ |
+ display_controller->GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(20, 50)); |
+ |
+ EXPECT_EQ("20,50", env->last_mouse_location().ToString()); |
+ EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_0, test_api.GetCurrentCursorRotation()); |
+ |
+ display_controller->SwapPrimaryDisplay(); |
+ |
+ EXPECT_EQ("20,50", env->last_mouse_location().ToString()); |
+ EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_90, test_api.GetCurrentCursorRotation()); |
+} |
+ |
+// Test that the cursor moves to the other display and that its scale factor |
+// and rotation are updated when the primary display is disconnected. |
+TEST_F(DisplayControllerTest, |
+ UpdateMouseLocationAfterDisplayChange_PrimaryDisconnected) { |
+ if (!SupportsMultipleDisplays()) |
+ return; |
+ |
+ aura::Env* env = aura::Env::GetInstance(); |
+ Shell* shell = Shell::GetInstance(); |
+ DisplayController* display_controller = shell->display_controller(); |
+ test::CursorManagerTestApi test_api(shell->cursor_manager()); |
+ |
+ UpdateDisplay("300x300*2/r,200x200"); |
+ // Swap the primary display to make it possible to remove the primary display |
+ // via UpdateDisplay(). |
+ display_controller->SwapPrimaryDisplay(); |
+ int primary_display_id = display_controller->GetPrimaryDisplayId(); |
+ |
+ display_controller->GetPrimaryRootWindow()->MoveCursorTo(gfx::Point(20, 50)); |
+ |
+ EXPECT_EQ("20,50", env->last_mouse_location().ToString()); |
+ EXPECT_EQ(1.0f, test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_0, test_api.GetCurrentCursorRotation()); |
+ |
+ UpdateDisplay("300x300*2/r"); |
+ ASSERT_NE(primary_display_id, display_controller->GetPrimaryDisplayId()); |
+ |
+ // Cursor should be centered on the remaining display. |
+ EXPECT_EQ("75,75", env->last_mouse_location().ToString()); |
+ EXPECT_EQ(2.0f, test_api.GetCurrentCursor().device_scale_factor()); |
+ EXPECT_EQ(gfx::Display::ROTATE_90, test_api.GetCurrentCursorRotation()); |
+} |
+ |
} // namespace ash |