| // Copyright 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <windows.h> |
| |
| #include "base/macros.h" |
| #include "base/run_loop.h" |
| #include "chrome/browser/ui/browser_commands.h" |
| #include "chrome/test/base/in_process_browser_test.h" |
| #include "ui/base/test/ui_controls.h" |
| #include "ui/display/display.h" |
| #include "ui/display/screen.h" |
| #include "ui/gfx/geometry/point.h" |
| #include "ui/gfx/geometry/rect.h" |
| |
| class SendMouseMoveUITest : public InProcessBrowserTest { |
| protected: |
| SendMouseMoveUITest() = default; |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(SendMouseMoveUITest); |
| }; |
| |
| // This test positions the mouse at every point on the screen. It is not meant |
| // to be run on the bots, as it takes too long. Run it manually as needed to |
| // verify ui_controls::SendMouseMoveNotifyWhenDone with: |
| // interactive_ui_tests.exe --single_process --gtest_also_run_disabled_tests \ |
| // --gtest_filter=SendMouseMoveUITest.DISABLED_Fullscreen |
| IN_PROC_BROWSER_TEST_F(SendMouseMoveUITest, DISABLED_Fullscreen) { |
| // Make the browser fullscreen so that we can position the mouse anywhere on |
| // the display, as ui_controls::SendMouseMoveNotifyWhenDone can only provide |
| // notifications when the mouse is moved over a window belonging to the |
| // current process. |
| chrome::ToggleFullscreenMode(browser()); |
| |
| display::Screen* const screen = display::Screen::GetScreen(); |
| const gfx::Rect screen_bounds = screen->GetPrimaryDisplay().bounds(); |
| for (long scan_y = screen_bounds.y(), |
| bound_y = scan_y + screen_bounds.height(); |
| scan_y < bound_y; ++scan_y) { |
| for (long scan_x = screen_bounds.x(), |
| bound_x = scan_x + screen_bounds.width(); |
| scan_x < bound_x; ++scan_x) { |
| SCOPED_TRACE(testing::Message() |
| << "(" << scan_x << ", " << scan_y << ")"); |
| // Move the pointer. |
| base::RunLoop run_loop; |
| EXPECT_TRUE(ui_controls::SendMouseMoveNotifyWhenDone( |
| scan_x, scan_y, run_loop.QuitClosure())); |
| run_loop.Run(); |
| |
| // Check it. |
| EXPECT_EQ(screen->GetCursorScreenPoint(), gfx::Point(scan_x, scan_y)); |
| } |
| } |
| } |
| |
| // Test that the mouse can be positioned at a few locations on the screen. |
| IN_PROC_BROWSER_TEST_F(SendMouseMoveUITest, Probe) { |
| // Make the browser fullscreen so that we can position the mouse anywhere on |
| // the display, as ui_controls::SendMouseMoveNotifyWhenDone can only provide |
| // notifications when the mouse is moved over a window belonging to the |
| // current process. |
| chrome::ToggleFullscreenMode(browser()); |
| |
| display::Screen* const screen = display::Screen::GetScreen(); |
| const gfx::Rect screen_bounds = screen->GetPrimaryDisplay().bounds(); |
| |
| // Position the mouse at the corners and the center. |
| const gfx::Point kPoints[] = { |
| screen_bounds.origin(), |
| gfx::Point(screen_bounds.right() - 1, screen_bounds.y()), |
| gfx::Point(screen_bounds.x(), screen_bounds.bottom() - 1), |
| gfx::Point(screen_bounds.right() - 1, screen_bounds.bottom() - 1), |
| screen_bounds.CenterPoint()}; |
| |
| for (const auto& point : kPoints) { |
| SCOPED_TRACE(testing::Message() |
| << "(" << point.x() << ", " << point.y() << ")"); |
| // Move the pointer. |
| base::RunLoop run_loop; |
| EXPECT_TRUE(ui_controls::SendMouseMoveNotifyWhenDone( |
| point.x(), point.y(), run_loop.QuitClosure())); |
| run_loop.Run(); |
| |
| // Check it. |
| EXPECT_EQ(screen->GetCursorScreenPoint(), point); |
| } |
| } |