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/session/user_session_manager.h" 17 #include "chrome/browser/chromeos/preferences.h" 18 #include "chrome/browser/chromeos/profiles/profile_helper.h" 19 #include "chrome/browser/extensions/api/braille_display_private/mock_braille_controller.h" 20 #include "chrome/browser/prefs/pref_service_syncable.h" 21 #include "chrome/browser/profiles/profile.h" 22 #include "chrome/browser/profiles/profile_manager.h" 23 #include "chrome/common/extensions/extension_constants.h" 24 #include "chrome/common/pref_names.h" 25 #include "chrome/test/base/in_process_browser_test.h" 26 #include "chrome/test/base/testing_profile.h" 27 #include "chromeos/chromeos_switches.h" 28 #include "chromeos/ime/component_extension_ime_manager.h" 29 #include "chromeos/ime/input_method_manager.h" 30 #include "chromeos/login/user_names.h" 31 #include "components/user_manager/user_manager.h" 32 #include "content/public/browser/notification_service.h" 33 #include "content/public/test/test_utils.h" 34 #include "testing/gtest/include/gtest/gtest.h" 35 36 using chromeos::input_method::InputMethodManager; 37 using chromeos::input_method::InputMethodUtil; 38 using chromeos::input_method::InputMethodDescriptors; 39 using content::BrowserThread; 40 using extensions::api::braille_display_private::BrailleObserver; 41 using extensions::api::braille_display_private::DisplayState; 42 using extensions::api::braille_display_private::KeyEvent; 43 using extensions::api::braille_display_private::MockBrailleController; 44 45 namespace chromeos { 46 47 namespace { 48 49 const char kTestUserName[] = "owner (at) invalid.domain"; 50 51 const int kTestAutoclickDelayMs = 2000; 52 53 // Test user name for supervised user. The domain part must be matched with 54 // chromeos::login::kSupervisedUserDomain. 55 const char kTestSupervisedUserName[] = "test (at) locally-managed.localhost"; 56 57 class MockAccessibilityObserver { 58 public: 59 MockAccessibilityObserver() : observed_(false), 60 observed_enabled_(false), 61 observed_type_(-1) 62 { 63 AccessibilityManager* accessibility_manager = AccessibilityManager::Get(); 64 CHECK(accessibility_manager); 65 accessibility_subscription_ = accessibility_manager->RegisterCallback( 66 base::Bind(&MockAccessibilityObserver::OnAccessibilityStatusChanged, 67 base::Unretained(this))); 68 } 69 70 virtual ~MockAccessibilityObserver() {} 71 72 bool observed() const { return observed_; } 73 bool observed_enabled() const { return observed_enabled_; } 74 int observed_type() const { return observed_type_; } 75 76 void reset() { observed_ = false; } 77 78 private: 79 void OnAccessibilityStatusChanged( 80 const AccessibilityStatusEventDetails& details) { 81 if (details.notification_type != ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER) { 82 observed_type_ = details.notification_type; 83 observed_enabled_ = details.enabled; 84 observed_ = true; 85 } 86 } 87 88 bool observed_; 89 bool observed_enabled_; 90 int observed_type_; 91 92 scoped_ptr<AccessibilityStatusSubscription> accessibility_subscription_; 93 94 DISALLOW_COPY_AND_ASSIGN(MockAccessibilityObserver); 95 }; 96 97 void SetLargeCursorEnabled(bool enabled) { 98 return AccessibilityManager::Get()->EnableLargeCursor(enabled); 99 } 100 101 bool IsLargeCursorEnabled() { 102 return AccessibilityManager::Get()->IsLargeCursorEnabled(); 103 } 104 105 bool ShouldShowAccessibilityMenu() { 106 return AccessibilityManager::Get()->ShouldShowAccessibilityMenu(); 107 } 108 109 void SetHighContrastEnabled(bool enabled) { 110 return AccessibilityManager::Get()->EnableHighContrast(enabled); 111 } 112 113 bool IsHighContrastEnabled() { 114 return AccessibilityManager::Get()->IsHighContrastEnabled(); 115 } 116 117 void SetSpokenFeedbackEnabled(bool enabled) { 118 return AccessibilityManager::Get()->EnableSpokenFeedback( 119 enabled, ash::A11Y_NOTIFICATION_NONE); 120 } 121 122 bool IsSpokenFeedbackEnabled() { 123 return AccessibilityManager::Get()->IsSpokenFeedbackEnabled(); 124 } 125 126 void SetAutoclickEnabled(bool enabled) { 127 return AccessibilityManager::Get()->EnableAutoclick(enabled); 128 } 129 130 bool IsAutoclickEnabled() { 131 return AccessibilityManager::Get()->IsAutoclickEnabled(); 132 } 133 134 void SetAutoclickDelay(int delay_ms) { 135 return AccessibilityManager::Get()->SetAutoclickDelay(delay_ms); 136 } 137 138 int GetAutoclickDelay() { 139 return AccessibilityManager::Get()->GetAutoclickDelay(); 140 } 141 142 void SetVirtualKeyboardEnabled(bool enabled) { 143 return AccessibilityManager::Get()->EnableVirtualKeyboard(enabled); 144 } 145 146 bool IsVirtualKeyboardEnabled() { 147 return AccessibilityManager::Get()->IsVirtualKeyboardEnabled(); 148 } 149 150 Profile* GetProfile() { 151 Profile* profile = ProfileManager::GetActiveUserProfile(); 152 DCHECK(profile); 153 return profile; 154 } 155 156 PrefService* GetPrefs() { 157 return GetProfile()->GetPrefs(); 158 } 159 160 void SetLargeCursorEnabledPref(bool enabled) { 161 GetPrefs()->SetBoolean(prefs::kAccessibilityLargeCursorEnabled, enabled); 162 } 163 164 void SetHighContrastEnabledPref(bool enabled) { 165 GetPrefs()->SetBoolean(prefs::kAccessibilityHighContrastEnabled, enabled); 166 } 167 168 void SetSpokenFeedbackEnabledPref(bool enabled) { 169 GetPrefs()->SetBoolean(prefs::kAccessibilitySpokenFeedbackEnabled, enabled); 170 } 171 172 void SetAutoclickEnabledPref(bool enabled) { 173 GetPrefs()->SetBoolean(prefs::kAccessibilityAutoclickEnabled, enabled); 174 } 175 176 void SetAutoclickDelayPref(int delay_ms) { 177 GetPrefs()->SetInteger(prefs::kAccessibilityAutoclickDelayMs, delay_ms); 178 } 179 180 void SetVirtualKeyboardEnabledPref(bool enabled) { 181 GetPrefs()->SetBoolean(prefs::kAccessibilityVirtualKeyboardEnabled, enabled); 182 } 183 184 bool GetLargeCursorEnabledFromPref() { 185 return GetPrefs()->GetBoolean(prefs::kAccessibilityLargeCursorEnabled); 186 } 187 188 bool GetHighContrastEnabledFromPref() { 189 return GetPrefs()->GetBoolean(prefs::kAccessibilityHighContrastEnabled); 190 } 191 192 bool GetSpokenFeedbackEnabledFromPref() { 193 return GetPrefs()->GetBoolean(prefs::kAccessibilitySpokenFeedbackEnabled); 194 } 195 196 bool GetAutoclickEnabledFromPref() { 197 return GetPrefs()->GetBoolean(prefs::kAccessibilityAutoclickEnabled); 198 } 199 200 int GetAutoclickDelayFromPref() { 201 return GetPrefs()->GetInteger(prefs::kAccessibilityAutoclickDelayMs); 202 } 203 204 bool IsBrailleImeActive() { 205 InputMethodManager* imm = InputMethodManager::Get(); 206 scoped_ptr<InputMethodDescriptors> descriptors = 207 imm->GetActiveIMEState()->GetActiveInputMethods(); 208 for (InputMethodDescriptors::const_iterator i = descriptors->begin(); 209 i != descriptors->end(); 210 ++i) { 211 if (i->id() == extension_misc::kBrailleImeEngineId) 212 return true; 213 } 214 return false; 215 } 216 217 bool IsBrailleImeCurrent() { 218 InputMethodManager* imm = InputMethodManager::Get(); 219 return imm->GetActiveIMEState()->GetCurrentInputMethod().id() == 220 extension_misc::kBrailleImeEngineId; 221 } 222 } // anonymous namespace 223 224 class AccessibilityManagerTest : public InProcessBrowserTest { 225 protected: 226 AccessibilityManagerTest() : default_autoclick_delay_(0) {} 227 virtual ~AccessibilityManagerTest() {} 228 229 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 230 command_line->AppendSwitch(chromeos::switches::kLoginManager); 231 command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile, 232 TestingProfile::kTestUserProfileDir); 233 } 234 235 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 236 AccessibilityManager::SetBrailleControllerForTest(&braille_controller_); 237 } 238 239 virtual void SetUpOnMainThread() OVERRIDE { 240 // Sets the login-screen profile. 241 AccessibilityManager::Get()-> 242 SetProfileForTest(ProfileHelper::GetSigninProfile()); 243 default_autoclick_delay_ = GetAutoclickDelay(); 244 } 245 246 virtual void TearDownOnMainThread() OVERRIDE { 247 AccessibilityManager::SetBrailleControllerForTest(NULL); 248 } 249 250 void SetBrailleDisplayAvailability(bool available) { 251 braille_controller_.SetAvailable(available); 252 braille_controller_.GetObserver()->OnBrailleDisplayStateChanged( 253 *braille_controller_.GetDisplayState()); 254 } 255 256 int default_autoclick_delay() const { return default_autoclick_delay_; } 257 258 int default_autoclick_delay_; 259 260 content::NotificationRegistrar registrar_; 261 262 MockBrailleController braille_controller_; 263 DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerTest); 264 }; 265 266 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, Login) { 267 // Confirms that a11y features are disabled on the login screen. 268 EXPECT_FALSE(IsLargeCursorEnabled()); 269 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 270 EXPECT_FALSE(IsHighContrastEnabled()); 271 EXPECT_FALSE(IsAutoclickEnabled()); 272 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 273 EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay()); 274 275 // Logs in. 276 user_manager::UserManager::Get()->UserLoggedIn( 277 kTestUserName, kTestUserName, true); 278 279 // Confirms that the features still disabled just after login. 280 EXPECT_FALSE(IsLargeCursorEnabled()); 281 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 282 EXPECT_FALSE(IsHighContrastEnabled()); 283 EXPECT_FALSE(IsAutoclickEnabled()); 284 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 285 EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay()); 286 287 user_manager::UserManager::Get()->SessionStarted(); 288 289 // Confirms that the features are still disabled just after login. 290 EXPECT_FALSE(IsLargeCursorEnabled()); 291 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 292 EXPECT_FALSE(IsHighContrastEnabled()); 293 EXPECT_FALSE(IsAutoclickEnabled()); 294 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 295 EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay()); 296 297 // Enables large cursor. 298 SetLargeCursorEnabled(true); 299 // Confirms that large cursor is enabled. 300 EXPECT_TRUE(IsLargeCursorEnabled()); 301 302 // Enables spoken feedback. 303 SetSpokenFeedbackEnabled(true); 304 // Confirms that the spoken feedback is enabled. 305 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 306 307 // Enables high contrast. 308 SetHighContrastEnabled(true); 309 // Confirms that high cotrast is enabled. 310 EXPECT_TRUE(IsHighContrastEnabled()); 311 312 // Enables autoclick. 313 SetAutoclickEnabled(true); 314 // Confirms that autoclick is enabled. 315 EXPECT_TRUE(IsAutoclickEnabled()); 316 317 // Test that autoclick delay is set properly. 318 SetAutoclickDelay(kTestAutoclickDelayMs); 319 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 320 321 // Enable on-screen keyboard 322 SetVirtualKeyboardEnabled(true); 323 // Confirm that the on-screen keyboard option is enabled. 324 EXPECT_TRUE(IsVirtualKeyboardEnabled()); 325 } 326 327 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, BrailleOnLoginScreen) { 328 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 329 330 // Signal the accessibility manager that a braille display was connected. 331 SetBrailleDisplayAvailability(true); 332 // Confirms that the spoken feedback is enabled. 333 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 334 } 335 336 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, TypePref) { 337 // Logs in. 338 user_manager::UserManager::Get()->UserLoggedIn( 339 kTestUserName, kTestUserName, true); 340 user_manager::UserManager::Get()->SessionStarted(); 341 342 // Confirms that the features are disabled just after login. 343 EXPECT_FALSE(IsLargeCursorEnabled()); 344 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 345 EXPECT_FALSE(IsHighContrastEnabled()); 346 EXPECT_FALSE(IsAutoclickEnabled()); 347 EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay()); 348 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 349 350 // Sets the pref as true to enable the large cursor. 351 SetLargeCursorEnabledPref(true); 352 // Confirms that the large cursor is enabled. 353 EXPECT_TRUE(IsLargeCursorEnabled()); 354 355 // Sets the pref as true to enable the spoken feedback. 356 SetSpokenFeedbackEnabledPref(true); 357 // Confirms that the spoken feedback is enabled. 358 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 359 360 // Sets the pref as true to enable high contrast mode. 361 SetHighContrastEnabledPref(true); 362 // Confirms that the high contrast mode is enabled. 363 EXPECT_TRUE(IsHighContrastEnabled()); 364 365 // Sets the pref as true to enable autoclick. 366 SetAutoclickEnabledPref(true); 367 // Confirms that autoclick is enabled. 368 EXPECT_TRUE(IsAutoclickEnabled()); 369 370 // Set autoclick delay pref. 371 SetAutoclickDelayPref(kTestAutoclickDelayMs); 372 // Confirm that the correct value is set. 373 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 374 375 // Sets the on-screen keyboard pref. 376 SetVirtualKeyboardEnabledPref(true); 377 // Confirm that the on-screen keyboard option is enabled. 378 EXPECT_TRUE(IsVirtualKeyboardEnabled()); 379 380 SetLargeCursorEnabledPref(false); 381 EXPECT_FALSE(IsLargeCursorEnabled()); 382 383 SetSpokenFeedbackEnabledPref(false); 384 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 385 386 SetHighContrastEnabledPref(false); 387 EXPECT_FALSE(IsHighContrastEnabled()); 388 389 SetAutoclickEnabledPref(false); 390 EXPECT_FALSE(IsAutoclickEnabled()); 391 392 SetVirtualKeyboardEnabledPref(false); 393 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 394 } 395 396 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, ResumeSavedPref) { 397 // Loads the profile of the user. 398 user_manager::UserManager::Get()->UserLoggedIn( 399 kTestUserName, kTestUserName, true); 400 401 // Sets the pref to enable large cursor before login. 402 SetLargeCursorEnabledPref(true); 403 EXPECT_FALSE(IsLargeCursorEnabled()); 404 405 // Sets the pref to enable spoken feedback before login. 406 SetSpokenFeedbackEnabledPref(true); 407 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 408 409 // Sets the pref to enable high contrast before login. 410 SetHighContrastEnabledPref(true); 411 EXPECT_FALSE(IsHighContrastEnabled()); 412 413 // Sets the pref to enable autoclick before login. 414 SetAutoclickEnabledPref(true); 415 EXPECT_FALSE(IsAutoclickEnabled()); 416 417 // Sets the autoclick delay pref before login but the 418 // initial value should not change. 419 SetAutoclickDelayPref(kTestAutoclickDelayMs); 420 EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay()); 421 422 // Sets the pref to enable the on-screen keyboard before login. 423 SetVirtualKeyboardEnabledPref(true); 424 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 425 426 // Logs in. 427 user_manager::UserManager::Get()->SessionStarted(); 428 429 // Confirms that features are enabled by restoring from pref just after login. 430 EXPECT_TRUE(IsLargeCursorEnabled()); 431 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 432 EXPECT_TRUE(IsHighContrastEnabled()); 433 EXPECT_TRUE(IsAutoclickEnabled()); 434 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 435 EXPECT_TRUE(IsVirtualKeyboardEnabled()); 436 } 437 438 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, 439 ChangingTypeInvokesNotification) { 440 MockAccessibilityObserver observer; 441 442 // Logs in. 443 user_manager::UserManager::Get()->UserLoggedIn( 444 kTestUserName, kTestUserName, true); 445 user_manager::UserManager::Get()->SessionStarted(); 446 447 EXPECT_FALSE(observer.observed()); 448 observer.reset(); 449 450 SetSpokenFeedbackEnabled(true); 451 EXPECT_TRUE(observer.observed()); 452 EXPECT_TRUE(observer.observed_enabled()); 453 EXPECT_EQ(observer.observed_type(), 454 ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 455 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 456 457 observer.reset(); 458 SetSpokenFeedbackEnabled(false); 459 EXPECT_TRUE(observer.observed()); 460 EXPECT_FALSE(observer.observed_enabled()); 461 EXPECT_EQ(observer.observed_type(), 462 ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 463 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 464 465 observer.reset(); 466 SetHighContrastEnabled(true); 467 EXPECT_TRUE(observer.observed()); 468 EXPECT_TRUE(observer.observed_enabled()); 469 EXPECT_EQ(observer.observed_type(), 470 ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 471 EXPECT_TRUE(IsHighContrastEnabled()); 472 473 observer.reset(); 474 SetHighContrastEnabled(false); 475 EXPECT_TRUE(observer.observed()); 476 EXPECT_FALSE(observer.observed_enabled()); 477 EXPECT_EQ(observer.observed_type(), 478 ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 479 EXPECT_FALSE(IsHighContrastEnabled()); 480 481 observer.reset(); 482 SetVirtualKeyboardEnabled(true); 483 EXPECT_TRUE(observer.observed()); 484 EXPECT_TRUE(observer.observed_enabled()); 485 EXPECT_EQ(observer.observed_type(), 486 ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD); 487 EXPECT_TRUE(IsVirtualKeyboardEnabled()); 488 489 observer.reset(); 490 SetVirtualKeyboardEnabled(false); 491 EXPECT_TRUE(observer.observed()); 492 EXPECT_FALSE(observer.observed_enabled()); 493 EXPECT_EQ(observer.observed_type(), 494 ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD); 495 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 496 } 497 498 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, 499 ChangingTypePrefInvokesNotification) { 500 MockAccessibilityObserver observer; 501 502 // Logs in. 503 user_manager::UserManager::Get()->UserLoggedIn( 504 kTestUserName, kTestUserName, true); 505 user_manager::UserManager::Get()->SessionStarted(); 506 507 EXPECT_FALSE(observer.observed()); 508 observer.reset(); 509 510 SetSpokenFeedbackEnabledPref(true); 511 EXPECT_TRUE(observer.observed()); 512 EXPECT_TRUE(observer.observed_enabled()); 513 EXPECT_EQ(observer.observed_type(), 514 ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 515 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 516 517 observer.reset(); 518 SetSpokenFeedbackEnabledPref(false); 519 EXPECT_TRUE(observer.observed()); 520 EXPECT_FALSE(observer.observed_enabled()); 521 EXPECT_EQ(observer.observed_type(), 522 ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK); 523 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 524 525 observer.reset(); 526 SetHighContrastEnabledPref(true); 527 EXPECT_TRUE(observer.observed()); 528 EXPECT_TRUE(observer.observed_enabled()); 529 EXPECT_EQ(observer.observed_type(), 530 ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 531 EXPECT_TRUE(IsHighContrastEnabled()); 532 533 observer.reset(); 534 SetHighContrastEnabledPref(false); 535 EXPECT_TRUE(observer.observed()); 536 EXPECT_FALSE(observer.observed_enabled()); 537 EXPECT_EQ(observer.observed_type(), 538 ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE); 539 EXPECT_FALSE(IsHighContrastEnabled()); 540 541 observer.reset(); 542 SetVirtualKeyboardEnabledPref(true); 543 EXPECT_TRUE(observer.observed()); 544 EXPECT_TRUE(observer.observed_enabled()); 545 EXPECT_EQ(observer.observed_type(), 546 ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD); 547 EXPECT_TRUE(IsVirtualKeyboardEnabled()); 548 549 observer.reset(); 550 SetVirtualKeyboardEnabledPref(false); 551 EXPECT_TRUE(observer.observed()); 552 EXPECT_FALSE(observer.observed_enabled()); 553 EXPECT_EQ(observer.observed_type(), 554 ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD); 555 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 556 } 557 558 class AccessibilityManagerUserTypeTest 559 : public AccessibilityManagerTest, 560 public ::testing::WithParamInterface<const char*> { 561 protected: 562 AccessibilityManagerUserTypeTest() {} 563 virtual ~AccessibilityManagerUserTypeTest() {} 564 565 DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerUserTypeTest); 566 }; 567 568 // TODO(yoshiki): Enable a test for retail mode. 569 INSTANTIATE_TEST_CASE_P( 570 UserTypeInstantiation, 571 AccessibilityManagerUserTypeTest, 572 ::testing::Values(kTestUserName, 573 chromeos::login::kGuestUserName, 574 // chromeos::login::kRetailModeUserName, 575 kTestSupervisedUserName)); 576 577 IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest, 578 EnableOnLoginScreenAndLogin) { 579 // Enables large cursor. 580 SetLargeCursorEnabled(true); 581 EXPECT_TRUE(IsLargeCursorEnabled()); 582 // Enables spoken feedback. 583 SetSpokenFeedbackEnabled(true); 584 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 585 // Enables high contrast. 586 SetHighContrastEnabled(true); 587 EXPECT_TRUE(IsHighContrastEnabled()); 588 // Enables autoclick. 589 SetAutoclickEnabled(true); 590 EXPECT_TRUE(IsAutoclickEnabled()); 591 // Set autoclick delay. 592 SetAutoclickDelay(kTestAutoclickDelayMs); 593 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 594 595 // Logs in. 596 const char* user_name = GetParam(); 597 user_manager::UserManager::Get()->UserLoggedIn(user_name, user_name, true); 598 599 // Confirms that the features are still enabled just after login. 600 EXPECT_TRUE(IsLargeCursorEnabled()); 601 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 602 EXPECT_TRUE(IsHighContrastEnabled()); 603 EXPECT_TRUE(IsAutoclickEnabled()); 604 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 605 606 user_manager::UserManager::Get()->SessionStarted(); 607 608 // Confirms that the features keep enabled after session starts. 609 EXPECT_TRUE(IsLargeCursorEnabled()); 610 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 611 EXPECT_TRUE(IsHighContrastEnabled()); 612 EXPECT_TRUE(IsAutoclickEnabled()); 613 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay()); 614 615 // Confirms that the prefs have been copied to the user's profile. 616 EXPECT_TRUE(GetLargeCursorEnabledFromPref()); 617 EXPECT_TRUE(GetSpokenFeedbackEnabledFromPref()); 618 EXPECT_TRUE(GetHighContrastEnabledFromPref()); 619 EXPECT_TRUE(GetAutoclickEnabledFromPref()); 620 EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelayFromPref()); 621 } 622 623 IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest, BrailleWhenLoggedIn) { 624 // Logs in. 625 const char* user_name = GetParam(); 626 user_manager::UserManager::Get()->UserLoggedIn(user_name, user_name, true); 627 user_manager::UserManager::Get()->SessionStarted(); 628 // This object watches for IME preference changes and reflects those in 629 // the IME framework state. 630 chromeos::Preferences prefs; 631 prefs.InitUserPrefsForTesting( 632 PrefServiceSyncable::FromProfile(GetProfile()), 633 user_manager::UserManager::Get()->GetActiveUser(), 634 UserSessionManager::GetInstance()->GetDefaultIMEState(GetProfile())); 635 636 // Make sure we start in the expected state. 637 EXPECT_FALSE(IsBrailleImeActive()); 638 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 639 640 // Signal the accessibility manager that a braille display was connected. 641 SetBrailleDisplayAvailability(true); 642 643 // Now, both spoken feedback and the Braille IME should be enabled. 644 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 645 EXPECT_TRUE(IsBrailleImeActive()); 646 647 // Send a braille dots key event and make sure that the braille IME is 648 // enabled. 649 KeyEvent event; 650 event.command = extensions::api::braille_display_private::KEY_COMMAND_DOTS; 651 event.braille_dots.reset(new int(0)); 652 braille_controller_.GetObserver()->OnBrailleKeyEvent(event); 653 EXPECT_TRUE(IsBrailleImeCurrent()); 654 655 // Unplug the display. Spolken feedback remains on, but the Braille IME 656 // should get deactivated. 657 SetBrailleDisplayAvailability(false); 658 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 659 EXPECT_FALSE(IsBrailleImeActive()); 660 EXPECT_FALSE(IsBrailleImeCurrent()); 661 662 // Plugging in a display while spoken feedback is enabled should activate 663 // the Braille IME. 664 SetBrailleDisplayAvailability(true); 665 EXPECT_TRUE(IsSpokenFeedbackEnabled()); 666 EXPECT_TRUE(IsBrailleImeActive()); 667 } 668 669 IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, AcessibilityMenuVisibility) { 670 // Log in. 671 user_manager::UserManager::Get()->UserLoggedIn( 672 kTestUserName, kTestUserName, true); 673 user_manager::UserManager::Get()->SessionStarted(); 674 675 // Confirms that the features are disabled. 676 EXPECT_FALSE(IsLargeCursorEnabled()); 677 EXPECT_FALSE(IsSpokenFeedbackEnabled()); 678 EXPECT_FALSE(IsHighContrastEnabled()); 679 EXPECT_FALSE(IsAutoclickEnabled()); 680 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 681 EXPECT_FALSE(IsVirtualKeyboardEnabled()); 682 683 // Check large cursor. 684 SetLargeCursorEnabled(true); 685 EXPECT_TRUE(ShouldShowAccessibilityMenu()); 686 SetLargeCursorEnabled(false); 687 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 688 689 // Check spoken feedback. 690 SetSpokenFeedbackEnabled(true); 691 EXPECT_TRUE(ShouldShowAccessibilityMenu()); 692 SetSpokenFeedbackEnabled(false); 693 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 694 695 // Check high contrast. 696 SetHighContrastEnabled(true); 697 EXPECT_TRUE(ShouldShowAccessibilityMenu()); 698 SetHighContrastEnabled(false); 699 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 700 701 // Check autoclick. 702 SetAutoclickEnabled(true); 703 EXPECT_TRUE(ShouldShowAccessibilityMenu()); 704 SetAutoclickEnabled(false); 705 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 706 707 // Check on-screen keyboard. 708 SetVirtualKeyboardEnabled(true); 709 EXPECT_TRUE(ShouldShowAccessibilityMenu()); 710 SetVirtualKeyboardEnabled(false); 711 EXPECT_FALSE(ShouldShowAccessibilityMenu()); 712 } 713 714 } // namespace chromeos 715