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.
5 #include "ash/magnifier/magnification_controller.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"
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;
48 using testing::WithParamInterface;
52 enum PrefSettingMechanism {
57 void SetMagnifierEnabled(bool enabled) {
58 MagnificationManager::Get()->SetMagnifierEnabled(enabled);
61 class TrayAccessibilityTest
62 : public InProcessBrowserTest,
63 public WithParamInterface<PrefSettingMechanism> {
65 TrayAccessibilityTest() {}
66 virtual ~TrayAccessibilityTest() {}
68 // The profile which should be used by these tests.
69 Profile* GetProfile() { return ProfileManager::GetActiveUserProfile(); }
71 virtual void SetUpInProcessBrowserTestFixture() override {
72 EXPECT_CALL(provider_, IsInitializationComplete(_))
73 .WillRepeatedly(Return(true));
74 policy::BrowserPolicyConnector::SetPolicyProviderForTesting(&provider_);
75 AccessibilityManager::SetBrailleControllerForTest(&braille_controller_);
78 virtual void SetUpCommandLine(CommandLine* command_line) override {
79 command_line->AppendSwitch(switches::kLoginManager);
80 command_line->AppendSwitchASCII(switches::kLoginProfile,
81 TestingProfile::kTestUserProfileDir);
84 virtual void SetUpOnMainThread() override {
85 AccessibilityManager::Get()->SetProfileForTest(GetProfile());
86 MagnificationManager::Get()->SetProfileForTest(GetProfile());
89 virtual void RunTestOnMainThreadLoop() override {
90 // Need to mark oobe completed to show detailed views.
91 StartupUtils::MarkOobeCompleted();
92 InProcessBrowserTest::RunTestOnMainThreadLoop();
95 virtual void TearDownOnMainThread() override {
96 AccessibilityManager::SetBrailleControllerForTest(NULL);
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),
110 provider_.UpdateChromePolicy(policy_map);
111 base::RunLoop().RunUntilIdle();
113 FAIL() << "Unknown test parameterization";
117 ash::TrayAccessibility* tray() {
118 return ash::Shell::GetInstance()->GetPrimarySystemTray()->
119 GetTrayAccessibilityForTest();
122 const ash::TrayAccessibility* tray() const {
123 return ash::Shell::GetInstance()
124 ->GetPrimarySystemTray()
125 ->GetTrayAccessibilityForTest();
128 bool IsTrayIconVisible() const { return tray()->tray_icon_visible_; }
130 views::View* CreateMenuItem() {
131 return tray()->CreateDefaultView(GetLoginStatus());
134 void DestroyMenuItem() {
135 return tray()->DestroyDefaultView();
138 bool CanCreateMenuItem() {
139 views::View* menu_item_view = CreateMenuItem();
141 return menu_item_view != NULL;
144 void SetLoginStatus(ash::user::LoginStatus status) {
145 tray()->UpdateAfterLoginStatusChange(status);
148 ash::user::LoginStatus GetLoginStatus() {
149 return tray()->login_;
152 bool CreateDetailedMenu() {
153 tray()->PopupDetailedView(0, false);
154 return tray()->detailed_menu_ != NULL;
157 void CloseDetailMenu() {
158 CHECK(tray()->detailed_menu_);
159 tray()->DestroyDetailedView();
160 tray()->detailed_menu_ = NULL;
163 void ClickSpokenFeedbackOnDetailMenu() {
164 views::View* button = tray()->detailed_menu_->spoken_feedback_view_;
166 tray()->detailed_menu_->OnViewClicked(button);
169 void ClickHighContrastOnDetailMenu() {
170 views::View* button = tray()->detailed_menu_->high_contrast_view_;
172 tray()->detailed_menu_->OnViewClicked(button);
175 void ClickScreenMagnifierOnDetailMenu() {
176 views::View* button = tray()->detailed_menu_->screen_magnifier_view_;
178 tray()->detailed_menu_->OnViewClicked(button);
181 void ClickAutoclickOnDetailMenu() {
182 views::View* button = tray()->detailed_menu_->autoclick_view_;
184 tray()->detailed_menu_->OnViewClicked(button);
187 void ClickVirtualKeyboardOnDetailMenu() {
188 views::View* button = tray()->detailed_menu_->virtual_keyboard_view_;
190 tray()->detailed_menu_->OnViewClicked(button);
193 bool IsSpokenFeedbackEnabledOnDetailMenu() const {
194 return tray()->detailed_menu_->spoken_feedback_enabled_;
197 bool IsHighContrastEnabledOnDetailMenu() const {
198 return tray()->detailed_menu_->high_contrast_enabled_;
201 bool IsScreenMagnifierEnabledOnDetailMenu() const {
202 return tray()->detailed_menu_->screen_magnifier_enabled_;
205 bool IsLargeCursorEnabledOnDetailMenu() const {
206 return tray()->detailed_menu_->large_cursor_enabled_;
209 bool IsAutoclickEnabledOnDetailMenu() const {
210 return tray()->detailed_menu_->autoclick_enabled_;
213 bool IsVirtualKeyboardEnabledOnDetailMenu() const {
214 return tray()->detailed_menu_->virtual_keyboard_enabled_;
217 bool IsSpokenFeedbackMenuShownOnDetailMenu() const {
218 return tray()->detailed_menu_->spoken_feedback_view_;
221 bool IsHighContrastMenuShownOnDetailMenu() const {
222 return tray()->detailed_menu_->high_contrast_view_;
225 bool IsScreenMagnifierMenuShownOnDetailMenu() const {
226 return tray()->detailed_menu_->screen_magnifier_view_;
229 bool IsLargeCursorMenuShownOnDetailMenu() const {
230 return tray()->detailed_menu_->large_cursor_view_;
233 bool IsAutoclickMenuShownOnDetailMenu() const {
234 return tray()->detailed_menu_->autoclick_view_;
237 bool IsVirtualKeyboardMenuShownOnDetailMenu() const {
238 return tray()->detailed_menu_->virtual_keyboard_view_;
241 bool IsHelpShownOnDetailMenu() const {
242 return tray()->detailed_menu_->help_view_;
245 bool IsSettingsShownOnDetailMenu() const {
246 return tray()->detailed_menu_->settings_view_;
249 bool IsNotificationShown() const {
250 return (tray()->detailed_popup_ &&
251 !tray()->detailed_popup_->GetWidget()->IsClosed());
254 base::string16 GetNotificationText() const {
255 if (IsNotificationShown())
256 return tray()->detailed_popup_->label_for_test()->text();
258 return base::string16();
261 void SetBrailleConnected(bool connected) {
262 braille_controller_.SetAvailable(connected);
263 braille_controller_.GetObserver()->OnBrailleDisplayStateChanged(
264 *braille_controller_.GetDisplayState());
267 policy::MockConfigurationPolicyProvider provider_;
268 MockBrailleController braille_controller_;
271 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, LoginStatus) {
272 EXPECT_EQ(ash::user::LOGGED_IN_NONE, GetLoginStatus());
274 user_manager::UserManager::Get()->UserLoggedIn(
275 "owner@invalid.domain", "owner@invalid.domain", true);
276 user_manager::UserManager::Get()->SessionStarted();
278 EXPECT_EQ(ash::user::LOGGED_IN_USER, GetLoginStatus());
281 // http://crbug.com/396342
282 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, DISABLED_ShowTrayIcon) {
283 SetLoginStatus(ash::user::LOGGED_IN_NONE);
285 // Confirms that the icon is invisible before login.
286 EXPECT_FALSE(IsTrayIconVisible());
288 user_manager::UserManager::Get()->UserLoggedIn(
289 "owner@invalid.domain", "owner@invalid.domain", true);
290 user_manager::UserManager::Get()->SessionStarted();
292 // Confirms that the icon is invisible just after login.
293 EXPECT_FALSE(IsTrayIconVisible());
295 // Toggling spoken feedback changes the visibillity of the icon.
296 AccessibilityManager::Get()->EnableSpokenFeedback(
297 true, ui::A11Y_NOTIFICATION_NONE);
298 EXPECT_TRUE(IsTrayIconVisible());
299 AccessibilityManager::Get()->EnableSpokenFeedback(
300 false, ui::A11Y_NOTIFICATION_NONE);
301 EXPECT_FALSE(IsTrayIconVisible());
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());
309 // Toggling magnifier the visibility of the icon.
310 SetMagnifierEnabled(true);
311 EXPECT_TRUE(IsTrayIconVisible());
312 SetMagnifierEnabled(false);
313 EXPECT_FALSE(IsTrayIconVisible());
315 // Toggling the virtual keyboard setting changes the visibility of the a11y
317 AccessibilityManager::Get()->EnableVirtualKeyboard(true);
318 EXPECT_TRUE(IsTrayIconVisible());
319 AccessibilityManager::Get()->EnableVirtualKeyboard(false);
320 EXPECT_FALSE(IsTrayIconVisible());
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, ui::A11Y_NOTIFICATION_NONE);
329 EXPECT_TRUE(IsTrayIconVisible());
330 AccessibilityManager::Get()->EnableVirtualKeyboard(true);
331 EXPECT_TRUE(IsTrayIconVisible());
332 AccessibilityManager::Get()->EnableSpokenFeedback(
333 false, ui::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());
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());
351 // http://crbug.com/396342
352 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, DISABLED_ShowMenu) {
354 user_manager::UserManager::Get()->UserLoggedIn(
355 "owner@invalid.domain", "owner@invalid.domain", true);
356 user_manager::UserManager::Get()->SessionStarted();
358 SetShowAccessibilityOptionsInSystemTrayMenu(false);
360 // Confirms that the menu is hidden.
361 EXPECT_FALSE(CanCreateMenuItem());
363 // Toggling spoken feedback changes the visibillity of the menu.
364 AccessibilityManager::Get()->EnableSpokenFeedback(
365 true, ui::A11Y_NOTIFICATION_NONE);
366 EXPECT_TRUE(CanCreateMenuItem());
367 AccessibilityManager::Get()->EnableSpokenFeedback(
368 false, ui::A11Y_NOTIFICATION_NONE);
369 EXPECT_FALSE(CanCreateMenuItem());
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());
377 // Toggling screen magnifier changes the visibility of the menu.
378 SetMagnifierEnabled(true);
379 EXPECT_TRUE(CanCreateMenuItem());
380 SetMagnifierEnabled(false);
381 EXPECT_FALSE(CanCreateMenuItem());
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());
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());
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, ui::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, ui::A11Y_NOTIFICATION_NONE);
413 EXPECT_TRUE(CanCreateMenuItem());
414 AccessibilityManager::Get()->EnableHighContrast(false);
415 EXPECT_TRUE(CanCreateMenuItem());
416 SetMagnifierEnabled(false);
417 EXPECT_FALSE(CanCreateMenuItem());
420 // http://crbug.com/396318
421 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest,
422 DISABLED_ShowMenuWithShowMenuOption) {
424 user_manager::UserManager::Get()->UserLoggedIn(
425 "owner@invalid.domain", "owner@invalid.domain", true);
426 user_manager::UserManager::Get()->SessionStarted();
428 SetShowAccessibilityOptionsInSystemTrayMenu(true);
430 // Confirms that the menu is visible.
431 EXPECT_TRUE(CanCreateMenuItem());
433 // The menu remains visible regardless of toggling spoken feedback.
434 AccessibilityManager::Get()->EnableSpokenFeedback(
435 true, ui::A11Y_NOTIFICATION_NONE);
436 EXPECT_TRUE(CanCreateMenuItem());
437 AccessibilityManager::Get()->EnableSpokenFeedback(
438 false, ui::A11Y_NOTIFICATION_NONE);
439 EXPECT_TRUE(CanCreateMenuItem());
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());
447 // The menu remains visible regardless of toggling screen magnifier.
448 SetMagnifierEnabled(true);
449 EXPECT_TRUE(CanCreateMenuItem());
450 SetMagnifierEnabled(false);
451 EXPECT_TRUE(CanCreateMenuItem());
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());
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());
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, ui::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, ui::A11Y_NOTIFICATION_NONE);
483 EXPECT_TRUE(CanCreateMenuItem());
484 AccessibilityManager::Get()->EnableHighContrast(false);
485 EXPECT_TRUE(CanCreateMenuItem());
486 SetMagnifierEnabled(false);
487 EXPECT_TRUE(CanCreateMenuItem());
489 SetShowAccessibilityOptionsInSystemTrayMenu(false);
491 // Confirms that the menu is invisible.
492 EXPECT_FALSE(CanCreateMenuItem());
495 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenuWithShowOnLoginScreen) {
496 SetLoginStatus(ash::user::LOGGED_IN_NONE);
498 // Confirms that the menu is visible.
499 EXPECT_TRUE(CanCreateMenuItem());
501 // The menu remains visible regardless of toggling spoken feedback.
502 AccessibilityManager::Get()->EnableSpokenFeedback(
503 true, ui::A11Y_NOTIFICATION_NONE);
504 EXPECT_TRUE(CanCreateMenuItem());
505 AccessibilityManager::Get()->EnableSpokenFeedback(
506 false, ui::A11Y_NOTIFICATION_NONE);
507 EXPECT_TRUE(CanCreateMenuItem());
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());
515 // The menu remains visible regardless of toggling screen magnifier.
516 SetMagnifierEnabled(true);
517 EXPECT_TRUE(CanCreateMenuItem());
518 SetMagnifierEnabled(false);
519 EXPECT_TRUE(CanCreateMenuItem());
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());
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, ui::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, ui::A11Y_NOTIFICATION_NONE);
541 EXPECT_TRUE(CanCreateMenuItem());
542 AccessibilityManager::Get()->EnableHighContrast(false);
543 EXPECT_TRUE(CanCreateMenuItem());
544 SetMagnifierEnabled(false);
545 EXPECT_TRUE(CanCreateMenuItem());
547 SetShowAccessibilityOptionsInSystemTrayMenu(true);
549 // Confirms that the menu remains visible.
550 EXPECT_TRUE(CanCreateMenuItem());
552 SetShowAccessibilityOptionsInSystemTrayMenu(false);
554 // Confirms that the menu remains visible.
555 EXPECT_TRUE(CanCreateMenuItem());
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);
566 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
568 // Enabling spoken feedback should show the notification.
569 AccessibilityManager::Get()->EnableSpokenFeedback(
570 true, ui::A11Y_NOTIFICATION_SHOW);
571 EXPECT_EQ(CHROMEVOX_ENABLED, GetNotificationText());
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());
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, ui::A11Y_NOTIFICATION_SHOW);
585 EXPECT_FALSE(IsNotificationShown());
586 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
588 // Connecting a braille display should enable spoken feedback and show
590 SetBrailleConnected(true);
591 EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
592 EXPECT_EQ(BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED, GetNotificationText());
595 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, KeepMenuVisibilityOnLockScreen) {
596 // Enables high contrast mode.
597 AccessibilityManager::Get()->EnableHighContrast(true);
598 EXPECT_TRUE(CanCreateMenuItem());
601 SetLoginStatus(ash::user::LOGGED_IN_LOCKED);
602 EXPECT_TRUE(CanCreateMenuItem());
604 // Disables high contrast mode.
605 AccessibilityManager::Get()->EnableHighContrast(false);
607 // Confirms that the menu is still visible.
608 EXPECT_TRUE(CanCreateMenuItem());
611 #if defined(OS_CHROMEOS)
612 #define MAYBE_ClickDetailMenu DISABLED_ClickDetailMenu
614 #define MAYBE_ClickDetailMenu ClickDetailMenu
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());
621 EXPECT_TRUE(CreateDetailedMenu());
622 ClickSpokenFeedbackOnDetailMenu();
623 EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
625 EXPECT_TRUE(CreateDetailedMenu());
626 ClickSpokenFeedbackOnDetailMenu();
627 EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
629 // Confirms that the check item toggles the high contrast.
630 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled());
632 EXPECT_TRUE(CreateDetailedMenu());
633 ClickHighContrastOnDetailMenu();
634 EXPECT_TRUE(AccessibilityManager::Get()->IsHighContrastEnabled());
636 EXPECT_TRUE(CreateDetailedMenu());
637 ClickHighContrastOnDetailMenu();
638 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled());
640 // Confirms that the check item toggles the magnifier.
641 EXPECT_FALSE(AccessibilityManager::Get()->IsHighContrastEnabled());
643 EXPECT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled());
644 EXPECT_TRUE(CreateDetailedMenu());
645 ClickScreenMagnifierOnDetailMenu();
646 EXPECT_TRUE(MagnificationManager::Get()->IsMagnifierEnabled());
648 EXPECT_TRUE(CreateDetailedMenu());
649 ClickScreenMagnifierOnDetailMenu();
650 EXPECT_FALSE(MagnificationManager::Get()->IsMagnifierEnabled());
652 // Confirms that the check item toggles autoclick.
653 EXPECT_FALSE(AccessibilityManager::Get()->IsAutoclickEnabled());
655 EXPECT_TRUE(CreateDetailedMenu());
656 ClickAutoclickOnDetailMenu();
657 EXPECT_TRUE(AccessibilityManager::Get()->IsAutoclickEnabled());
659 EXPECT_TRUE(CreateDetailedMenu());
660 ClickAutoclickOnDetailMenu();
661 EXPECT_FALSE(AccessibilityManager::Get()->IsAutoclickEnabled());
663 // Confirms that the check item toggles on-screen keyboard.
664 EXPECT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
666 EXPECT_TRUE(CreateDetailedMenu());
667 ClickVirtualKeyboardOnDetailMenu();
668 EXPECT_TRUE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
670 EXPECT_TRUE(CreateDetailedMenu());
671 ClickVirtualKeyboardOnDetailMenu();
672 EXPECT_FALSE(AccessibilityManager::Get()->IsVirtualKeyboardEnabled());
675 IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, CheckMarksOnDetailMenu) {
676 SetLoginStatus(ash::user::LOGGED_IN_NONE);
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());
688 // Enabling spoken feedback.
689 AccessibilityManager::Get()->EnableSpokenFeedback(
690 true, ui::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());
700 // Disabling spoken feedback.
701 AccessibilityManager::Get()->EnableSpokenFeedback(
702 false, ui::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());
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());
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());
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());
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());
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());
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());
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());
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());
800 // Enabling all of the a11y features.
801 AccessibilityManager::Get()->EnableSpokenFeedback(
802 true, ui::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());
816 // Disabling all of the a11y features.
817 AccessibilityManager::Get()->EnableSpokenFeedback(
818 false, ui::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());
832 // Autoclick is disabled on login screen.
833 SetLoginStatus(ash::user::LOGGED_IN_USER);
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());
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());
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());
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());
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());
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());
913 INSTANTIATE_TEST_CASE_P(TrayAccessibilityTestInstance,
914 TrayAccessibilityTest,
915 testing::Values(PREF_SERVICE,
918 } // namespace chromeos