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