Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / system / tray_accessibility_browsertest.cc
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@invalid.domain", "owner@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@invalid.domain", "owner@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, ui::A11Y_NOTIFICATION_NONE);
298   EXPECT_TRUE(IsTrayIconVisible());
299   AccessibilityManager::Get()->EnableSpokenFeedback(
300       false, ui::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, 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());
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@invalid.domain", "owner@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, ui::A11Y_NOTIFICATION_NONE);
366   EXPECT_TRUE(CanCreateMenuItem());
367   AccessibilityManager::Get()->EnableSpokenFeedback(
368       false, ui::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, 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());
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@invalid.domain", "owner@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, ui::A11Y_NOTIFICATION_NONE);
436   EXPECT_TRUE(CanCreateMenuItem());
437   AccessibilityManager::Get()->EnableSpokenFeedback(
438       false, ui::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, 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());
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, ui::A11Y_NOTIFICATION_NONE);
504   EXPECT_TRUE(CanCreateMenuItem());
505   AccessibilityManager::Get()->EnableSpokenFeedback(
506       false, ui::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, 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());
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, ui::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, ui::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, 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());
698   CloseDetailMenu();
699
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());
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, 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());
814   CloseDetailMenu();
815
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());
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