| // Copyright 2014 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 "ash/utility/partial_screenshot_controller.h" |
| |
| #include "ash/display/cursor_window_controller.h" |
| #include "ash/display/mouse_cursor_event_filter.h" |
| #include "ash/display/window_tree_host_manager.h" |
| #include "ash/screenshot_delegate.h" |
| #include "ash/shell.h" |
| #include "ash/test/ash_test_base.h" |
| #include "ash/test/display_manager_test_api.h" |
| #include "ash/test/mirror_window_test_api.h" |
| #include "ash/test/test_screenshot_delegate.h" |
| #include "ui/aura/env.h" |
| #include "ui/aura/window_event_dispatcher.h" |
| #include "ui/base/cursor/cursor.h" |
| #include "ui/events/test/event_generator.h" |
| #include "ui/wm/core/cursor_manager.h" |
| |
| namespace ash { |
| |
| class PartialScreenshotControllerTest : public test::AshTestBase { |
| public: |
| PartialScreenshotControllerTest() {} |
| ~PartialScreenshotControllerTest() override {} |
| |
| protected: |
| PartialScreenshotController* partial_screenshot_controller() { |
| return Shell::GetInstance()->partial_screenshot_controller(); |
| } |
| |
| bool TestIfMouseWarpsAt(const gfx::Point& point_in_screen) { |
| return test::DisplayManagerTestApi::TestIfMouseWarpsAt(GetEventGenerator(), |
| point_in_screen); |
| } |
| |
| void StartPartialScreenshotSession() { |
| partial_screenshot_controller()->StartPartialScreenshotSession( |
| GetScreenshotDelegate()); |
| } |
| |
| void Cancel() { partial_screenshot_controller()->Cancel(); } |
| |
| bool IsActive() { |
| return partial_screenshot_controller()->screenshot_delegate_ != nullptr; |
| } |
| |
| const gfx::Point& GetStartPosition() const { |
| return Shell::GetInstance() |
| ->partial_screenshot_controller() |
| ->start_position_; |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(PartialScreenshotControllerTest); |
| }; |
| |
| TEST_F(PartialScreenshotControllerTest, BasicMouse) { |
| StartPartialScreenshotSession(); |
| test::TestScreenshotDelegate* test_delegate = GetScreenshotDelegate(); |
| ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); |
| |
| generator.MoveMouseTo(100, 100); |
| generator.PressLeftButton(); |
| EXPECT_EQ("100,100", GetStartPosition().ToString()); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| |
| generator.MoveMouseTo(200, 200); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| |
| generator.ReleaseLeftButton(); |
| EXPECT_EQ("100,100 100x100", GetScreenshotDelegate()->last_rect().ToString()); |
| EXPECT_EQ(1, GetScreenshotDelegate()->handle_take_partial_screenshot_count()); |
| |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| |
| TEST_F(PartialScreenshotControllerTest, JustClick) { |
| StartPartialScreenshotSession(); |
| test::TestScreenshotDelegate* test_delegate = GetScreenshotDelegate(); |
| ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); |
| |
| generator.MoveMouseTo(100, 100); |
| |
| // No moves, just clicking at the same position. |
| generator.ClickLeftButton(); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| |
| TEST_F(PartialScreenshotControllerTest, BasicTouch) { |
| StartPartialScreenshotSession(); |
| test::TestScreenshotDelegate* test_delegate = GetScreenshotDelegate(); |
| ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); |
| |
| generator.set_current_location(gfx::Point(100, 100)); |
| generator.PressTouch(); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| EXPECT_EQ("100,100", GetStartPosition().ToString()); |
| |
| generator.MoveTouch(gfx::Point(200, 200)); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| |
| generator.ReleaseTouch(); |
| EXPECT_EQ("100,100 100x100", GetScreenshotDelegate()->last_rect().ToString()); |
| EXPECT_EQ(1, GetScreenshotDelegate()->handle_take_partial_screenshot_count()); |
| |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| |
| TEST_F(PartialScreenshotControllerTest, TwoFingerTouch) { |
| StartPartialScreenshotSession(); |
| test::TestScreenshotDelegate* test_delegate = GetScreenshotDelegate(); |
| ui::test::EventGenerator generator(Shell::GetPrimaryRootWindow()); |
| |
| generator.set_current_location(gfx::Point(100, 100)); |
| generator.PressTouch(); |
| EXPECT_EQ(0, test_delegate->handle_take_partial_screenshot_count()); |
| EXPECT_EQ("100,100", GetStartPosition().ToString()); |
| |
| generator.set_current_location(gfx::Point(200, 200)); |
| generator.PressTouchId(1); |
| EXPECT_EQ("100,100 100x100", GetScreenshotDelegate()->last_rect().ToString()); |
| EXPECT_EQ(1, GetScreenshotDelegate()->handle_take_partial_screenshot_count()); |
| |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| |
| TEST_F(PartialScreenshotControllerTest, MultipleDisplays) { |
| if (!SupportsMultipleDisplays()) |
| return; |
| |
| StartPartialScreenshotSession(); |
| EXPECT_TRUE(IsActive()); |
| UpdateDisplay("400x400,500x500"); |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| |
| StartPartialScreenshotSession(); |
| EXPECT_TRUE(IsActive()); |
| UpdateDisplay("400x400"); |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| |
| // Make sure PartialScreenshotController doesn't allow taking screenshot |
| // across multiple monitors |
| // cursor. See http://crbug.com/462229 |
| #if defined(OS_CHROMEOS) |
| TEST_F(PartialScreenshotControllerTest, MouseWarpTest) { |
| if (!SupportsMultipleDisplays()) |
| return; |
| |
| // Create two displays. |
| Shell* shell = Shell::GetInstance(); |
| UpdateDisplay("500x500,500x500"); |
| EXPECT_EQ(2U, shell->display_manager()->GetNumDisplays()); |
| |
| StartPartialScreenshotSession(); |
| EXPECT_FALSE(TestIfMouseWarpsAt(gfx::Point(499, 11))); |
| EXPECT_EQ("499,11", |
| aura::Env::GetInstance()->last_mouse_location().ToString()); |
| |
| Cancel(); |
| EXPECT_TRUE(TestIfMouseWarpsAt(gfx::Point(499, 11))); |
| EXPECT_EQ("501,11", |
| aura::Env::GetInstance()->last_mouse_location().ToString()); |
| } |
| |
| TEST_F(PartialScreenshotControllerTest, VisibilityTest) { |
| aura::client::CursorClient* client = Shell::GetInstance()->cursor_manager(); |
| |
| GetEventGenerator().PressKey(ui::VKEY_A, 0); |
| GetEventGenerator().ReleaseKey(ui::VKEY_A, 0); |
| |
| EXPECT_FALSE(client->IsCursorVisible()); |
| |
| StartPartialScreenshotSession(); |
| EXPECT_TRUE(IsActive()); |
| EXPECT_TRUE(client->IsCursorVisible()); |
| |
| Cancel(); |
| EXPECT_TRUE(client->IsCursorVisible()); |
| } |
| |
| // Make sure PartialScreenshotController doesn't prevent handling of large |
| // cursor. See http://crbug.com/459214 |
| TEST_F(PartialScreenshotControllerTest, LargeCursor) { |
| Shell::GetInstance()->cursor_manager()->SetCursorSet(ui::CURSOR_SET_LARGE); |
| Shell::GetInstance() |
| ->window_tree_host_manager() |
| ->cursor_window_controller() |
| ->SetCursorCompositingEnabled(true); |
| |
| // Large cursor is represented as cursor window. |
| test::MirrorWindowTestApi test_api; |
| ASSERT_NE(nullptr, test_api.GetCursorWindow()); |
| |
| ui::test::EventGenerator event_generator(Shell::GetPrimaryRootWindow()); |
| gfx::Point cursor_location; |
| event_generator.MoveMouseTo(cursor_location); |
| EXPECT_EQ(cursor_location.ToString(), |
| test_api.GetCursorLocation().ToString()); |
| |
| StartPartialScreenshotSession(); |
| EXPECT_TRUE(IsActive()); |
| |
| cursor_location += gfx::Vector2d(1, 1); |
| event_generator.MoveMouseTo(cursor_location); |
| EXPECT_EQ(cursor_location.ToString(), |
| test_api.GetCursorLocation().ToString()); |
| |
| event_generator.PressLeftButton(); |
| cursor_location += gfx::Vector2d(5, 5); |
| event_generator.MoveMouseTo(cursor_location); |
| EXPECT_EQ(cursor_location.ToString(), |
| test_api.GetCursorLocation().ToString()); |
| |
| event_generator.ReleaseLeftButton(); |
| |
| EXPECT_EQ(1, GetScreenshotDelegate()->handle_take_partial_screenshot_count()); |
| EXPECT_EQ("1,1 5x5", GetScreenshotDelegate()->last_rect().ToString()); |
| RunAllPendingInMessageLoop(); |
| EXPECT_FALSE(IsActive()); |
| } |
| #endif |
| |
| } // namespace ash |