blob: 143f0f8e515d4e02c5c8fedabc458bf116ba1a55 [file] [log] [blame]
// Copyright 2020 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/system/accessibility/select_to_speak_menu_bubble_controller.h"
#include "ash/accessibility/accessibility_controller_impl.h"
#include "ash/accessibility/test_accessibility_controller_client.h"
#include "ash/public/cpp/accessibility_controller_enums.h"
#include "ash/shell.h"
#include "ash/strings/grit/ash_strings.h"
#include "ash/system/accessibility/floating_menu_button.h"
#include "ash/system/accessibility/select_to_speak_menu_view.h"
#include "ash/test/ash_test_base.h"
#include "base/test/scoped_feature_list.h"
#include "ui/accessibility/accessibility_features.h"
#include "ui/base/l10n/l10n_util.h"
#include "ui/display/display.h"
#include "ui/display/screen.h"
namespace ash {
namespace {
ui::GestureEvent CreateTapEvent(int x = 0, int y = 0) {
return ui::GestureEvent(x, y, 0, base::TimeTicks(),
ui::GestureEventDetails(ui::ET_GESTURE_TAP));
}
} // namespace
class SelectToSpeakMenuBubbleControllerTest : public AshTestBase {
public:
SelectToSpeakMenuBubbleControllerTest() = default;
~SelectToSpeakMenuBubbleControllerTest() override = default;
SelectToSpeakMenuBubbleControllerTest(
const SelectToSpeakMenuBubbleControllerTest&) = delete;
SelectToSpeakMenuBubbleControllerTest& operator=(
const SelectToSpeakMenuBubbleControllerTest&) = delete;
// AshTestBase:
void SetUp() override {
AshTestBase::SetUp();
scoped_feature_list_.InitAndEnableFeature(
::features::kSelectToSpeakNavigationControl);
Shell::Get()->accessibility_controller()->select_to_speak().SetEnabled(
true);
}
void TearDown() override { AshTestBase::TearDown(); }
AccessibilityControllerImpl* GetAccessibilitController() {
return Shell::Get()->accessibility_controller();
}
SelectToSpeakMenuBubbleController* GetBubbleController() {
return GetAccessibilitController()
->GetSelectToSpeakMenuBubbleControllerForTest();
}
SelectToSpeakSpeedBubbleController* GetSpeedBubbleController() {
return GetBubbleController()->speed_bubble_controller_.get();
}
views::Widget* GetBubbleWidget() {
return GetBubbleController()->bubble_widget_;
}
SelectToSpeakMenuView* GetMenuView() {
return GetBubbleController()->menu_view_;
}
FloatingMenuButton* GetMenuButton(SelectToSpeakMenuView::ButtonId view_id) {
SelectToSpeakMenuView* menu_view = GetMenuView();
if (!menu_view)
return nullptr;
return static_cast<FloatingMenuButton*>(
menu_view->GetViewByID(static_cast<int>(view_id)));
}
void ShowSelectToSpeakPanel(bool is_paused) {
gfx::Rect anchor_rect(10, 10, 0, 0);
GetAccessibilitController()->ShowSelectToSpeakPanel(anchor_rect, is_paused,
/*speech_rate=*/1.2);
}
protected:
base::test::ScopedFeatureList scoped_feature_list_;
};
TEST_F(SelectToSpeakMenuBubbleControllerTest, ShowSelectToSpeakPanel_paused) {
ShowSelectToSpeakPanel(/*is_paused=*/true);
EXPECT_TRUE(GetMenuView());
FloatingMenuButton* pause_button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPause);
EXPECT_EQ(pause_button->GetTooltipText(),
l10n_util::GetStringUTF16(IDS_ASH_SELECT_TO_SPEAK_RESUME));
EXPECT_TRUE(GetBubbleWidget()->IsVisible());
}
TEST_F(SelectToSpeakMenuBubbleControllerTest,
ShowSelectToSpeakPanel_notPaused) {
ShowSelectToSpeakPanel(/*is_paused=*/false);
EXPECT_TRUE(GetMenuView());
FloatingMenuButton* pause_button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPause);
EXPECT_EQ(pause_button->GetTooltipText(),
l10n_util::GetStringUTF16(IDS_ASH_SELECT_TO_SPEAK_PAUSE));
EXPECT_TRUE(GetBubbleWidget()->IsVisible());
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, HideSelectToSpeakPanel) {
ShowSelectToSpeakPanel(/*is_paused=*/false);
GetAccessibilitController()->HideSelectToSpeakPanel();
EXPECT_TRUE(GetMenuView());
EXPECT_FALSE(GetBubbleWidget()->IsVisible());
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, PauseButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPause);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kPause);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, ResumeButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/true);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPause);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kResume);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, PrevParagraphButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPrevParagraph);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kPreviousParagraph);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, PrevSentenceButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kPrevSentence);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kPreviousSentence);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, NextParagraphButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kNextParagraph);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kNextParagraph);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, NextSentenceButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kNextSentence);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kNextSentence);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, StopButtonPressed) {
TestAccessibilityControllerClient client;
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kStop);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_EQ(client.last_select_to_speak_panel_action(),
SelectToSpeakPanelAction::kExit);
}
TEST_F(SelectToSpeakMenuBubbleControllerTest, ChangeSpeedButtonPressed) {
ShowSelectToSpeakPanel(/*is_paused=*/false);
FloatingMenuButton* button =
GetMenuButton(SelectToSpeakMenuView::ButtonId::kSpeed);
ui::GestureEvent event = CreateTapEvent();
button->OnGestureEvent(&event);
EXPECT_TRUE(GetSpeedBubbleController() &&
GetSpeedBubbleController()->IsVisible());
// Clicking again hides the speed selection bubble.
button->OnGestureEvent(&event);
EXPECT_TRUE(!GetSpeedBubbleController() ||
!GetSpeedBubbleController()->IsVisible());
}
} // namespace ash