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
43using extensions::api::braille_display_private::BrailleObserver;
44using extensions::api::braille_display_private::DisplayState;
45using extensions::api::braille_display_private::MockBrailleController;
46using testing::Return;
47using testing::_;
48using testing::WithParamInterface;
49
50namespace chromeos {
51
52enum PrefSettingMechanism {
53  PREF_SERVICE,
54  POLICY,
55};
56
57void SetMagnifierEnabled(bool enabled) {
58  MagnificationManager::Get()->SetMagnifierEnabled(enabled);
59}
60
61class 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
271IN_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
282IN_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, ash::A11Y_NOTIFICATION_NONE);
298  EXPECT_TRUE(IsTrayIconVisible());
299  AccessibilityManager::Get()->EnableSpokenFeedback(
300      false, ash::A11Y_NOTIFICATION_NONE);
301  EXPECT_FALSE(IsTrayIconVisible());
302
303  // Toggling high contrast the visibillity of the icon.
304  AccessibilityManager::Get()->EnableHighContrast(true);
305  EXPECT_TRUE(IsTrayIconVisible());
306  AccessibilityManager::Get()->EnableHighContrast(false);
307  EXPECT_FALSE(IsTrayIconVisible());
308
309  // Toggling magnifier the visibility of the icon.
310  SetMagnifierEnabled(true);
311  EXPECT_TRUE(IsTrayIconVisible());
312  SetMagnifierEnabled(false);
313  EXPECT_FALSE(IsTrayIconVisible());
314
315  // Toggling the virtual keyboard setting changes the visibility of the a11y
316  // icon.
317  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
318  EXPECT_TRUE(IsTrayIconVisible());
319  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
320  EXPECT_FALSE(IsTrayIconVisible());
321
322  // Enabling all accessibility features.
323  SetMagnifierEnabled(true);
324  EXPECT_TRUE(IsTrayIconVisible());
325  AccessibilityManager::Get()->EnableHighContrast(true);
326  EXPECT_TRUE(IsTrayIconVisible());
327  AccessibilityManager::Get()->EnableSpokenFeedback(
328      true, ash::A11Y_NOTIFICATION_NONE);
329  EXPECT_TRUE(IsTrayIconVisible());
330  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
331  EXPECT_TRUE(IsTrayIconVisible());
332  AccessibilityManager::Get()->EnableSpokenFeedback(
333      false, ash::A11Y_NOTIFICATION_NONE);
334  EXPECT_TRUE(IsTrayIconVisible());
335  AccessibilityManager::Get()->EnableHighContrast(false);
336  EXPECT_TRUE(IsTrayIconVisible());
337  SetMagnifierEnabled(false);
338  EXPECT_TRUE(IsTrayIconVisible());
339  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
340  EXPECT_FALSE(IsTrayIconVisible());
341
342  // Confirms that prefs::kShouldAlwaysShowAccessibilityMenu doesn't affect
343  // the icon on the tray.
344  SetShowAccessibilityOptionsInSystemTrayMenu(true);
345  AccessibilityManager::Get()->EnableHighContrast(true);
346  EXPECT_TRUE(IsTrayIconVisible());
347  AccessibilityManager::Get()->EnableHighContrast(false);
348  EXPECT_FALSE(IsTrayIconVisible());
349}
350
351// http://crbug.com/396342
352IN_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, ash::A11Y_NOTIFICATION_NONE);
366  EXPECT_TRUE(CanCreateMenuItem());
367  AccessibilityManager::Get()->EnableSpokenFeedback(
368      false, ash::A11Y_NOTIFICATION_NONE);
369  EXPECT_FALSE(CanCreateMenuItem());
370
371  // Toggling high contrast changes the visibillity of the menu.
372  AccessibilityManager::Get()->EnableHighContrast(true);
373  EXPECT_TRUE(CanCreateMenuItem());
374  AccessibilityManager::Get()->EnableHighContrast(false);
375  EXPECT_FALSE(CanCreateMenuItem());
376
377  // Toggling screen magnifier changes the visibility of the menu.
378  SetMagnifierEnabled(true);
379  EXPECT_TRUE(CanCreateMenuItem());
380  SetMagnifierEnabled(false);
381  EXPECT_FALSE(CanCreateMenuItem());
382
383  // Toggling autoclick changes the visibility of the menu.
384  AccessibilityManager::Get()->EnableAutoclick(true);
385  EXPECT_TRUE(CanCreateMenuItem());
386  AccessibilityManager::Get()->EnableAutoclick(false);
387  EXPECT_FALSE(CanCreateMenuItem());
388
389  // Toggling virtual keyboard changes the visibility of the menu.
390  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
391  EXPECT_TRUE(CanCreateMenuItem());
392  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
393  EXPECT_FALSE(CanCreateMenuItem());
394
395  // Enabling all accessibility features.
396  SetMagnifierEnabled(true);
397  EXPECT_TRUE(CanCreateMenuItem());
398  AccessibilityManager::Get()->EnableHighContrast(true);
399  EXPECT_TRUE(CanCreateMenuItem());
400  AccessibilityManager::Get()->EnableSpokenFeedback(
401      true, ash::A11Y_NOTIFICATION_NONE);
402  EXPECT_TRUE(CanCreateMenuItem());
403  AccessibilityManager::Get()->EnableAutoclick(true);
404  EXPECT_TRUE(CanCreateMenuItem());
405  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
406  EXPECT_TRUE(CanCreateMenuItem());
407  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
408  EXPECT_TRUE(CanCreateMenuItem());
409  AccessibilityManager::Get()->EnableAutoclick(false);
410  EXPECT_TRUE(CanCreateMenuItem());
411  AccessibilityManager::Get()->EnableSpokenFeedback(
412      false, ash::A11Y_NOTIFICATION_NONE);
413  EXPECT_TRUE(CanCreateMenuItem());
414  AccessibilityManager::Get()->EnableHighContrast(false);
415  EXPECT_TRUE(CanCreateMenuItem());
416  SetMagnifierEnabled(false);
417  EXPECT_FALSE(CanCreateMenuItem());
418}
419
420// http://crbug.com/396318
421IN_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, ash::A11Y_NOTIFICATION_NONE);
436  EXPECT_TRUE(CanCreateMenuItem());
437  AccessibilityManager::Get()->EnableSpokenFeedback(
438      false, ash::A11Y_NOTIFICATION_NONE);
439  EXPECT_TRUE(CanCreateMenuItem());
440
441  // The menu remains visible regardless of toggling high contrast.
442  AccessibilityManager::Get()->EnableHighContrast(true);
443  EXPECT_TRUE(CanCreateMenuItem());
444  AccessibilityManager::Get()->EnableHighContrast(false);
445  EXPECT_TRUE(CanCreateMenuItem());
446
447  // The menu remains visible regardless of toggling screen magnifier.
448  SetMagnifierEnabled(true);
449  EXPECT_TRUE(CanCreateMenuItem());
450  SetMagnifierEnabled(false);
451  EXPECT_TRUE(CanCreateMenuItem());
452
453  // The menu remains visible regardless of toggling autoclick.
454  AccessibilityManager::Get()->EnableAutoclick(true);
455  EXPECT_TRUE(CanCreateMenuItem());
456  AccessibilityManager::Get()->EnableAutoclick(false);
457  EXPECT_TRUE(CanCreateMenuItem());
458
459  // The menu remains visible regardless of toggling on-screen keyboard.
460  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
461  EXPECT_TRUE(CanCreateMenuItem());
462  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
463  EXPECT_TRUE(CanCreateMenuItem());
464
465  // Enabling all accessibility features.
466  SetMagnifierEnabled(true);
467  EXPECT_TRUE(CanCreateMenuItem());
468  AccessibilityManager::Get()->EnableHighContrast(true);
469  EXPECT_TRUE(CanCreateMenuItem());
470  AccessibilityManager::Get()->EnableSpokenFeedback(
471      true, ash::A11Y_NOTIFICATION_NONE);
472  EXPECT_TRUE(CanCreateMenuItem());
473  AccessibilityManager::Get()->EnableAutoclick(true);
474  EXPECT_TRUE(CanCreateMenuItem());
475  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
476  EXPECT_TRUE(CanCreateMenuItem());
477  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
478  EXPECT_TRUE(CanCreateMenuItem());
479  AccessibilityManager::Get()->EnableAutoclick(false);
480  EXPECT_TRUE(CanCreateMenuItem());
481  AccessibilityManager::Get()->EnableSpokenFeedback(
482      false, ash::A11Y_NOTIFICATION_NONE);
483  EXPECT_TRUE(CanCreateMenuItem());
484  AccessibilityManager::Get()->EnableHighContrast(false);
485  EXPECT_TRUE(CanCreateMenuItem());
486  SetMagnifierEnabled(false);
487  EXPECT_TRUE(CanCreateMenuItem());
488
489  SetShowAccessibilityOptionsInSystemTrayMenu(false);
490
491  // Confirms that the menu is invisible.
492  EXPECT_FALSE(CanCreateMenuItem());
493}
494
495IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowMenuWithShowOnLoginScreen) {
496  SetLoginStatus(ash::user::LOGGED_IN_NONE);
497
498  // Confirms that the menu is visible.
499  EXPECT_TRUE(CanCreateMenuItem());
500
501  // The menu remains visible regardless of toggling spoken feedback.
502  AccessibilityManager::Get()->EnableSpokenFeedback(
503      true, ash::A11Y_NOTIFICATION_NONE);
504  EXPECT_TRUE(CanCreateMenuItem());
505  AccessibilityManager::Get()->EnableSpokenFeedback(
506      false, ash::A11Y_NOTIFICATION_NONE);
507  EXPECT_TRUE(CanCreateMenuItem());
508
509  // The menu remains visible regardless of toggling high contrast.
510  AccessibilityManager::Get()->EnableHighContrast(true);
511  EXPECT_TRUE(CanCreateMenuItem());
512  AccessibilityManager::Get()->EnableHighContrast(false);
513  EXPECT_TRUE(CanCreateMenuItem());
514
515  // The menu remains visible regardless of toggling screen magnifier.
516  SetMagnifierEnabled(true);
517  EXPECT_TRUE(CanCreateMenuItem());
518  SetMagnifierEnabled(false);
519  EXPECT_TRUE(CanCreateMenuItem());
520
521  // The menu remains visible regardless of toggling on-screen keyboard.
522  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
523  EXPECT_TRUE(CanCreateMenuItem());
524  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
525  EXPECT_TRUE(CanCreateMenuItem());
526
527  // Enabling all accessibility features.
528  SetMagnifierEnabled(true);
529  EXPECT_TRUE(CanCreateMenuItem());
530  AccessibilityManager::Get()->EnableHighContrast(true);
531  EXPECT_TRUE(CanCreateMenuItem());
532  AccessibilityManager::Get()->EnableSpokenFeedback(
533      true, ash::A11Y_NOTIFICATION_NONE);
534  EXPECT_TRUE(CanCreateMenuItem());
535  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
536  EXPECT_TRUE(CanCreateMenuItem());
537  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
538  EXPECT_TRUE(CanCreateMenuItem());
539  AccessibilityManager::Get()->EnableSpokenFeedback(
540      false, ash::A11Y_NOTIFICATION_NONE);
541  EXPECT_TRUE(CanCreateMenuItem());
542  AccessibilityManager::Get()->EnableHighContrast(false);
543  EXPECT_TRUE(CanCreateMenuItem());
544  SetMagnifierEnabled(false);
545  EXPECT_TRUE(CanCreateMenuItem());
546
547  SetShowAccessibilityOptionsInSystemTrayMenu(true);
548
549  // Confirms that the menu remains visible.
550  EXPECT_TRUE(CanCreateMenuItem());
551
552  SetShowAccessibilityOptionsInSystemTrayMenu(false);
553
554  // Confirms that the menu remains visible.
555  EXPECT_TRUE(CanCreateMenuItem());
556}
557
558IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, ShowNotification) {
559  const base::string16 BRAILLE_CONNECTED =
560      base::ASCIIToUTF16("Braille display connected.");
561  const base::string16 CHROMEVOX_ENABLED = base::ASCIIToUTF16(
562      "ChromeVox (spoken feedback) is enabled.\nPress Ctrl+Alt+Z to disable.");
563  const base::string16 BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED(
564      BRAILLE_CONNECTED + base::ASCIIToUTF16(" ") + CHROMEVOX_ENABLED);
565
566  EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
567
568  // Enabling spoken feedback should show the notification.
569  AccessibilityManager::Get()->EnableSpokenFeedback(
570      true, ash::A11Y_NOTIFICATION_SHOW);
571  EXPECT_EQ(CHROMEVOX_ENABLED, GetNotificationText());
572
573  // Connecting a braille display when spoken feedback is already enabled
574  // should only show the message about the braille display.
575  SetBrailleConnected(true);
576  EXPECT_EQ(BRAILLE_CONNECTED, GetNotificationText());
577
578  // Neither disconnecting a braille display, nor disabling spoken feedback
579  // should show any notification.
580  SetBrailleConnected(false);
581  EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
582  EXPECT_FALSE(IsNotificationShown());
583  AccessibilityManager::Get()->EnableSpokenFeedback(
584      false, ash::A11Y_NOTIFICATION_SHOW);
585  EXPECT_FALSE(IsNotificationShown());
586  EXPECT_FALSE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
587
588  // Connecting a braille display should enable spoken feedback and show
589  // both messages.
590  SetBrailleConnected(true);
591  EXPECT_TRUE(AccessibilityManager::Get()->IsSpokenFeedbackEnabled());
592  EXPECT_EQ(BRAILLE_CONNECTED_AND_CHROMEVOX_ENABLED, GetNotificationText());
593}
594
595IN_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
617IN_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
675IN_PROC_BROWSER_TEST_P(TrayAccessibilityTest, CheckMarksOnDetailMenu) {
676  SetLoginStatus(ash::user::LOGGED_IN_NONE);
677
678  // At first, all of the check is unchecked.
679  EXPECT_TRUE(CreateDetailedMenu());
680  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
681  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
682  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
683  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
684  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
685  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
686  CloseDetailMenu();
687
688  // Enabling spoken feedback.
689  AccessibilityManager::Get()->EnableSpokenFeedback(
690      true, ash::A11Y_NOTIFICATION_NONE);
691  EXPECT_TRUE(CreateDetailedMenu());
692  EXPECT_TRUE(IsSpokenFeedbackEnabledOnDetailMenu());
693  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
694  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
695  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
696  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
697  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
698  CloseDetailMenu();
699
700  // Disabling spoken feedback.
701  AccessibilityManager::Get()->EnableSpokenFeedback(
702      false, ash::A11Y_NOTIFICATION_NONE);
703  EXPECT_TRUE(CreateDetailedMenu());
704  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
705  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
706  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
707  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
708  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
709  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
710  CloseDetailMenu();
711
712  // Enabling high contrast.
713  AccessibilityManager::Get()->EnableHighContrast(true);
714  EXPECT_TRUE(CreateDetailedMenu());
715  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
716  EXPECT_TRUE(IsHighContrastEnabledOnDetailMenu());
717  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
718  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
719  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
720  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
721  CloseDetailMenu();
722
723  // Disabling high contrast.
724  AccessibilityManager::Get()->EnableHighContrast(false);
725  EXPECT_TRUE(CreateDetailedMenu());
726  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
727  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
728  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
729  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
730  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
731  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
732  CloseDetailMenu();
733
734  // Enabling full screen magnifier.
735  SetMagnifierEnabled(true);
736  EXPECT_TRUE(CreateDetailedMenu());
737  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
738  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
739  EXPECT_TRUE(IsScreenMagnifierEnabledOnDetailMenu());
740  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
741  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
742  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
743  CloseDetailMenu();
744
745  // Disabling screen magnifier.
746  SetMagnifierEnabled(false);
747  EXPECT_TRUE(CreateDetailedMenu());
748  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
749  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
750  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
751  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
752  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
753  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
754  CloseDetailMenu();
755
756  // Enabling large cursor.
757  AccessibilityManager::Get()->EnableLargeCursor(true);
758  EXPECT_TRUE(CreateDetailedMenu());
759  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
760  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
761  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
762  EXPECT_TRUE(IsLargeCursorEnabledOnDetailMenu());
763  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
764  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
765  CloseDetailMenu();
766
767  // Disabling large cursor.
768  AccessibilityManager::Get()->EnableLargeCursor(false);
769  EXPECT_TRUE(CreateDetailedMenu());
770  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
771  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
772  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
773  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
774  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
775  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
776  CloseDetailMenu();
777
778  // Enable on-screen keyboard.
779  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
780  EXPECT_TRUE(CreateDetailedMenu());
781  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
782  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
783  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
784  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
785  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
786  EXPECT_TRUE(IsVirtualKeyboardEnabledOnDetailMenu());
787  CloseDetailMenu();
788
789  // Disable on-screen keyboard.
790  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
791  EXPECT_TRUE(CreateDetailedMenu());
792  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
793  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
794  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
795  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
796  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
797  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
798  CloseDetailMenu();
799
800  // Enabling all of the a11y features.
801  AccessibilityManager::Get()->EnableSpokenFeedback(
802      true, ash::A11Y_NOTIFICATION_NONE);
803  AccessibilityManager::Get()->EnableHighContrast(true);
804  SetMagnifierEnabled(true);
805  AccessibilityManager::Get()->EnableLargeCursor(true);
806  AccessibilityManager::Get()->EnableVirtualKeyboard(true);
807  EXPECT_TRUE(CreateDetailedMenu());
808  EXPECT_TRUE(IsSpokenFeedbackEnabledOnDetailMenu());
809  EXPECT_TRUE(IsHighContrastEnabledOnDetailMenu());
810  EXPECT_TRUE(IsScreenMagnifierEnabledOnDetailMenu());
811  EXPECT_TRUE(IsLargeCursorEnabledOnDetailMenu());
812  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
813  EXPECT_TRUE(IsVirtualKeyboardEnabledOnDetailMenu());
814  CloseDetailMenu();
815
816  // Disabling all of the a11y features.
817  AccessibilityManager::Get()->EnableSpokenFeedback(
818      false, ash::A11Y_NOTIFICATION_NONE);
819  AccessibilityManager::Get()->EnableHighContrast(false);
820  SetMagnifierEnabled(false);
821  AccessibilityManager::Get()->EnableLargeCursor(false);
822  AccessibilityManager::Get()->EnableVirtualKeyboard(false);
823  EXPECT_TRUE(CreateDetailedMenu());
824  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
825  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
826  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
827  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
828  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
829  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
830  CloseDetailMenu();
831
832  // Autoclick is disabled on login screen.
833  SetLoginStatus(ash::user::LOGGED_IN_USER);
834
835  // Enabling autoclick.
836  AccessibilityManager::Get()->EnableAutoclick(true);
837  EXPECT_TRUE(CreateDetailedMenu());
838  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
839  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
840  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
841  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
842  EXPECT_TRUE(IsAutoclickEnabledOnDetailMenu());
843  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
844  CloseDetailMenu();
845
846  // Disabling autoclick.
847  AccessibilityManager::Get()->EnableAutoclick(false);
848  EXPECT_TRUE(CreateDetailedMenu());
849  EXPECT_FALSE(IsSpokenFeedbackEnabledOnDetailMenu());
850  EXPECT_FALSE(IsHighContrastEnabledOnDetailMenu());
851  EXPECT_FALSE(IsScreenMagnifierEnabledOnDetailMenu());
852  EXPECT_FALSE(IsLargeCursorEnabledOnDetailMenu());
853  EXPECT_FALSE(IsAutoclickEnabledOnDetailMenu());
854  EXPECT_FALSE(IsVirtualKeyboardEnabledOnDetailMenu());
855  CloseDetailMenu();
856}
857
858IN_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
913INSTANTIATE_TEST_CASE_P(TrayAccessibilityTestInstance,
914                        TrayAccessibilityTest,
915                        testing::Values(PREF_SERVICE,
916                                        POLICY));
917
918}  // namespace chromeos
919