| // 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 |