accessibility_manager_browsertest.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
1// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 6 7#include "ash/magnifier/magnification_controller.h" 8#include "ash/shell.h" 9#include "base/command_line.h" 10#include "base/prefs/pref_service.h" 11#include "chrome/browser/browser_process.h" 12#include "chrome/browser/chrome_notification_types.h" 13#include "chrome/browser/chromeos/accessibility/magnification_manager.h" 14#include "chrome/browser/chromeos/login/helper.h" 15#include "chrome/browser/chromeos/login/login_utils.h" 16#include "chrome/browser/chromeos/login/user_manager.h" 17#include "chrome/browser/chromeos/login/user_manager_impl.h" 18#include "chrome/browser/chromeos/profiles/profile_helper.h" 19#include "chrome/browser/profiles/profile.h" 20#include "chrome/browser/profiles/profile_manager.h" 21#include "chrome/common/pref_names.h" 22#include "chrome/test/base/in_process_browser_test.h" 23#include "chrome/test/base/testing_profile.h" 24#include "chromeos/chromeos_switches.h" 25#include "content/public/browser/notification_service.h" 26#include "testing/gtest/include/gtest/gtest.h" 27 28namespace chromeos { 29 30namespace { 31 32const char kTestUserName[] = "owner@invalid.domain"; 33 34// Test user name for locally managed user. The domain part must be matched 35// with UserManager::kLocallyManagedUserDomain. 36const char kTestLocallyManagedUserName[] = "test@locally-managed.localhost"; 37 38class MockAccessibilityObserver : public content::NotificationObserver { 39 public: 40 MockAccessibilityObserver() : observed_(false), 41 observed_enabled_(false), 42 observed_type_(-1) { 43 registrar_.Add( 44 this, 45 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK, 46 content::NotificationService::AllSources()); 47 registrar_.Add( 48 this, 49 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE, 50 content::NotificationService::AllSources()); 51 } 52 virtual ~MockAccessibilityObserver() {} 53 54 bool observed() const { return observed_; } 55 bool observed_enabled() const { return observed_enabled_; } 56 int observed_type() const { return observed_type_; } 57 58 void reset() { observed_ = false; } 59 60 private: 61 // content::NotificationObserver implimentation: 62 virtual void Observe(int type, 63 const content::NotificationSource& source, 64 const content::NotificationDetails& details) OVERRIDE { 65 AccessibilityStatusEventDetails* accessibility_status = 66 content::Details<AccessibilityStatusEventDetails>( 67 details).ptr(); 68 ASSERT_FALSE(observed_); 69 70 switch (type) { 71 case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK: 72 observed_ = true; 73 observed_enabled_ = accessibility_status->enabled; 74 observed_type_ = type; 75 break; 76 case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE: 77 observed_ = true; 78 observed_enabled_ = accessibility_status->enabled; 79 observed_type_ = type; 80 break; 81 } 82 } 83 84 bool observed_; 85 bool observed_enabled_; 86 int observed_type_; 87 88 content::NotificationRegistrar registrar_; 89 90 DISALLOW_COPY_AND_ASSIGN(MockAccessibilityObserver); 91}; 92 93void SetLargeCursorEnabled(bool enabled) { 94 return AccessibilityManager::Get()->EnableLargeCursor(enabled); 95} 96 97bool IsLargeCursorEnabled() { 98 return AccessibilityManager::Get()->IsLargeCursorEnabled(); 99} 100 101void SetHighContrastEnabled(bool enabled) { 102 return AccessibilityManager::Get()->EnableHighContrast(enabled); 103} 104 105bool IsHighContrastEnabled() { 106 return AccessibilityManager::Get()->IsHighContrastEnabled(); 107} 108 109void SetSpokenFeedbackEnabled(bool enabled) { 110 return AccessibilityManager::Get()->EnableSpokenFeedback( 111 enabled, ash::A11Y_NOTIFICATION_NONE); 112} 113 114bool IsSpokenFeedbackEnabled() { 115 return AccessibilityManager::Get()->IsSpokenFeedbackEnabled(); 116} 117 118void SetAutoclickEnabled(bool enabled) { 119 return AccessibilityManager::Get()->EnableAutoclick(enabled); 120} 121 122bool IsAutoclickEnabled() { 123 return AccessibilityManager::Get()->IsAutoclickEnabled(); 124} 125 126Profile* GetProfile() { 127 Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord(); 128 DCHECK(profile); 129 return profile; 130} 131 132PrefService* GetPrefs() { 133 return GetProfile()->GetPrefs(); 134} 135 136void SetLargeCursorEnabledPref(bool enabled) { 137 GetPrefs()->SetBoolean(prefs::kLargeCursorEnabled, enabled); 138} 139 140void SetHighContrastEnabledPref(bool enabled) { 141 GetPrefs()->SetBoolean(prefs::kHighContrastEnabled, enabled); 142} 143 144void SetSpokenFeedbackEnabledPref(bool enabled) { 145 GetPrefs()->SetBoolean(prefs::kSpokenFeedbackEnabled, enabled); 146} 147 148void SetAutoclickEnabledPref(bool enabled) { 149 GetPrefs()->SetBoolean(prefs::kAutoclickEnabled, enabled); 150} 151 152bool GetLargeCursorEnabledFromPref() { 153 return GetPrefs()->GetBoolean(prefs::kLargeCursorEnabled); 154} 155 156bool GetHighContrastEnabledFromPref() { 157 return GetPrefs()->GetBoolean(prefs::kHighContrastEnabled); 158} 159 160bool GetSpokenFeedbackEnabledFromPref() { 161 return GetPrefs()->GetBoolean(prefs::kSpokenFeedbackEnabled); 162} 163 164bool GetAutoclickEnabledFromPref() { 165 return GetPrefs()->GetBoolean(prefs::kAutoclickEnabled); 166} 167 168} // anonymouse namespace 169 170class AccessibilityManagerTest : public InProcessBrowserTest { 171 protected: 172 AccessibilityManagerTest() {} 173 virtual ~AccessibilityManagerTest() {} 174 175 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 176 command_line->AppendSwitch(chromeos::switches::kLoginManager); 177 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, 178 TestingProfile::kTestUserProfileDir); 179 } 180 181 virtual void SetUpOnMainThread() OVERRIDE { 182 // Sets the login-screen profile. 183 AccessibilityManager::Get()-> 184 SetProfileForTest(ProfileHelper::GetSigninProfile()); 185 } 186 187 content::NotificationRegistrar registrar_; 188 DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerTest); 189}; 190 191IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, Login) { 192 // Confirms that a11y features are disabled on the login screen. 193 EXPECT_FALSE(IsLargeCursorEnabled()); 194 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 195 EXPECT_FALSE(IsHighContrastEnabled()); 196 EXPECT_FALSE(IsAutoclickEnabled()); 197 198 // Logs in. 199 UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true); 200 201 // Confirms that the features still disabled just after login. 202 EXPECT_FALSE(IsLargeCursorEnabled()); 203 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 204 EXPECT_FALSE(IsHighContrastEnabled()); 205 EXPECT_FALSE(IsAutoclickEnabled()); 206 207 UserManager::Get()->SessionStarted(); 208 209 // Confirms that the features are still disabled just after login. 210 EXPECT_FALSE(IsLargeCursorEnabled()); 211 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 212 EXPECT_FALSE(IsHighContrastEnabled()); 213 EXPECT_FALSE(IsAutoclickEnabled()); 214 215 // Enables large cursor. 216 SetLargeCursorEnabled(true); 217 // Confirms that large cursor is enabled. 218 EXPECT_TRUE(IsLargeCursorEnabled()); 219 220 // Enables spoken feedback. 221 SetSpokenFeedbackEnabled(true); 222 // Confirms that the spoken feedback is enabled. 223 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 224 225 // Enables high contrast. 226 SetHighContrastEnabled(true); 227 // Confirms that high cotrast is enabled. 228 EXPECT_TRUE(IsHighContrastEnabled()); 229 230 // Enables autoclick. 231 SetAutoclickEnabled(true); 232 // Confirms that autoclick is enabled. 233 EXPECT_TRUE(IsAutoclickEnabled()); 234} 235 236IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, TypePref) { 237 // Logs in. 238 UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true); 239 UserManager::Get()->SessionStarted(); 240 241 // Confirms that the features are disabled just after login. 242 EXPECT_FALSE(IsLargeCursorEnabled()); 243 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 244 EXPECT_FALSE(IsHighContrastEnabled()); 245 EXPECT_FALSE(IsAutoclickEnabled()); 246 247 // Sets the pref as true to enable the large cursor. 248 SetLargeCursorEnabledPref(true); 249 // Confirms that the large cursor is enabled. 250 EXPECT_TRUE(IsLargeCursorEnabled()); 251 252 // Sets the pref as true to enable the spoken feedback. 253 SetSpokenFeedbackEnabledPref(true); 254 // Confirms that the spoken feedback is enabled. 255 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 256 257 // Sets the pref as true to enable high contrast mode. 258 SetHighContrastEnabledPref(true); 259 // Confirms that the high contrast mode is enabled. 260 EXPECT_TRUE(IsHighContrastEnabled()); 261 262 // Sets the pref as true to enable autoclick. 263 SetAutoclickEnabledPref(true); 264 // Confirms that autoclick is enabled. 265 EXPECT_TRUE(IsAutoclickEnabled()); 266 267 SetLargeCursorEnabledPref(false); 268 EXPECT_FALSE(IsLargeCursorEnabled()); 269 270 SetSpokenFeedbackEnabledPref(false); 271 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 272 273 SetHighContrastEnabledPref(false); 274 EXPECT_FALSE(IsHighContrastEnabled()); 275 276 SetAutoclickEnabledPref(false); 277 EXPECT_FALSE(IsAutoclickEnabled()); 278} 279 280IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, ResumeSavedPref) { 281 // Loads the profile of the user. 282 UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true); 283 284 // Sets the pref to enable large cursor before login. 285 SetLargeCursorEnabledPref(true); 286 EXPECT_FALSE(IsLargeCursorEnabled()); 287 288 // Sets the pref to enable spoken feedback before login. 289 SetSpokenFeedbackEnabledPref(true); 290 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 291 292 // Sets the pref to enable high contrast before login. 293 SetHighContrastEnabledPref(true); 294 EXPECT_FALSE(IsHighContrastEnabled()); 295 296 // Sets the pref to enable autoclick before login. 297 SetAutoclickEnabledPref(true); 298 EXPECT_FALSE(IsAutoclickEnabled()); 299 300 // Logs in. 301 UserManager::Get()->SessionStarted(); 302 303 // Confirms that features are enabled by restring from pref just after login. 304 EXPECT_TRUE(IsLargeCursorEnabled()); 305 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 306 EXPECT_TRUE(IsHighContrastEnabled()); 307 EXPECT_TRUE(IsAutoclickEnabled()); 308} 309 310IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, 311 ChangingTypeInvokesNotification) { 312 MockAccessibilityObserver observer; 313 314 // Logs in. 315 UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true); 316 UserManager::Get()->SessionStarted(); 317 318 EXPECT_FALSE(observer.observed()); 319 observer.reset(); 320 321 SetSpokenFeedbackEnabled(true); 322 EXPECT_TRUE(observer.observed()); 323 EXPECT_TRUE(observer.observed_enabled()); 324 EXPECT_EQ(observer.observed_type(), 325 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 326 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 327 328 observer.reset(); 329 SetSpokenFeedbackEnabled(false); 330 EXPECT_TRUE(observer.observed()); 331 EXPECT_FALSE(observer.observed_enabled()); 332 EXPECT_EQ(observer.observed_type(), 333 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 334 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 335 336 observer.reset(); 337 SetHighContrastEnabled(true); 338 EXPECT_TRUE(observer.observed()); 339 EXPECT_TRUE(observer.observed_enabled()); 340 EXPECT_EQ(observer.observed_type(), 341 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 342 EXPECT_TRUE(IsHighContrastEnabled()); 343 344 observer.reset(); 345 SetHighContrastEnabled(false); 346 EXPECT_TRUE(observer.observed()); 347 EXPECT_FALSE(observer.observed_enabled()); 348 EXPECT_EQ(observer.observed_type(), 349 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 350 EXPECT_FALSE(IsHighContrastEnabled()); 351} 352 353IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, 354 ChangingTypePrefInvokesNotification) { 355 MockAccessibilityObserver observer; 356 357 // Logs in. 358 UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true); 359 UserManager::Get()->SessionStarted(); 360 361 EXPECT_FALSE(observer.observed()); 362 observer.reset(); 363 364 SetSpokenFeedbackEnabledPref(true); 365 EXPECT_TRUE(observer.observed()); 366 EXPECT_TRUE(observer.observed_enabled()); 367 EXPECT_EQ(observer.observed_type(), 368 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 369 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 370 371 observer.reset(); 372 SetSpokenFeedbackEnabledPref(false); 373 EXPECT_TRUE(observer.observed()); 374 EXPECT_FALSE(observer.observed_enabled()); 375 EXPECT_EQ(observer.observed_type(), 376 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 377 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 378 379 observer.reset(); 380 SetHighContrastEnabledPref(true); 381 EXPECT_TRUE(observer.observed()); 382 EXPECT_TRUE(observer.observed_enabled()); 383 EXPECT_EQ(observer.observed_type(), 384 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 385 EXPECT_TRUE(IsHighContrastEnabled()); 386 387 observer.reset(); 388 SetHighContrastEnabledPref(false); 389 EXPECT_TRUE(observer.observed()); 390 EXPECT_FALSE(observer.observed_enabled()); 391 EXPECT_EQ(observer.observed_type(), 392 chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 393 EXPECT_FALSE(IsHighContrastEnabled()); 394} 395 396class AccessibilityManagerUserTypeTest 397 : public AccessibilityManagerTest, 398 public ::testing::WithParamInterface<const char*> { 399 protected: 400 AccessibilityManagerUserTypeTest() {} 401 virtual ~AccessibilityManagerUserTypeTest() {} 402 403 DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerUserTypeTest); 404}; 405 406// TODO(yoshiki): Enable a test for retail mode. 407INSTANTIATE_TEST_CASE_P( 408 UserTypeInstantiation, 409 AccessibilityManagerUserTypeTest, 410 ::testing::Values(kTestUserName, 411 UserManager::kGuestUserName, 412 //UserManager::kRetailModeUserName, 413 kTestLocallyManagedUserName)); 414 415IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest, 416 EnableOnLoginScreenAndLogin) { 417 // Enables large cursor. 418 SetLargeCursorEnabled(true); 419 EXPECT_TRUE(IsLargeCursorEnabled()); 420 // Enables spoken feedback. 421 SetSpokenFeedbackEnabled(true); 422 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 423 // Enables high contrast. 424 SetHighContrastEnabled(true); 425 EXPECT_TRUE(IsHighContrastEnabled()); 426 // Enables autoclick. 427 SetAutoclickEnabled(true); 428 EXPECT_TRUE(IsAutoclickEnabled()); 429 430 // Logs in. 431 const char* user_name = GetParam(); 432 UserManager::Get()->UserLoggedIn(user_name, user_name, true); 433 434 // Confirms that the features are still enabled just after login. 435 EXPECT_TRUE(IsLargeCursorEnabled()); 436 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 437 EXPECT_TRUE(IsHighContrastEnabled()); 438 EXPECT_TRUE(IsAutoclickEnabled()); 439 440 UserManager::Get()->SessionStarted(); 441 442 // Confirms that the features keep enabled after session starts. 443 EXPECT_TRUE(IsLargeCursorEnabled()); 444 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 445 EXPECT_TRUE(IsHighContrastEnabled()); 446 EXPECT_TRUE(IsAutoclickEnabled()); 447 448 // Confirms that the prefs have been copied to the user's profile. 449 EXPECT_TRUE(GetLargeCursorEnabledFromPref()); 450 EXPECT_TRUE(GetSpokenFeedbackEnabledFromPref()); 451 EXPECT_TRUE(GetHighContrastEnabledFromPref()); 452 EXPECT_TRUE(GetAutoclickEnabledFromPref()); 453} 454 455} // namespace chromeos 456