blob: d7e5cc30507d440914ec33a2bbc7f98633ccefd7 [file] [log] [blame]
// Copyright 2017 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/accessibility/accessibility_controller.h"
#include "ash/accessibility/test_accessibility_controller_client.h"
#include "ash/ash_constants.h"
#include "ash/public/cpp/ash_pref_names.h"
#include "ash/session/session_controller.h"
#include "ash/shell.h"
#include "ash/system/accessibility_observer.h"
#include "ash/system/tray/system_tray_notifier.h"
#include "ash/test/ash_test_base.h"
#include "components/prefs/pref_service.h"
namespace ash {
void CopyResult(base::TimeDelta* dest, base::TimeDelta src) {
*dest = src;
}
class TestAccessibilityObserver : public AccessibilityObserver {
public:
TestAccessibilityObserver() = default;
~TestAccessibilityObserver() override = default;
// AccessibilityObserver:
void OnAccessibilityStatusChanged(
AccessibilityNotificationVisibility notify) override {
changed_++;
}
int changed_ = 0;
private:
DISALLOW_COPY_AND_ASSIGN(TestAccessibilityObserver);
};
using AccessibilityControllerTest = AshTestBase;
TEST_F(AccessibilityControllerTest, PrefsAreRegistered) {
PrefService* prefs =
Shell::Get()->session_controller()->GetLastActiveUserPrefService();
EXPECT_TRUE(prefs->FindPreference(prefs::kAccessibilityHighContrastEnabled));
EXPECT_TRUE(prefs->FindPreference(prefs::kAccessibilityLargeCursorEnabled));
EXPECT_TRUE(prefs->FindPreference(prefs::kAccessibilityLargeCursorDipSize));
EXPECT_TRUE(prefs->FindPreference(prefs::kAccessibilityMonoAudioEnabled));
EXPECT_TRUE(
prefs->FindPreference(prefs::kAccessibilityScreenMagnifierEnabled));
}
TEST_F(AccessibilityControllerTest, SetHighContrastEnabled) {
AccessibilityController* controller =
Shell::Get()->accessibility_controller();
EXPECT_FALSE(controller->IsHighContrastEnabled());
TestAccessibilityObserver observer;
Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
EXPECT_EQ(0, observer.changed_);
controller->SetHighContrastEnabled(true);
EXPECT_TRUE(controller->IsHighContrastEnabled());
EXPECT_EQ(1, observer.changed_);
controller->SetHighContrastEnabled(false);
EXPECT_FALSE(controller->IsHighContrastEnabled());
EXPECT_EQ(2, observer.changed_);
Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
}
TEST_F(AccessibilityControllerTest, SetLargeCursorEnabled) {
AccessibilityController* controller =
Shell::Get()->accessibility_controller();
EXPECT_FALSE(controller->IsLargeCursorEnabled());
TestAccessibilityObserver observer;
Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
EXPECT_EQ(0, observer.changed_);
controller->SetLargeCursorEnabled(true);
EXPECT_TRUE(controller->IsLargeCursorEnabled());
EXPECT_EQ(1, observer.changed_);
controller->SetLargeCursorEnabled(false);
EXPECT_FALSE(controller->IsLargeCursorEnabled());
EXPECT_EQ(2, observer.changed_);
Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
}
TEST_F(AccessibilityControllerTest, DisableLargeCursorResetsSize) {
PrefService* prefs =
Shell::Get()->session_controller()->GetLastActiveUserPrefService();
EXPECT_EQ(kDefaultLargeCursorSize,
prefs->GetInteger(prefs::kAccessibilityLargeCursorDipSize));
// Simulate using chrome settings webui to turn on large cursor and set a
// custom size.
prefs->SetBoolean(prefs::kAccessibilityLargeCursorEnabled, true);
prefs->SetInteger(prefs::kAccessibilityLargeCursorDipSize, 48);
// Turning off large cursor resets the size to the default.
prefs->SetBoolean(prefs::kAccessibilityLargeCursorEnabled, false);
EXPECT_EQ(kDefaultLargeCursorSize,
prefs->GetInteger(prefs::kAccessibilityLargeCursorDipSize));
}
TEST_F(AccessibilityControllerTest, SetMonoAudioEnabled) {
AccessibilityController* controller =
Shell::Get()->accessibility_controller();
EXPECT_FALSE(controller->IsMonoAudioEnabled());
TestAccessibilityObserver observer;
Shell::Get()->system_tray_notifier()->AddAccessibilityObserver(&observer);
EXPECT_EQ(0, observer.changed_);
controller->SetMonoAudioEnabled(true);
EXPECT_TRUE(controller->IsMonoAudioEnabled());
EXPECT_EQ(1, observer.changed_);
controller->SetMonoAudioEnabled(false);
EXPECT_FALSE(controller->IsMonoAudioEnabled());
EXPECT_EQ(2, observer.changed_);
Shell::Get()->system_tray_notifier()->RemoveAccessibilityObserver(&observer);
}
// Tests that ash's controller gets shutdown sound duration properly from
// remote client.
TEST_F(AccessibilityControllerTest, GetShutdownSoundDuration) {
AccessibilityController* controller =
Shell::Get()->accessibility_controller();
TestAccessibilityControllerClient client;
controller->SetClient(client.CreateInterfacePtrAndBind());
base::TimeDelta sound_duration;
controller->PlayShutdownSound(
base::BindOnce(&CopyResult, base::Unretained(&sound_duration)));
controller->FlushMojoForTest();
EXPECT_EQ(TestAccessibilityControllerClient::kShutdownSoundDuration,
sound_duration);
}
using AccessibilityControllerSigninTest = NoSessionAshTestBase;
TEST_F(AccessibilityControllerSigninTest, SigninScreenPrefs) {
AccessibilityController* accessibility =
Shell::Get()->accessibility_controller();
SessionController* session = Shell::Get()->session_controller();
EXPECT_EQ(session_manager::SessionState::LOGIN_PRIMARY,
session->GetSessionState());
EXPECT_FALSE(accessibility->IsLargeCursorEnabled());
// Verify that toggling prefs at the signin screen changes the signin setting.
PrefService* signin_prefs = session->GetSigninScreenPrefService();
using prefs::kAccessibilityLargeCursorEnabled;
EXPECT_FALSE(signin_prefs->GetBoolean(kAccessibilityLargeCursorEnabled));
accessibility->SetLargeCursorEnabled(true);
EXPECT_TRUE(accessibility->IsLargeCursorEnabled());
EXPECT_TRUE(signin_prefs->GetBoolean(kAccessibilityLargeCursorEnabled));
// Verify that toggling prefs after signin changes the user setting.
SimulateUserLogin("user1@test.com");
PrefService* user_prefs = session->GetLastActiveUserPrefService();
EXPECT_NE(signin_prefs, user_prefs);
EXPECT_FALSE(accessibility->IsLargeCursorEnabled());
EXPECT_FALSE(user_prefs->GetBoolean(kAccessibilityLargeCursorEnabled));
accessibility->SetLargeCursorEnabled(true);
EXPECT_TRUE(accessibility->IsLargeCursorEnabled());
EXPECT_TRUE(user_prefs->GetBoolean(kAccessibilityLargeCursorEnabled));
}
} // namespace ash