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