blob: ca91fc6ccae99c09ab2a205135f167cd2455140d [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ash/accelerators/shortcut_input_handler.h"
#include "ash/public/mojom/input_device_settings.mojom.h"
#include "ash/test/ash_test_base.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/accelerators/ash/quick_insert_event_property.h"
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/dom/dom_code.h"
#include "ui/events/keycodes/keyboard_codes_posix.h"
#include "ui/events/types/event_type.h"
namespace ash {
namespace {
class TestObserver : public ShortcutInputHandler::Observer {
public:
void OnShortcutInputEventPressed(const mojom::KeyEvent& key_event) override {
++num_input_events_pressed_;
}
void OnShortcutInputEventReleased(const mojom::KeyEvent& key_event) override {
++num_input_events_released_;
}
void OnPrerewrittenShortcutInputEventPressed(
const mojom::KeyEvent& key_event) override {
++num_prerewritten_input_events_pressed_;
key_code_ = key_event.vkey;
}
void OnPrerewrittenShortcutInputEventReleased(
const mojom::KeyEvent& key_event) override {
++num_prerewritten_input_events_released_;
}
int num_input_events_pressed() { return num_input_events_pressed_; }
int num_input_events_released() { return num_input_events_released_; }
int num_prerewritten_input_events_pressed() {
return num_prerewritten_input_events_pressed_;
}
int num_prerewritten_input_events_released() {
return num_prerewritten_input_events_released_;
}
ui::KeyboardCode key_code() { return key_code_; }
private:
int num_input_events_pressed_ = 0;
int num_input_events_released_ = 0;
int num_prerewritten_input_events_pressed_ = 0;
int num_prerewritten_input_events_released_ = 0;
ui::KeyboardCode key_code_ = ui::KeyboardCode::VKEY_UNKNOWN;
};
} // namespace
class ShortcutInputHandlerTest : public AshTestBase {
public:
void SetUp() override {
AshTestBase::SetUp();
observer_ = std::make_unique<TestObserver>();
shortcut_input_handler_ = std::make_unique<ShortcutInputHandler>();
shortcut_input_handler_->AddObserver(observer_.get());
}
void TearDown() override {
shortcut_input_handler_->RemoveObserver(observer_.get());
observer_.reset();
shortcut_input_handler_.reset();
AshTestBase::TearDown();
}
protected:
std::unique_ptr<TestObserver> observer_;
std::unique_ptr<ShortcutInputHandler> shortcut_input_handler_;
};
TEST_F(ShortcutInputHandlerTest, ObserverTest) {
ui::KeyEvent pressed_event(ui::EventType::kKeyPressed, ui::VKEY_0,
ui::EF_NONE);
shortcut_input_handler_->OnEvent(&pressed_event);
EXPECT_EQ(1, observer_->num_input_events_pressed());
EXPECT_EQ(0, observer_->num_input_events_released());
ui::KeyEvent released_event(ui::EventType::kKeyReleased, ui::VKEY_0,
ui::EF_NONE);
shortcut_input_handler_->OnEvent(&released_event);
EXPECT_EQ(1, observer_->num_input_events_pressed());
EXPECT_EQ(1, observer_->num_input_events_released());
ui::KeyEvent prewritten_pressed_event(ui::EventType::kKeyPressed, ui::VKEY_1,
ui::EF_NONE);
shortcut_input_handler_->OnPrerewriteKeyInputEvent(prewritten_pressed_event);
EXPECT_EQ(1, observer_->num_prerewritten_input_events_pressed());
EXPECT_EQ(0, observer_->num_prerewritten_input_events_released());
ui::KeyEvent prewritten_released_event(ui::EventType::kKeyReleased,
ui::VKEY_1, ui::EF_NONE);
shortcut_input_handler_->OnPrerewriteKeyInputEvent(prewritten_released_event);
EXPECT_EQ(1, observer_->num_prerewritten_input_events_pressed());
EXPECT_EQ(1, observer_->num_prerewritten_input_events_released());
}
TEST_F(ShortcutInputHandlerTest, ConsumeTest) {
ui::KeyEvent pressed_event(ui::EventType::kKeyPressed, ui::VKEY_0,
ui::EF_NONE);
shortcut_input_handler_->OnEvent(&pressed_event);
EXPECT_FALSE(pressed_event.stopped_propagation());
shortcut_input_handler_->SetShouldConsumeKeyEvents(
/*should_consume_key_events=*/true);
ui::KeyEvent released_event(ui::EventType::kKeyReleased, ui::VKEY_0,
ui::EF_NONE);
shortcut_input_handler_->OnEvent(&released_event);
EXPECT_TRUE(released_event.stopped_propagation());
}
TEST_F(ShortcutInputHandlerTest, ShowAllWindows) {
ui::KeyEvent prerewritten_pressed_event =
ui::KeyEvent(ui::EventType::kKeyPressed, ui::VKEY_UNKNOWN,
ui::DomCode::SHOW_ALL_WINDOWS, ui::EF_NONE);
shortcut_input_handler_->OnPrerewriteKeyInputEvent(
prerewritten_pressed_event);
EXPECT_EQ(observer_->key_code(), ui::VKEY_MEDIA_LAUNCH_APP1);
}
TEST_F(ShortcutInputHandlerTest, QuickInsert) {
ui::KeyEvent prerewritten_pressed_event =
ui::KeyEvent(ui::EventType::kKeyPressed, ui::VKEY_ASSISTANT,
ui::DomCode::LAUNCH_ASSISTANT, ui::EF_NONE);
ui::SetQuickInsertProperty(&prerewritten_pressed_event);
shortcut_input_handler_->OnPrerewriteKeyInputEvent(
prerewritten_pressed_event);
EXPECT_EQ(observer_->key_code(), ui::VKEY_QUICK_INSERT);
}
} // namespace ash