blob: 5a041e002ec776243992705cbbc8b7ceddef0569 [file] [log] [blame]
// Copyright 2025 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/glic/widget/glic_panel_hotkey_delegate.h"
#include <memory>
#include <vector>
#include "base/memory/weak_ptr.h"
#include "base/test/metrics/user_action_tester.h"
#include "build/build_config.h"
#include "chrome/browser/glic/test_support/mock_local_hotkey_panel.h"
#include "chrome/browser/glic/widget/glic_view.h"
#include "chrome/browser/glic/widget/local_hotkey_manager.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/accelerators/accelerator.h"
#include "ui/events/keycodes/keyboard_codes.h"
#include "ui/views/view.h"
namespace glic {
namespace {
// MockGlicView is needed because the delegate interacts with the view provided
// by the controller to manage accelerators.
class MockGlicView : public views::View {
public:
MockGlicView() = default;
~MockGlicView() override = default;
base::WeakPtr<MockGlicView> GetWeakPtr() {
return weak_ptr_factory_.GetWeakPtr();
}
private:
base::WeakPtrFactory<MockGlicView> weak_ptr_factory_{this};
};
class GlicPanelHotkeyDelegateTest : public testing::Test {
public:
void SetUp() override {
testing::Test::SetUp();
mock_panel_ = std::make_unique<MockLocalHotkeyPanel>();
mock_glic_view_ = std::make_unique<MockGlicView>();
ON_CALL(*mock_panel_, GetView())
.WillByDefault(testing::Return(mock_glic_view_->GetWeakPtr()));
ON_CALL(*mock_panel_, HasFocus()).WillByDefault(testing::Return(true));
delegate_ =
std::make_unique<GlicPanelHotkeyDelegate>(mock_panel_->GetWeakPtr());
}
void TearDown() override {
delegate_.reset();
mock_glic_view_.reset();
mock_panel_.reset();
testing::Test::TearDown();
}
protected:
std::unique_ptr<MockLocalHotkeyPanel> mock_panel_;
std::unique_ptr<MockGlicView> mock_glic_view_;
std::unique_ptr<GlicPanelHotkeyDelegate> delegate_;
base::UserActionTester user_action_tester_;
};
} // namespace
TEST_F(GlicPanelHotkeyDelegateTest, GetSupportedHotkeys) {
auto supported = delegate_->GetSupportedHotkeys();
const std::vector<LocalHotkeyManager::Hotkey> kExpectedHotkeys = {
LocalHotkeyManager::Hotkey::kClose,
LocalHotkeyManager::Hotkey::kFocusToggle,
#if BUILDFLAG(IS_WIN)
LocalHotkeyManager::Hotkey::kTitleBarContextMenu,
#endif
};
EXPECT_THAT(supported, testing::ElementsAreArray(kExpectedHotkeys));
}
TEST_F(GlicPanelHotkeyDelegateTest, AcceleratorPressedClose) {
EXPECT_CALL(*mock_panel_, Close()).Times(1);
EXPECT_TRUE(
delegate_->AcceleratorPressed(LocalHotkeyManager::Hotkey::kClose));
}
TEST_F(GlicPanelHotkeyDelegateTest, AcceleratorPressedFocusToggle) {
EXPECT_CALL(*mock_panel_, ActivateBrowser()).WillOnce(testing::Return(true));
EXPECT_TRUE(
delegate_->AcceleratorPressed(LocalHotkeyManager::Hotkey::kFocusToggle));
EXPECT_EQ(1, user_action_tester_.GetActionCount("Glic.FocusHotKey"));
}
TEST_F(GlicPanelHotkeyDelegateTest,
AcceleratorPressedFocusToggleNoBrowserToActivate) {
EXPECT_CALL(*mock_panel_, ActivateBrowser()).WillOnce(testing::Return(false));
EXPECT_FALSE(
delegate_->AcceleratorPressed(LocalHotkeyManager::Hotkey::kFocusToggle));
EXPECT_EQ(0, user_action_tester_.GetActionCount("Glic.FocusHotKey"));
}
#if BUILDFLAG(IS_WIN)
TEST_F(GlicPanelHotkeyDelegateTest, AcceleratorPressedTitleBarContextMenu) {
EXPECT_CALL(*mock_panel_, ShowTitleBarContextMenuAt(gfx::Point())).Times(1);
EXPECT_TRUE(delegate_->AcceleratorPressed(
LocalHotkeyManager::Hotkey::kTitleBarContextMenu));
}
#endif
TEST_F(GlicPanelHotkeyDelegateTest, CreateScopedHotkeyRegistration) {
ui::Accelerator test_accel(ui::VKEY_A, ui::EF_NONE);
auto registration =
delegate_->CreateScopedHotkeyRegistration(test_accel, nullptr);
ASSERT_TRUE(registration);
EXPECT_THAT(mock_glic_view_->GetAccelerators(),
testing::ElementsAre(test_accel));
registration.reset();
EXPECT_EQ(mock_glic_view_->GetAccelerators().size(), 0u);
}
TEST_F(GlicPanelHotkeyDelegateTest, MakeGlicWindowHotkeyManager) {
auto manager = MakeGlicWindowHotkeyManager(mock_panel_->GetWeakPtr());
EXPECT_TRUE(manager);
}
} // namespace glic