#include "ash/keyboard/ui/keyboard_ui_controller.h"
#include "ash/keyboard/ui/keyboard_util.h"
#include "ash/keyboard/ui/test/keyboard_test_util.h"
#include "ash/public/cpp/keyboard/keyboard_switches.h"
#include "ash/shell.h"
#include "ash/test/ash_test_base.h"
#include "base/functional/callback_helpers.h"
#include "ui/aura/test/test_window_delegate.h"
#include "ui/events/test/event_generator.h"
namespace ash {
class VirtualKeyboardTest : public AshTestBase {
public:
VirtualKeyboardTest() = default;
VirtualKeyboardTest(const VirtualKeyboardTest&) = delete;
VirtualKeyboardTest& operator=(const VirtualKeyboardTest&) = delete;
~VirtualKeyboardTest() override = default;
void SetUp() override {
AshTestBase::SetUp();
SetVirtualKeyboardEnabled(true);
}
void TearDown() override {
SetVirtualKeyboardEnabled(false);
AshTestBase::TearDown();
}
};
TEST_F(VirtualKeyboardTest, EventsAreHandledBasedOnHitTestBounds) {
aura::Window* root_window = Shell::GetPrimaryRootWindow();
aura::test::EventCountDelegate delegate;
std::unique_ptr<aura::Window> background_window(
CreateTestWindowInShell({.delegate = &delegate,
.bounds = root_window->bounds(),
.window_id = 0}));
auto* keyboard_controller = keyboard::KeyboardUIController::Get();
keyboard_controller->ShowKeyboard(false);
ASSERT_TRUE(keyboard::test::WaitUntilShown());
std::vector<gfx::Rect> hit_test_bounds;
hit_test_bounds.emplace_back(0, 0, 10, 10);
hit_test_bounds.emplace_back(20, 20, 10, 10);
keyboard_controller->SetHitTestBounds(hit_test_bounds);
ui::test::EventGenerator generator(root_window);
const gfx::Point origin =
keyboard_controller->GetVisualBoundsInScreen().origin();
generator.MoveMouseTo(origin);
generator.ClickLeftButton();
EXPECT_EQ("0 0", delegate.GetMouseButtonCountsAndReset());
generator.MoveMouseTo(origin + gfx::Vector2d(25, 25));
generator.ClickLeftButton();
EXPECT_EQ("0 0", delegate.GetMouseButtonCountsAndReset());
generator.MoveMouseTo(origin + gfx::Vector2d(5, 25));
generator.ClickLeftButton();
EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset());
generator.MoveMouseTo(origin + gfx::Vector2d(25, 5));
generator.ClickLeftButton();
EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset());
}
TEST_F(VirtualKeyboardTest, HitTestBoundsAreResetWhenContainerTypeChanges) {
aura::Window* root_window = Shell::GetPrimaryRootWindow();
aura::test::EventCountDelegate delegate;
std::unique_ptr<aura::Window> background_window(
CreateTestWindowInShell({.delegate = &delegate,
.bounds = root_window->bounds(),
.window_id = 0}));
auto* keyboard_controller = keyboard::KeyboardUIController::Get();
keyboard_controller->ShowKeyboard(false);
ASSERT_TRUE(keyboard::test::WaitUntilShown());
keyboard_controller->SetHitTestBounds(std::vector<gfx::Rect>());
ui::test::EventGenerator generator(root_window);
aura::Window* keyboard_window = keyboard_controller->GetKeyboardWindow();
generator.MoveMouseTo(keyboard_window->bounds().origin());
generator.ClickLeftButton();
EXPECT_EQ("1 1", delegate.GetMouseButtonCountsAndReset());
keyboard_controller->HideKeyboardExplicitlyBySystem();
keyboard_controller->SetContainerType(keyboard::ContainerType::kFloating,
gfx::Rect(0, 0, 400, 200),
base::DoNothing());
keyboard_controller->ShowKeyboard(false);
generator.MoveMouseTo(keyboard_window->bounds().origin());
generator.ClickLeftButton();
EXPECT_EQ("0 0", delegate.GetMouseButtonCountsAndReset());
}
}