// 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 "base/functional/bind.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
#include "chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "content/public/test/browser_test.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace ash::eche_app {
class EcheAppAccessibilityProviderProxyBrowserTest
: public InProcessBrowserTest {
protected:
EcheAppAccessibilityProviderProxyBrowserTest() = default;
EcheAppAccessibilityProviderProxyBrowserTest(
const EcheAppAccessibilityProviderProxyBrowserTest&) = delete;
EcheAppAccessibilityProviderProxyBrowserTest& operator=(
const EcheAppAccessibilityProviderProxyBrowserTest&) = delete;
~EcheAppAccessibilityProviderProxyBrowserTest() override = default;
void SetUpOnMainThread() override {
a11y_manager_ = AccessibilityManager::Get();
}
void TearDownOnMainThread() override { a11y_manager_ = nullptr; }
raw_ptr<AccessibilityManager> a11y_manager_;
EcheAppAccessibilityProviderProxy proxy_;
};
IN_PROC_BROWSER_TEST_F(EcheAppAccessibilityProviderProxyBrowserTest,
EnabledState) {
// Tell the proxy to register subscription to a11y_manager.
proxy_.OnViewTracked();
// Create a callback for a11y being enabled or disabled.
bool current_state = false;
proxy_.SetAccessibilityEnabledStateChangedCallback(base::BindRepeating(
[](bool* local_state, bool state) { *local_state = state; },
¤t_state));
// Enable ChromeVox.
a11y_manager_->EnableSpokenFeedback(true);
// Expect the current state to be true.
EXPECT_TRUE(current_state);
EXPECT_TRUE(proxy_.IsAccessibilityEnabled());
}
IN_PROC_BROWSER_TEST_F(EcheAppAccessibilityProviderProxyBrowserTest,
ExploreByTouchNotAlreadyEnabled) {
bool current_state = false;
proxy_.SetExploreByTouchEnabledStateChangedCallback(base::BindRepeating(
[](bool* local_state, bool state) { *local_state = state; },
¤t_state));
proxy_.OnViewTracked();
// Explore by touch should not have been updated.
EXPECT_FALSE(current_state);
a11y_manager_->EnableSpokenFeedback(true);
EXPECT_TRUE(current_state);
a11y_manager_->EnableSpokenFeedback(false);
EXPECT_FALSE(current_state);
}
IN_PROC_BROWSER_TEST_F(EcheAppAccessibilityProviderProxyBrowserTest,
ExploreByTouchAlreadyEnabled) {
// Enable ChromeVox before setting up proxy.
a11y_manager_->EnableSpokenFeedback(true);
bool current_state = false;
proxy_.SetExploreByTouchEnabledStateChangedCallback(base::BindRepeating(
[](bool* local_state, bool state) { *local_state = state; },
¤t_state));
proxy_.OnViewTracked();
// Explore by touch should be updated when the view is tracked.
EXPECT_TRUE(current_state);
a11y_manager_->EnableSpokenFeedback(false);
EXPECT_FALSE(current_state);
}
IN_PROC_BROWSER_TEST_F(EcheAppAccessibilityProviderProxyBrowserTest,
FullFocusMode) {
proxy_.OnViewTracked();
// ChromeVox
EXPECT_FALSE(proxy_.UseFullFocusMode());
a11y_manager_->EnableSpokenFeedback(true);
EXPECT_TRUE(proxy_.UseFullFocusMode());
a11y_manager_->EnableSpokenFeedback(false);
EXPECT_FALSE(proxy_.UseFullFocusMode());
// Switch Access
EXPECT_FALSE(proxy_.UseFullFocusMode());
a11y_manager_->SetSwitchAccessEnabled(true);
EXPECT_TRUE(proxy_.UseFullFocusMode());
a11y_manager_->SetSwitchAccessEnabled(false);
EXPECT_FALSE(proxy_.UseFullFocusMode());
// Something else
EXPECT_FALSE(proxy_.UseFullFocusMode());
a11y_manager_->SetSelectToSpeakEnabled(true);
EXPECT_FALSE(proxy_.UseFullFocusMode());
a11y_manager_->SetSwitchAccessEnabled(false);
EXPECT_FALSE(proxy_.UseFullFocusMode());
}
} // namespace ash::eche_app