1 // Copyright (c) 2012 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 "ash/magnifier/magnification_controller.h" 6 #include "ash/shell.h" 7 #include "ash/system/tray/system_tray.h" 8 #include "ash/system/tray_accessibility.h" 9 #include "ash/system/user/login_status.h" 10 #include "base/callback.h" 11 #include "base/command_line.h" 12 #include "base/prefs/pref_service.h" 13 #include "base/strings/utf_string_conversions.h" 14 #include "chrome/browser/browser_process.h" 15 #include "chrome/browser/chrome_notification_types.h" 16 #include "chrome/browser/chromeos/accessibility/accessibility_manager.h" 17 #include "chrome/browser/chromeos/accessibility/magnification_manager.h" 18 #include "chrome/browser/chromeos/login/helper.h" 19 #include "chrome/browser/chromeos/login/login_utils.h" 20 #include "chrome/browser/chromeos/login/startup_utils.h" 21 #include "chrome/browser/chromeos/login/users/user_manager.h" 22 #include "chrome/browser/chromeos/login/users/user_manager_impl.h" 23 #include "chrome/browser/extensions/api/braille_display_private/mock_braille_controller.h" 24 #include "chrome/browser/profiles/profile.h" 25 #include "chrome/browser/profiles/profile_manager.h" 26 #include "chrome/common/chrome_switches.h" 27 #include "chrome/common/pref_names.h" 28 #include "chrome/test/base/in_process_browser_test.h" 29 #include "chrome/test/base/testing_profile.h" 30 #include "chromeos/chromeos_switches.h" 31 #include "components/policy/core/browser/browser_policy_connector.h" 32 #include "components/policy/core/common/external_data_fetcher.h" 33 #include "components/policy/core/common/mock_configuration_policy_provider.h" 34 #include "components/policy/core/common/policy_map.h" 35 #include "components/policy/core/common/policy_types.h" 36 #include "content/public/test/test_utils.h" 37 #include "policy/policy_constants.h" 38 #include "testing/gtest/include/gtest/gtest.h" 39 #include "ui/views/controls/label.h" 40 #include "ui/views/widget/widget.h" 41 42 using extensions::api::braille_display_private::BrailleObserver; 43 using extensions::api::braille_display_private::DisplayState; 44 using extensions::api::braille_display_private::MockBrailleController; 45 using testing::Return; 46 using testing::_; 47 using testing::WithParamInterface; 48 49 namespace chromeos { 50 51 enum PrefSettingMechanism { 52 PREF_SERVICE, 53 POLICY, 54 }; 55 56 void SetMagnifierEnabled(bool enabled) { 57 MagnificationManager::Get()->SetMagnifierEnabled(enabled); 58 } 59 60 class TrayAccessibilityTest 61 : public InProcessBrowserTest, 62 public WithParamInterface<PrefSettingMechanism> { 63 protected: 64 TrayAccessibilityTest() {} 65 virtual ~TrayAccessibilityTest() {} 66 67 // The profile which should be used by these tests. 68 Profile* GetProfile() { return ProfileManager::GetActiveUserProfile(); } 69 70 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 71 EXPECT_CALL(provider_, IsInitializationComplete(_)) 72 .WillRepeatedly(Return(true)); 73 policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_); 74 AccessibilityManager::SetBrailleControllerForTest(&braille_controller_); 75 } 76 77 virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE { 78 command_line->AppendSwitch(switches::kLoginManager); 79 command_line->AppendSwitchASCII(switches::kLoginProfile, 80 TestingProfile::kTestUserProfileDir); 81 } 82 83 virtual void SetUpOnMainThread() OVERRIDE { 84 AccessibilityManager::Get()->SetProfileForTest(GetProfile()); 85 MagnificationManager::Get()->SetProfileForTest(GetProfile()); 86 } 87 88 virtual void RunTestOnMainThreadLoop() OVERRIDE { 89 // Need to mark oobe completed to show detailed views. 90 StartupUtils::MarkOobeCompleted(); 91 InProcessBrowserTest::RunTestOnMainThreadLoop(); 92 } 93 94 virtual void CleanUpOnMainThread() OVERRIDE { 95 AccessibilityManager::SetBrailleControllerForTest(NULL); 96 } 97 98 void SetShowAccessibilityOptionsInSystemTrayMenu(bool value) { 99 if (GetParam() == PREF_SERVICE) { 100 PrefService* prefs = GetProfile()->GetPrefs(); 101 prefs->SetBoolean(prefs::kShouldAlwaysShowAccessibilityMenu, value); 102 } else if (GetParam() == POLICY) { 103 policy::PolicyMap policy_map; 104 policy_map.Set(policy::key::kShowAccessibilityOptionsInSystemTrayMenu, 105 policy::POLICY_LEVEL_MANDATORY, 106 policy::POLICY_SCOPE_USER, 107 base::Value::CreateBooleanValue(value), 108 NULL); 109 provider_.UpdateChromePolicy(policy_map); 110 base::RunLoop().RunUntilIdle(); 111 } else { 112 FAIL() << "Unknown test parameterization"; 113 } 114 } 115 116 ash::TrayAccessibility* tray() { 117 return ash::Shell::GetInstance()->GetPrimarySystemTray()-> 118 GetTrayAccessibilityForTest(); 119 } 120 121 const ash::TrayAccessibility* tray() const { 122 return ash::Shell::GetInstance() 123 ->GetPrimarySystemTray() 124 ->GetTrayAccessibilityForTest(); 125 } 126 127 bool IsTrayIconVisible() const { return tray()->tray_icon_visible_; } 128 129 views::View* CreateMenuItem() { 130 return tray()->CreateDefaultView(GetLoginStatus()); 131 } 132 133 void DestroyMenuItem() { 134 return tray()->DestroyDefaultView(); 135 } 136 137 bool CanCreateMenuItem() { 138 views::View* menu_item_view = CreateMenuItem(); 139 DestroyMenuItem(); 140 return menu_item_view != NULL; 141 } 142 143 void SetLoginStatus(ash::user::LoginStatus status) { 144 tray()->UpdateAfterLoginStatusChange(status); 145 } 146 147 ash::user::LoginStatus GetLoginStatus() { 148 return tray()->login_; 149 } 150 151 bool CreateDetailedMenu() { 152 tray()->PopupDetailedView(0, false); 153 return tray()->detailed_menu_ != NULL; 154 } 155 156 void CloseDetailMenu() { 157 CHECK(tray()->detailed_menu_); 158 tray()->DestroyDetailedView(); 159 tray()->detailed_menu_ = NULL; 160 } 161 162 void ClickSpokenFeedbackOnDetailMenu() { 163 views::View* button = tray()->detailed_menu_->spoken_feedback_view_; 164 ASSERT_TRUE(button); 165 tray()->detailed_menu_->OnViewClicked(button); 166 } 167 168 void ClickHighContrastOnDetailMenu() { 169 views::View* button = tray()->detailed_menu_->high_contrast_view_; 170 ASSERT_TRUE(button); 171 tray()->detailed_menu_->OnViewClicked(button); 172 } 173 174 void ClickScreenMagnifierOnDetailMenu() { 175 views::View* button = tray()->detailed_menu_->screen_magnifier_view_; 176 ASSERT_TRUE(button); 177 tray()->detailed_menu_->OnViewClicked(button); 178 } 179 180 void ClickAutoclickOnDetailMenu() { 181 views::View* button = tray()->detailed_menu_->autoclick_view_; 182 ASSERT_TRUE(button); 183 tray()->detailed_menu_->OnViewClicked(button); 184 } 185 186 void ClickVirtualKeyboardOnDetailMenu() { 187 views::View* button = tray()->detailed_menu_->virtual_keyboard_view_; 188 ASSERT_TRUE(button); 189 tray()->detailed_menu_->OnViewClicked(button); 190 } 191 192 bool IsSpokenFeedbackEnabledOnDetailMenu() const { 193 return tray()->detailed_menu_->spoken_feedback_enabled_; 194 } 195 196 bool IsHighContrastEnabledOnDetailMenu() const { 197 return tray()->detailed_menu_->high_contrast_enabled_; 198 } 199 200 bool IsScreenMagnifierEnabledOnDetailMenu() const { 201 return tray()->detailed_menu_->screen_magnifier_enabled_; 202 } 203 204 bool IsLargeCursorEnabledOnDetailMenu() const { 205 return tray()->detailed_menu_->large_cursor_enabled_; 206 } 207 208 bool IsAutoclickEnabledOnDetailMenu() const { 209 return tray()->detailed_menu_->autoclick_enabled_; 210 } 211 212 bool IsVirtualKeyboardEnabledOnDetailMenu() const { 213 return tray()->detailed_menu_->virtual_keyboard_enabled_; 214 } 215 216 bool IsSpokenFeedbackMenuShownOnDetailMenu() const { 217 return tray()->detailed_menu_->spoken_feedback_view_; 218 } 219 220 bool IsHighContrastMenuShownOnDetailMenu() const { 221 return tray()->detailed_menu_->high_contrast_view_; 222 } 223 224 bool IsScreenMagnifierMenuShownOnDetailMenu() const { 225 return tray()->detailed_menu_->screen_magnifier_view_; 226 } 227 228 bool IsLargeCursorMenuShownOnDetailMenu() const { 229 return tray()->detailed_menu_->large_cursor_view_; 230 } 231 232 bool IsAutoclickMenuShownOnDetailMenu() const { 233 return tray()->detailed_menu_->autoclick_view_; 234 } 235 236 bool IsVirtualKeyboardMenuShownOnDetailMenu() const { 237 return tray()->detailed_menu_->virtual_keyboard_view_; 238 } 239 240 bool IsNotificationShown() const { 241 return (tray()->detailed_popup_ && 242 !tray()->detailed_popup_->GetWidget()->IsClosed()); 243 } 244 245 base::string16 GetNotificationText() const { 246 if (IsNotificationShown()) 247 return tray()->detailed_popup_->label_for_test()->text(); 248 else 249 return base::string16(); 250 } 251 252 void SetBrailleConnected(bool connected) { 253 braille_controller_.SetAvailable(connected); 254 braille_controller_.GetObserver()->OnBrailleDisplayStateChanged( 255 *braille_controller_.GetDisplayState()); 256 } 257 258 policy::MockConfigurationPolicyProvider provider_; 259 MockBrailleController braille_controller_; 260 }; 261 262 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, LoginStatus) { 263 EXPECT_EQ(ash::user::LOGGED_IN_NONE, GetLoginStatus()); 264 265 UserManager::Get()->UserLoggedIn( 266 "owner (at) invalid.domain", "owner (at) invalid.domain", true); 267 UserManager::Get()->SessionStarted(); 268 269 EXPECT_EQ(ash::user::LOGGED_IN_USER, GetLoginStatus()); 270 } 271 272 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowTrayIcon) { 273 SetLoginStatus(ash::user::LOGGED_IN_NONE); 274 275 // Confirms that the icon is invisible before login. 276 EXPECT_FALSE(IsTrayIconVisible()); 277 278 UserManager::Get()->UserLoggedIn( 279 "owner (at) invalid.domain", "owner (at) invalid.domain", true); 280 UserManager::Get()->SessionStarted(); 281 282 // Confirms that the icon is invisible just after login. 283 EXPECT_FALSE(IsTrayIconVisible()); 284 285 // Toggling spoken feedback changes the visibillity of the icon. 286 AccessibilityManager::Get()->EnableSpokenFeedback( 287 true, ash::A11Y_NOTIFICATION_NONE); 288 EXPECT_TRUE(IsTrayIconVisible()); 289 AccessibilityManager::Get()->EnableSpokenFeedback( 290 false, ash::A11Y_NOTIFICATION_NONE); 291 EXPECT_FALSE(IsTrayIconVisible()); 292 293 // Toggling high contrast the visibillity of the icon. 294 AccessibilityManager::Get()->EnableHighContrast(true); 295 EXPECT_TRUE(IsTrayIconVisible()); 296 AccessibilityManager::Get()->EnableHighContrast(false); 297 EXPECT_FALSE(IsTrayIconVisible()); 298 299 // Toggling magnifier the visibility of the icon. 300 SetMagnifierEnabled(true); 301 EXPECT_TRUE(IsTrayIconVisible()); 302 SetMagnifierEnabled(false); 303 EXPECT_FALSE(IsTrayIconVisible()); 304 305 // Toggling the virtual keyboard setting changes the visibility of the a11y 306 // icon. 307 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 308 EXPECT_TRUE(IsTrayIconVisible()); 309 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 310 EXPECT_FALSE(IsTrayIconVisible()); 311 312 // Enabling all accessibility features. 313 SetMagnifierEnabled(true); 314 EXPECT_TRUE(IsTrayIconVisible()); 315 AccessibilityManager::Get()->EnableHighContrast(true); 316 EXPECT_TRUE(IsTrayIconVisible()); 317 AccessibilityManager::Get()->EnableSpokenFeedback( 318 true, ash::A11Y_NOTIFICATION_NONE); 319 EXPECT_TRUE(IsTrayIconVisible()); 320 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 321 EXPECT_TRUE(IsTrayIconVisible()); 322 AccessibilityManager::Get()->EnableSpokenFeedback( 323 false, ash::A11Y_NOTIFICATION_NONE); 324 EXPECT_TRUE(IsTrayIconVisible()); 325 AccessibilityManager::Get()->EnableHighContrast(false); 326 EXPECT_TRUE(IsTrayIconVisible()); 327 SetMagnifierEnabled(false); 328 EXPECT_TRUE(IsTrayIconVisible()); 329 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 330 EXPECT_FALSE(IsTrayIconVisible()); 331 332 // Confirms that prefs::kShouldAlwaysShowAccessibilityMenu doesn't affect 333 // the icon on the tray. 334 SetShowAccessibilityOptionsInSystemTrayMenu(true); 335 AccessibilityManager::Get()->EnableHighContrast(true); 336 EXPECT_TRUE(IsTrayIconVisible()); 337 AccessibilityManager::Get()->EnableHighContrast(false); 338 EXPECT_FALSE(IsTrayIconVisible()); 339 } 340 341 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenu) { 342 // Login 343 UserManager::Get()->UserLoggedIn( 344 "owner (at) invalid.domain", "owner (at) invalid.domain", true); 345 UserManager::Get()->SessionStarted(); 346 347 SetShowAccessibilityOptionsInSystemTrayMenu(false); 348 349 // Confirms that the menu is hidden. 350 EXPECT_FALSE(CanCreateMenuItem()); 351 352 // Toggling spoken feedback changes the visibillity of the menu. 353 AccessibilityManager::Get()->EnableSpokenFeedback( 354 true, ash::A11Y_NOTIFICATION_NONE); 355 EXPECT_TRUE(CanCreateMenuItem()); 356 AccessibilityManager::Get()->EnableSpokenFeedback( 357 false, ash::A11Y_NOTIFICATION_NONE); 358 EXPECT_FALSE(CanCreateMenuItem()); 359 360 // Toggling high contrast changes the visibillity of the menu. 361 AccessibilityManager::Get()->EnableHighContrast(true); 362 EXPECT_TRUE(CanCreateMenuItem()); 363 AccessibilityManager::Get()->EnableHighContrast(false); 364 EXPECT_FALSE(CanCreateMenuItem()); 365 366 // Toggling screen magnifier changes the visibility of the menu. 367 SetMagnifierEnabled(true); 368 EXPECT_TRUE(CanCreateMenuItem()); 369 SetMagnifierEnabled(false); 370 EXPECT_FALSE(CanCreateMenuItem()); 371 372 // Toggling autoclick changes the visibility of the menu. 373 AccessibilityManager::Get()->EnableAutoclick(true); 374 EXPECT_TRUE(CanCreateMenuItem()); 375 AccessibilityManager::Get()->EnableAutoclick(false); 376 EXPECT_FALSE(CanCreateMenuItem()); 377 378 // Toggling virtual keyboard changes the visibility of the menu. 379 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 380 EXPECT_TRUE(CanCreateMenuItem()); 381 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 382 EXPECT_FALSE(CanCreateMenuItem()); 383 384 // Enabling all accessibility features. 385 SetMagnifierEnabled(true); 386 EXPECT_TRUE(CanCreateMenuItem()); 387 AccessibilityManager::Get()->EnableHighContrast(true); 388 EXPECT_TRUE(CanCreateMenuItem()); 389 AccessibilityManager::Get()->EnableSpokenFeedback( 390 true, ash::A11Y_NOTIFICATION_NONE); 391 EXPECT_TRUE(CanCreateMenuItem()); 392 AccessibilityManager::Get()->EnableAutoclick(true); 393 EXPECT_TRUE(CanCreateMenuItem()); 394 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 395 EXPECT_TRUE(CanCreateMenuItem()); 396 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 397 EXPECT_TRUE(CanCreateMenuItem()); 398 AccessibilityManager::Get()->EnableAutoclick(false); 399 EXPECT_TRUE(CanCreateMenuItem()); 400 AccessibilityManager::Get()->EnableSpokenFeedback( 401 false, ash::A11Y_NOTIFICATION_NONE); 402 EXPECT_TRUE(CanCreateMenuItem()); 403 AccessibilityManager::Get()->EnableHighContrast(false); 404 EXPECT_TRUE(CanCreateMenuItem()); 405 SetMagnifierEnabled(false); 406 EXPECT_FALSE(CanCreateMenuItem()); 407 } 408 409 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenuWithShowMenuOption) { 410 // Login 411 UserManager::Get()->UserLoggedIn( 412 "owner (at) invalid.domain", "owner (at) invalid.domain", true); 413 UserManager::Get()->SessionStarted(); 414 415 SetShowAccessibilityOptionsInSystemTrayMenu(true); 416 417 // Confirms that the menu is visible. 418 EXPECT_TRUE(CanCreateMenuItem()); 419 420 // The menu remains visible regardless of toggling spoken feedback. 421 AccessibilityManager::Get()->EnableSpokenFeedback( 422 true, ash::A11Y_NOTIFICATION_NONE); 423 EXPECT_TRUE(CanCreateMenuItem()); 424 AccessibilityManager::Get()->EnableSpokenFeedback( 425 false, ash::A11Y_NOTIFICATION_NONE); 426 EXPECT_TRUE(CanCreateMenuItem()); 427 428 // The menu remains visible regardless of toggling high contrast. 429 AccessibilityManager::Get()->EnableHighContrast(true); 430 EXPECT_TRUE(CanCreateMenuItem()); 431 AccessibilityManager::Get()->EnableHighContrast(false); 432 EXPECT_TRUE(CanCreateMenuItem()); 433 434 // The menu remains visible regardless of toggling screen magnifier. 435 SetMagnifierEnabled(true); 436 EXPECT_TRUE(CanCreateMenuItem()); 437 SetMagnifierEnabled(false); 438 EXPECT_TRUE(CanCreateMenuItem()); 439 440 // The menu remains visible regardless of toggling autoclick. 441 AccessibilityManager::Get()->EnableAutoclick(true); 442 EXPECT_TRUE(CanCreateMenuItem()); 443 AccessibilityManager::Get()->EnableAutoclick(false); 444 EXPECT_TRUE(CanCreateMenuItem()); 445 446 // The menu remains visible regardless of toggling on-screen keyboard. 447 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 448 EXPECT_TRUE(CanCreateMenuItem()); 449 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 450 EXPECT_TRUE(CanCreateMenuItem()); 451 452 // Enabling all accessibility features. 453 SetMagnifierEnabled(true); 454 EXPECT_TRUE(CanCreateMenuItem()); 455 AccessibilityManager::Get()->EnableHighContrast(true); 456 EXPECT_TRUE(CanCreateMenuItem()); 457 AccessibilityManager::Get()->EnableSpokenFeedback( 458 true, ash::A11Y_NOTIFICATION_NONE); 459 EXPECT_TRUE(CanCreateMenuItem()); 460 AccessibilityManager::Get()->EnableAutoclick(true); 461 EXPECT_TRUE(CanCreateMenuItem()); 462 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 463 EXPECT_TRUE(CanCreateMenuItem()); 464 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 465 EXPECT_TRUE(CanCreateMenuItem()); 466 AccessibilityManager::Get()->EnableAutoclick(false); 467 EXPECT_TRUE(CanCreateMenuItem()); 468 AccessibilityManager::Get()->EnableSpokenFeedback( 469 false, ash::A11Y_NOTIFICATION_NONE); 470 EXPECT_TRUE(CanCreateMenuItem()); 471 AccessibilityManager::Get()->EnableHighContrast(false); 472 EXPECT_TRUE(CanCreateMenuItem()); 473 SetMagnifierEnabled(false); 474 EXPECT_TRUE(CanCreateMenuItem()); 475 476 SetShowAccessibilityOptionsInSystemTrayMenu(false); 477 478 // Confirms that the menu is invisible. 479 EXPECT_FALSE(CanCreateMenuItem()); 480 } 481 482 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenuWithShowOnLoginScreen) { 483 SetLoginStatus(ash::user::LOGGED_IN_NONE); 484 485 // Confirms that the menu is visible. 486 EXPECT_TRUE(CanCreateMenuItem()); 487 488 // The menu remains visible regardless of toggling spoken feedback. 489 AccessibilityManager::Get()->EnableSpokenFeedback( 490 true, ash::A11Y_NOTIFICATION_NONE); 491 EXPECT_TRUE(CanCreateMenuItem()); 492 AccessibilityManager::Get()->EnableSpokenFeedback( 493 false, ash::A11Y_NOTIFICATION_NONE); 494 EXPECT_TRUE(CanCreateMenuItem()); 495 496 // The menu remains visible regardless of toggling high contrast. 497 AccessibilityManager::Get()->EnableHighContrast(true); 498 EXPECT_TRUE(CanCreateMenuItem()); 499 AccessibilityManager::Get()->EnableHighContrast(false); 500 EXPECT_TRUE(CanCreateMenuItem()); 501 502 // The menu remains visible regardless of toggling screen magnifier. 503 SetMagnifierEnabled(true); 504 EXPECT_TRUE(CanCreateMenuItem()); 505 SetMagnifierEnabled(false); 506 EXPECT_TRUE(CanCreateMenuItem()); 507 508 // The menu remains visible regardless of toggling on-screen keyboard. 509 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 510 EXPECT_TRUE(CanCreateMenuItem()); 511 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 512 EXPECT_TRUE(CanCreateMenuItem()); 513 514 // Enabling all accessibility features. 515 SetMagnifierEnabled(true); 516 EXPECT_TRUE(CanCreateMenuItem()); 517 AccessibilityManager::Get()->EnableHighContrast(true); 518 EXPECT_TRUE(CanCreateMenuItem()); 519 AccessibilityManager::Get()->EnableSpokenFeedback( 520 true, ash::A11Y_NOTIFICATION_NONE); 521 EXPECT_TRUE(CanCreateMenuItem()); 522 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 523 EXPECT_TRUE(CanCreateMenuItem()); 524 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 525 EXPECT_TRUE(CanCreateMenuItem()); 526 AccessibilityManager::Get()->EnableSpokenFeedback( 527 false, ash::A11Y_NOTIFICATION_NONE); 528 EXPECT_TRUE(CanCreateMenuItem()); 529 AccessibilityManager::Get()->EnableHighContrast(false); 530 EXPECT_TRUE(CanCreateMenuItem()); 531 SetMagnifierEnabled(false); 532 EXPECT_TRUE(CanCreateMenuItem()); 533 534 SetShowAccessibilityOptionsInSystemTrayMenu(true); 535 536 // Confirms that the menu remains visible. 537 EXPECT_TRUE(CanCreateMenuItem()); 538 539 SetShowAccessibilityOptionsInSystemTrayMenu(false); 540 541 // Confirms that the menu remains visible. 542 EXPECT_TRUE(CanCreateMenuItem()); 543 } 544 545 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowNotification) { 546 const base::string16 BRAILLE_CONNECTED = 547 base::ASCIIToUTF16("Braille display connected."); 548 const base::string16 CHROMEVOX_ENABLED = base::ASCIIToUTF16( 549 "ChromeVox (spoken feedback) is enabled.\nPress Ctrl+Alt+Z to disable."); 550 const base::string16 BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED( 551 BRAILLE_CONNECTED + base::ASCIIToUTF16(" ") + CHROMEVOX_ENABLED); 552 553 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 554 555 // Enabling spoken feedback should show the notification. 556 AccessibilityManager::Get()->EnableSpokenFeedback( 557 true, ash::A11Y_NOTIFICATION_SHOW); 558 EXPECT_EQ(CHROMEVOX_ENABLED, GetNotificationText()); 559 560 // Connecting a braille display when spoken feedback is already enabled 561 // should only show the message about the braille display. 562 SetBrailleConnected(true); 563 EXPECT_EQ(BRAILLE_CONNECTED, GetNotificationText()); 564 565 // Neither disconnecting a braille display, nor disabling spoken feedback 566 // should show any notification. 567 SetBrailleConnected(false); 568 EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 569 EXPECT_FALSE(IsNotificationShown()); 570 AccessibilityManager::Get()->EnableSpokenFeedback( 571 false, ash::A11Y_NOTIFICATION_SHOW); 572 EXPECT_FALSE(IsNotificationShown()); 573 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 574 575 // Connecting a braille display should enable spoken feedback and show 576 // both messages. 577 SetBrailleConnected(true); 578 EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 579 EXPECT_EQ(BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED, GetNotificationText()); 580 } 581 582 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, KeepMenuVisibilityOnLockScreen) { 583 // Enables high contrast mode. 584 AccessibilityManager::Get()->EnableHighContrast(true); 585 EXPECT_TRUE(CanCreateMenuItem()); 586 587 // Locks the screen. 588 SetLoginStatus(ash::user::LOGGED_IN_LOCKED); 589 EXPECT_TRUE(CanCreateMenuItem()); 590 591 // Disables high contrast mode. 592 AccessibilityManager::Get()->EnableHighContrast(false); 593 594 // Confirms that the menu is still visible. 595 EXPECT_TRUE(CanCreateMenuItem()); 596 } 597 598 #if defined(OS_CHROMEOS) 599 #define MAYBE_ClickDetailMenu DISABLED_ClickDetailMenu 600 #else 601 #define MAYBE_ClickDetailMenu ClickDetailMenu 602 #endif 603 604 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, MAYBE_ClickDetailMenu) { 605 // Confirms that the check item toggles the spoken feedback. 606 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 607 608 EXPECT_TRUE(CreateDetailedMenu()); 609 ClickSpokenFeedbackOnDetailMenu(); 610 EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 611 612 EXPECT_TRUE(CreateDetailedMenu()); 613 ClickSpokenFeedbackOnDetailMenu(); 614 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled()); 615 616 // Confirms that the check item toggles the high contrast. 617 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled()); 618 619 EXPECT_TRUE(CreateDetailedMenu()); 620 ClickHighContrastOnDetailMenu(); 621 EXPECT_TRUE(AccessibilityManager::Get()->IsHighContrastEnabled()); 622 623 EXPECT_TRUE(CreateDetailedMenu()); 624 ClickHighContrastOnDetailMenu(); 625 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled()); 626 627 // Confirms that the check item toggles the magnifier. 628 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled()); 629 630 EXPECT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled()); 631 EXPECT_TRUE(CreateDetailedMenu()); 632 ClickScreenMagnifierOnDetailMenu(); 633 EXPECT_TRUE(MagnificationManager::Get()->IsMagnifierEnabled()); 634 635 EXPECT_TRUE(CreateDetailedMenu()); 636 ClickScreenMagnifierOnDetailMenu(); 637 EXPECT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled()); 638 639 // Confirms that the check item toggles autoclick. 640 EXPECT_FALSE(AccessibilityManager::Get()->IsAutoclickEnabled()); 641 642 EXPECT_TRUE(CreateDetailedMenu()); 643 ClickAutoclickOnDetailMenu(); 644 EXPECT_TRUE(AccessibilityManager::Get()->IsAutoclickEnabled()); 645 646 EXPECT_TRUE(CreateDetailedMenu()); 647 ClickAutoclickOnDetailMenu(); 648 EXPECT_FALSE(AccessibilityManager::Get()->IsAutoclickEnabled()); 649 650 // Confirms that the check item toggles on-screen keyboard. 651 EXPECT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled()); 652 653 EXPECT_TRUE(CreateDetailedMenu()); 654 ClickVirtualKeyboardOnDetailMenu(); 655 EXPECT_TRUE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled()); 656 657 EXPECT_TRUE(CreateDetailedMenu()); 658 ClickVirtualKeyboardOnDetailMenu(); 659 EXPECT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled()); 660 } 661 662 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, CheckMarksOnDetailMenu) { 663 SetLoginStatus(ash::user::LOGGED_IN_NONE); 664 665 // At first, all of the check is unchecked. 666 EXPECT_TRUE(CreateDetailedMenu()); 667 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 668 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 669 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 670 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 671 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 672 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 673 CloseDetailMenu(); 674 675 // Enabling spoken feedback. 676 AccessibilityManager::Get()->EnableSpokenFeedback( 677 true, ash::A11Y_NOTIFICATION_NONE); 678 EXPECT_TRUE(CreateDetailedMenu()); 679 EXPECT_TRUE(IsSpokenFeedbackEnabledOnDetailMenu()); 680 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 681 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 682 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 683 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 684 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 685 CloseDetailMenu(); 686 687 // Disabling spoken feedback. 688 AccessibilityManager::Get()->EnableSpokenFeedback( 689 false, ash::A11Y_NOTIFICATION_NONE); 690 EXPECT_TRUE(CreateDetailedMenu()); 691 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 692 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 693 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 694 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 695 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 696 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 697 CloseDetailMenu(); 698 699 // Enabling high contrast. 700 AccessibilityManager::Get()->EnableHighContrast(true); 701 EXPECT_TRUE(CreateDetailedMenu()); 702 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 703 EXPECT_TRUE(IsHighContrastEnabledOnDetailMenu()); 704 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 705 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 706 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 707 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 708 CloseDetailMenu(); 709 710 // Disabling high contrast. 711 AccessibilityManager::Get()->EnableHighContrast(false); 712 EXPECT_TRUE(CreateDetailedMenu()); 713 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 714 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 715 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 716 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 717 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 718 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 719 CloseDetailMenu(); 720 721 // Enabling full screen magnifier. 722 SetMagnifierEnabled(true); 723 EXPECT_TRUE(CreateDetailedMenu()); 724 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 725 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 726 EXPECT_TRUE(IsScreenMagnifierEnabledOnDetailMenu()); 727 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 728 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 729 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 730 CloseDetailMenu(); 731 732 // Disabling screen magnifier. 733 SetMagnifierEnabled(false); 734 EXPECT_TRUE(CreateDetailedMenu()); 735 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 736 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 737 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 738 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 739 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 740 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 741 CloseDetailMenu(); 742 743 // Enabling large cursor. 744 AccessibilityManager::Get()->EnableLargeCursor(true); 745 EXPECT_TRUE(CreateDetailedMenu()); 746 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 747 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 748 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 749 EXPECT_TRUE(IsLargeCursorEnabledOnDetailMenu()); 750 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 751 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 752 CloseDetailMenu(); 753 754 // Disabling large cursor. 755 AccessibilityManager::Get()->EnableLargeCursor(false); 756 EXPECT_TRUE(CreateDetailedMenu()); 757 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 758 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 759 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 760 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 761 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 762 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 763 CloseDetailMenu(); 764 765 // Enable on-screen keyboard. 766 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 767 EXPECT_TRUE(CreateDetailedMenu()); 768 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 769 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 770 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 771 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 772 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 773 EXPECT_TRUE(IsVirtualKeyboardEnabledOnDetailMenu()); 774 CloseDetailMenu(); 775 776 // Disable on-screen keyboard. 777 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 778 EXPECT_TRUE(CreateDetailedMenu()); 779 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 780 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 781 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 782 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 783 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 784 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 785 CloseDetailMenu(); 786 787 // Enabling all of the a11y features. 788 AccessibilityManager::Get()->EnableSpokenFeedback( 789 true, ash::A11Y_NOTIFICATION_NONE); 790 AccessibilityManager::Get()->EnableHighContrast(true); 791 SetMagnifierEnabled(true); 792 AccessibilityManager::Get()->EnableLargeCursor(true); 793 AccessibilityManager::Get()->EnableVirtualKeyboard(true); 794 EXPECT_TRUE(CreateDetailedMenu()); 795 EXPECT_TRUE(IsSpokenFeedbackEnabledOnDetailMenu()); 796 EXPECT_TRUE(IsHighContrastEnabledOnDetailMenu()); 797 EXPECT_TRUE(IsScreenMagnifierEnabledOnDetailMenu()); 798 EXPECT_TRUE(IsLargeCursorEnabledOnDetailMenu()); 799 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 800 EXPECT_TRUE(IsVirtualKeyboardEnabledOnDetailMenu()); 801 CloseDetailMenu(); 802 803 // Disabling all of the a11y features. 804 AccessibilityManager::Get()->EnableSpokenFeedback( 805 false, ash::A11Y_NOTIFICATION_NONE); 806 AccessibilityManager::Get()->EnableHighContrast(false); 807 SetMagnifierEnabled(false); 808 AccessibilityManager::Get()->EnableLargeCursor(false); 809 AccessibilityManager::Get()->EnableVirtualKeyboard(false); 810 EXPECT_TRUE(CreateDetailedMenu()); 811 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 812 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 813 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 814 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 815 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 816 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 817 CloseDetailMenu(); 818 819 // Autoclick is disabled on login screen. 820 SetLoginStatus(ash::user::LOGGED_IN_USER); 821 822 // Enabling autoclick. 823 AccessibilityManager::Get()->EnableAutoclick(true); 824 EXPECT_TRUE(CreateDetailedMenu()); 825 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 826 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 827 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 828 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 829 EXPECT_TRUE(IsAutoclickEnabledOnDetailMenu()); 830 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 831 CloseDetailMenu(); 832 833 // Disabling autoclick. 834 AccessibilityManager::Get()->EnableAutoclick(false); 835 EXPECT_TRUE(CreateDetailedMenu()); 836 EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu()); 837 EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu()); 838 EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu()); 839 EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu()); 840 EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu()); 841 EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu()); 842 CloseDetailMenu(); 843 } 844 845 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, CheckMenuVisibilityOnDetailMenu) { 846 SetLoginStatus(ash::user::LOGGED_IN_NONE); 847 EXPECT_TRUE(CreateDetailedMenu()); 848 EXPECT_TRUE(IsSpokenFeedbackMenuShownOnDetailMenu()); 849 EXPECT_TRUE(IsHighContrastMenuShownOnDetailMenu()); 850 EXPECT_TRUE(IsScreenMagnifierMenuShownOnDetailMenu()); 851 EXPECT_TRUE(IsLargeCursorMenuShownOnDetailMenu()); 852 EXPECT_FALSE(IsAutoclickMenuShownOnDetailMenu()); 853 EXPECT_TRUE(IsVirtualKeyboardMenuShownOnDetailMenu()); 854 CloseDetailMenu(); 855 856 SetLoginStatus(ash::user::LOGGED_IN_USER); 857 EXPECT_TRUE(CreateDetailedMenu()); 858 EXPECT_TRUE(IsSpokenFeedbackMenuShownOnDetailMenu()); 859 EXPECT_TRUE(IsHighContrastMenuShownOnDetailMenu()); 860 EXPECT_TRUE(IsScreenMagnifierMenuShownOnDetailMenu()); 861 EXPECT_FALSE(IsLargeCursorMenuShownOnDetailMenu()); 862 EXPECT_TRUE(IsAutoclickMenuShownOnDetailMenu()); 863 EXPECT_TRUE(IsVirtualKeyboardMenuShownOnDetailMenu()); 864 CloseDetailMenu(); 865 866 SetLoginStatus(ash::user::LOGGED_IN_LOCKED); 867 EXPECT_TRUE(CreateDetailedMenu()); 868 EXPECT_TRUE(IsSpokenFeedbackMenuShownOnDetailMenu()); 869 EXPECT_TRUE(IsHighContrastMenuShownOnDetailMenu()); 870 EXPECT_TRUE(IsScreenMagnifierMenuShownOnDetailMenu()); 871 EXPECT_FALSE(IsLargeCursorMenuShownOnDetailMenu()); 872 EXPECT_TRUE(IsAutoclickMenuShownOnDetailMenu()); 873 EXPECT_TRUE(IsVirtualKeyboardMenuShownOnDetailMenu()); 874 CloseDetailMenu(); 875 } 876 877 INSTANTIATE_TEST_CASE_P(TrayAccessibilityTestInstance, 878 TrayAccessibilityTest, 879 testing::Values(PREF_SERVICE, 880 POLICY)); 881 882 } // namespace chromeos 883