accessibility_manager_browsertest.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
1// Copyright (c) 2013 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 "chrome/browser/chromeos/accessibility/accessibility_manager.h"
6
7#include "ash/magnifier/magnification_controller.h"
8#include "ash/shell.h"
9#include "base/command_line.h"
10#include "base/prefs/pref_service.h"
11#include "chrome/browser/browser_process.h"
12#include "chrome/browser/chrome_notification_types.h"
13#include "chrome/browser/chromeos/accessibility/magnification_manager.h"
14#include "chrome/browser/chromeos/login/helper.h"
15#include "chrome/browser/chromeos/login/login_utils.h"
16#include "chrome/browser/chromeos/login/users/user_manager.h"
17#include "chrome/browser/chromeos/login/users/user_manager_impl.h"
18#include "chrome/browser/chromeos/preferences.h"
19#include "chrome/browser/chromeos/profiles/profile_helper.h"
20#include "chrome/browser/extensions/api/braille_display_private/mock_braille_controller.h"
21#include "chrome/browser/prefs/pref_service_syncable.h"
22#include "chrome/browser/profiles/profile.h"
23#include "chrome/browser/profiles/profile_manager.h"
24#include "chrome/common/extensions/extension_constants.h"
25#include "chrome/common/pref_names.h"
26#include "chrome/test/base/in_process_browser_test.h"
27#include "chrome/test/base/testing_profile.h"
28#include "chromeos/chromeos_switches.h"
29#include "chromeos/ime/component_extension_ime_manager.h"
30#include "chromeos/ime/input_method_manager.h"
31#include "content/public/browser/notification_service.h"
32#include "content/public/test/test_utils.h"
33#include "testing/gtest/include/gtest/gtest.h"
34
35using chromeos::input_method::InputMethodManager;
36using chromeos::input_method::InputMethodUtil;
37using chromeos::input_method::InputMethodDescriptors;
38using content::BrowserThread;
39using extensions::api::braille_display_private::BrailleObserver;
40using extensions::api::braille_display_private::DisplayState;
41using extensions::api::braille_display_private::KeyEvent;
42using extensions::api::braille_display_private::MockBrailleController;
43
44namespace chromeos {
45
46namespace {
47
48const char kTestUserName[] = "owner@invalid.domain";
49
50const int kTestAutoclickDelayMs = 2000;
51
52// Test user name for locally managed user. The domain part must be matched
53// with UserManager::kLocallyManagedUserDomain.
54const char kTestLocallyManagedUserName[] = "test@locally-managed.localhost";
55
56class MockAccessibilityObserver {
57 public:
58  MockAccessibilityObserver() : observed_(false),
59                                observed_enabled_(false),
60                                observed_type_(-1)
61  {
62    AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
63    CHECK(accessibility_manager);
64    accessibility_subscription_ = accessibility_manager->RegisterCallback(
65        base::Bind(&MockAccessibilityObserver::OnAccessibilityStatusChanged,
66                   base::Unretained(this)));
67  }
68
69  virtual ~MockAccessibilityObserver() {}
70
71  bool observed() const { return observed_; }
72  bool observed_enabled() const { return observed_enabled_; }
73  int observed_type() const { return observed_type_; }
74
75  void reset() { observed_ = false; }
76
77 private:
78  void OnAccessibilityStatusChanged(
79      const AccessibilityStatusEventDetails& details) {
80    if (details.notification_type != ACCESSIBILITY_TOGGLE_SCREEN_MAGNIFIER) {
81      observed_type_ = details.notification_type;
82      observed_enabled_ = details.enabled;
83      observed_ = true;
84    }
85  }
86
87  bool observed_;
88  bool observed_enabled_;
89  int observed_type_;
90
91  scoped_ptr<AccessibilityStatusSubscription> accessibility_subscription_;
92
93  DISALLOW_COPY_AND_ASSIGN(MockAccessibilityObserver);
94};
95
96void SetLargeCursorEnabled(bool enabled) {
97  return AccessibilityManager::Get()->EnableLargeCursor(enabled);
98}
99
100bool IsLargeCursorEnabled() {
101  return AccessibilityManager::Get()->IsLargeCursorEnabled();
102}
103
104bool ShouldShowAccessibilityMenu() {
105  return AccessibilityManager::Get()->ShouldShowAccessibilityMenu();
106}
107
108void SetHighContrastEnabled(bool enabled) {
109  return AccessibilityManager::Get()->EnableHighContrast(enabled);
110}
111
112bool IsHighContrastEnabled() {
113  return AccessibilityManager::Get()->IsHighContrastEnabled();
114}
115
116void SetSpokenFeedbackEnabled(bool enabled) {
117  return AccessibilityManager::Get()->EnableSpokenFeedback(
118      enabled, ash::A11Y_NOTIFICATION_NONE);
119}
120
121bool IsSpokenFeedbackEnabled() {
122  return AccessibilityManager::Get()->IsSpokenFeedbackEnabled();
123}
124
125void SetAutoclickEnabled(bool enabled) {
126  return AccessibilityManager::Get()->EnableAutoclick(enabled);
127}
128
129bool IsAutoclickEnabled() {
130  return AccessibilityManager::Get()->IsAutoclickEnabled();
131}
132
133void SetAutoclickDelay(int delay_ms) {
134  return AccessibilityManager::Get()->SetAutoclickDelay(delay_ms);
135}
136
137int GetAutoclickDelay() {
138  return AccessibilityManager::Get()->GetAutoclickDelay();
139}
140
141void SetVirtualKeyboardEnabled(bool enabled) {
142  return AccessibilityManager::Get()->EnableVirtualKeyboard(enabled);
143}
144
145bool IsVirtualKeyboardEnabled() {
146  return AccessibilityManager::Get()->IsVirtualKeyboardEnabled();
147}
148
149Profile* GetProfile() {
150  Profile* profile = ProfileManager::GetActiveUserProfile();
151  DCHECK(profile);
152  return profile;
153}
154
155PrefService* GetPrefs() {
156  return GetProfile()->GetPrefs();
157}
158
159void SetLargeCursorEnabledPref(bool enabled) {
160  GetPrefs()->SetBoolean(prefs::kLargeCursorEnabled, enabled);
161}
162
163void SetHighContrastEnabledPref(bool enabled) {
164  GetPrefs()->SetBoolean(prefs::kHighContrastEnabled, enabled);
165}
166
167void SetSpokenFeedbackEnabledPref(bool enabled) {
168  GetPrefs()->SetBoolean(prefs::kSpokenFeedbackEnabled, enabled);
169}
170
171void SetAutoclickEnabledPref(bool enabled) {
172  GetPrefs()->SetBoolean(prefs::kAutoclickEnabled, enabled);
173}
174
175void SetAutoclickDelayPref(int delay_ms) {
176  GetPrefs()->SetInteger(prefs::kAutoclickDelayMs, delay_ms);
177}
178
179void SetVirtualKeyboardEnabledPref(bool enabled) {
180  GetPrefs()->SetBoolean(prefs::kVirtualKeyboardEnabled, enabled);
181}
182
183bool GetLargeCursorEnabledFromPref() {
184  return GetPrefs()->GetBoolean(prefs::kLargeCursorEnabled);
185}
186
187bool GetHighContrastEnabledFromPref() {
188  return GetPrefs()->GetBoolean(prefs::kHighContrastEnabled);
189}
190
191bool GetSpokenFeedbackEnabledFromPref() {
192  return GetPrefs()->GetBoolean(prefs::kSpokenFeedbackEnabled);
193}
194
195bool GetAutoclickEnabledFromPref() {
196  return GetPrefs()->GetBoolean(prefs::kAutoclickEnabled);
197}
198
199int GetAutoclickDelayFromPref() {
200  return GetPrefs()->GetInteger(prefs::kAutoclickDelayMs);
201}
202
203bool IsBrailleImeActive() {
204  InputMethodManager* imm = InputMethodManager::Get();
205  scoped_ptr<InputMethodDescriptors> descriptors =
206      imm->GetActiveInputMethods();
207  for (InputMethodDescriptors::const_iterator i = descriptors->begin();
208       i != descriptors->end();
209       ++i) {
210    if (i->id() == extension_misc::kBrailleImeEngineId)
211      return true;
212  }
213  return false;
214}
215
216bool IsBrailleImeCurrent() {
217  InputMethodManager* imm = InputMethodManager::Get();
218  return imm->GetCurrentInputMethod().id() ==
219         extension_misc::kBrailleImeEngineId;
220}
221}  // anonymous namespace
222
223class AccessibilityManagerTest : public InProcessBrowserTest {
224 protected:
225  AccessibilityManagerTest() : default_autoclick_delay_(0) {}
226  virtual ~AccessibilityManagerTest() {}
227
228  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
229    command_line->AppendSwitch(chromeos::switches::kLoginManager);
230    command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile,
231                                    TestingProfile::kTestUserProfileDir);
232  }
233
234  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
235    AccessibilityManager::SetBrailleControllerForTest(&braille_controller_);
236  }
237
238  virtual void SetUpOnMainThread() OVERRIDE {
239    // Sets the login-screen profile.
240    AccessibilityManager::Get()->
241        SetProfileForTest(ProfileHelper::GetSigninProfile());
242    default_autoclick_delay_ = GetAutoclickDelay();
243  }
244
245  virtual void CleanUpOnMainThread() OVERRIDE {
246    AccessibilityManager::SetBrailleControllerForTest(NULL);
247  }
248
249  void SetBrailleDisplayAvailability(bool available) {
250    braille_controller_.SetAvailable(available);
251    braille_controller_.GetObserver()->OnBrailleDisplayStateChanged(
252        *braille_controller_.GetDisplayState());
253  }
254
255  int default_autoclick_delay() const { return default_autoclick_delay_; }
256
257  int default_autoclick_delay_;
258
259  content::NotificationRegistrar registrar_;
260
261  MockBrailleController braille_controller_;
262  DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerTest);
263};
264
265IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, Login) {
266  // Confirms that a11y features are disabled on the login screen.
267  EXPECT_FALSE(IsLargeCursorEnabled());
268  EXPECT_FALSE(IsSpokenFeedbackEnabled());
269  EXPECT_FALSE(IsHighContrastEnabled());
270  EXPECT_FALSE(IsAutoclickEnabled());
271  EXPECT_FALSE(IsVirtualKeyboardEnabled());
272  EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay());
273
274  // Logs in.
275  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
276
277  // Confirms that the features still disabled just after login.
278  EXPECT_FALSE(IsLargeCursorEnabled());
279  EXPECT_FALSE(IsSpokenFeedbackEnabled());
280  EXPECT_FALSE(IsHighContrastEnabled());
281  EXPECT_FALSE(IsAutoclickEnabled());
282  EXPECT_FALSE(IsVirtualKeyboardEnabled());
283  EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay());
284
285  UserManager::Get()->SessionStarted();
286
287  // Confirms that the features are still disabled just after login.
288  EXPECT_FALSE(IsLargeCursorEnabled());
289  EXPECT_FALSE(IsSpokenFeedbackEnabled());
290  EXPECT_FALSE(IsHighContrastEnabled());
291  EXPECT_FALSE(IsAutoclickEnabled());
292  EXPECT_FALSE(IsVirtualKeyboardEnabled());
293  EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay());
294
295  // Enables large cursor.
296  SetLargeCursorEnabled(true);
297  // Confirms that large cursor is enabled.
298  EXPECT_TRUE(IsLargeCursorEnabled());
299
300  // Enables spoken feedback.
301  SetSpokenFeedbackEnabled(true);
302  // Confirms that the spoken feedback is enabled.
303  EXPECT_TRUE(IsSpokenFeedbackEnabled());
304
305  // Enables high contrast.
306  SetHighContrastEnabled(true);
307  // Confirms that high cotrast is enabled.
308  EXPECT_TRUE(IsHighContrastEnabled());
309
310  // Enables autoclick.
311  SetAutoclickEnabled(true);
312  // Confirms that autoclick is enabled.
313  EXPECT_TRUE(IsAutoclickEnabled());
314
315  // Test that autoclick delay is set properly.
316  SetAutoclickDelay(kTestAutoclickDelayMs);
317  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
318
319  // Enable on-screen keyboard
320  SetVirtualKeyboardEnabled(true);
321  // Confirm that the on-screen keyboard option is enabled.
322  EXPECT_TRUE(IsVirtualKeyboardEnabled());
323}
324
325IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, BrailleOnLoginScreen) {
326  EXPECT_FALSE(IsSpokenFeedbackEnabled());
327
328  // Signal the accessibility manager that a braille display was connected.
329  SetBrailleDisplayAvailability(true);
330  // Confirms that the spoken feedback is enabled.
331  EXPECT_TRUE(IsSpokenFeedbackEnabled());
332}
333
334IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, TypePref) {
335  // Logs in.
336  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
337  UserManager::Get()->SessionStarted();
338
339  // Confirms that the features are disabled just after login.
340  EXPECT_FALSE(IsLargeCursorEnabled());
341  EXPECT_FALSE(IsSpokenFeedbackEnabled());
342  EXPECT_FALSE(IsHighContrastEnabled());
343  EXPECT_FALSE(IsAutoclickEnabled());
344  EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay());
345  EXPECT_FALSE(IsVirtualKeyboardEnabled());
346
347  // Sets the pref as true to enable the large cursor.
348  SetLargeCursorEnabledPref(true);
349  // Confirms that the large cursor is enabled.
350  EXPECT_TRUE(IsLargeCursorEnabled());
351
352  // Sets the pref as true to enable the spoken feedback.
353  SetSpokenFeedbackEnabledPref(true);
354  // Confirms that the spoken feedback is enabled.
355  EXPECT_TRUE(IsSpokenFeedbackEnabled());
356
357  // Sets the pref as true to enable high contrast mode.
358  SetHighContrastEnabledPref(true);
359  // Confirms that the high contrast mode is enabled.
360  EXPECT_TRUE(IsHighContrastEnabled());
361
362  // Sets the pref as true to enable autoclick.
363  SetAutoclickEnabledPref(true);
364  // Confirms that autoclick is enabled.
365  EXPECT_TRUE(IsAutoclickEnabled());
366
367  // Set autoclick delay pref.
368  SetAutoclickDelayPref(kTestAutoclickDelayMs);
369  // Confirm that the correct value is set.
370  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
371
372  // Sets the on-screen keyboard pref.
373  SetVirtualKeyboardEnabledPref(true);
374  // Confirm that the on-screen keyboard option is enabled.
375  EXPECT_TRUE(IsVirtualKeyboardEnabled());
376
377  SetLargeCursorEnabledPref(false);
378  EXPECT_FALSE(IsLargeCursorEnabled());
379
380  SetSpokenFeedbackEnabledPref(false);
381  EXPECT_FALSE(IsSpokenFeedbackEnabled());
382
383  SetHighContrastEnabledPref(false);
384  EXPECT_FALSE(IsHighContrastEnabled());
385
386  SetAutoclickEnabledPref(false);
387  EXPECT_FALSE(IsAutoclickEnabled());
388
389  SetVirtualKeyboardEnabledPref(false);
390  EXPECT_FALSE(IsVirtualKeyboardEnabled());
391}
392
393IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, ResumeSavedPref) {
394  // Loads the profile of the user.
395  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
396
397  // Sets the pref to enable large cursor before login.
398  SetLargeCursorEnabledPref(true);
399  EXPECT_FALSE(IsLargeCursorEnabled());
400
401  // Sets the pref to enable spoken feedback before login.
402  SetSpokenFeedbackEnabledPref(true);
403  EXPECT_FALSE(IsSpokenFeedbackEnabled());
404
405  // Sets the pref to enable high contrast before login.
406  SetHighContrastEnabledPref(true);
407  EXPECT_FALSE(IsHighContrastEnabled());
408
409  // Sets the pref to enable autoclick before login.
410  SetAutoclickEnabledPref(true);
411  EXPECT_FALSE(IsAutoclickEnabled());
412
413  // Sets the autoclick delay pref before login but the
414  // initial value should not change.
415  SetAutoclickDelayPref(kTestAutoclickDelayMs);
416  EXPECT_EQ(default_autoclick_delay(), GetAutoclickDelay());
417
418  // Sets the pref to enable the on-screen keyboard before login.
419  SetVirtualKeyboardEnabledPref(true);
420  EXPECT_FALSE(IsVirtualKeyboardEnabled());
421
422  // Logs in.
423  UserManager::Get()->SessionStarted();
424
425  // Confirms that features are enabled by restoring from pref just after login.
426  EXPECT_TRUE(IsLargeCursorEnabled());
427  EXPECT_TRUE(IsSpokenFeedbackEnabled());
428  EXPECT_TRUE(IsHighContrastEnabled());
429  EXPECT_TRUE(IsAutoclickEnabled());
430  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
431  EXPECT_TRUE(IsVirtualKeyboardEnabled());
432}
433
434IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
435                       ChangingTypeInvokesNotification) {
436  MockAccessibilityObserver observer;
437
438  // Logs in.
439  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
440  UserManager::Get()->SessionStarted();
441
442  EXPECT_FALSE(observer.observed());
443  observer.reset();
444
445  SetSpokenFeedbackEnabled(true);
446  EXPECT_TRUE(observer.observed());
447  EXPECT_TRUE(observer.observed_enabled());
448  EXPECT_EQ(observer.observed_type(),
449            ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
450  EXPECT_TRUE(IsSpokenFeedbackEnabled());
451
452  observer.reset();
453  SetSpokenFeedbackEnabled(false);
454  EXPECT_TRUE(observer.observed());
455  EXPECT_FALSE(observer.observed_enabled());
456  EXPECT_EQ(observer.observed_type(),
457            ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
458  EXPECT_FALSE(IsSpokenFeedbackEnabled());
459
460  observer.reset();
461  SetHighContrastEnabled(true);
462  EXPECT_TRUE(observer.observed());
463  EXPECT_TRUE(observer.observed_enabled());
464  EXPECT_EQ(observer.observed_type(),
465            ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
466  EXPECT_TRUE(IsHighContrastEnabled());
467
468  observer.reset();
469  SetHighContrastEnabled(false);
470  EXPECT_TRUE(observer.observed());
471  EXPECT_FALSE(observer.observed_enabled());
472  EXPECT_EQ(observer.observed_type(),
473            ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
474  EXPECT_FALSE(IsHighContrastEnabled());
475
476  observer.reset();
477  SetVirtualKeyboardEnabled(true);
478  EXPECT_TRUE(observer.observed());
479  EXPECT_TRUE(observer.observed_enabled());
480  EXPECT_EQ(observer.observed_type(),
481            ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD);
482  EXPECT_TRUE(IsVirtualKeyboardEnabled());
483
484  observer.reset();
485  SetVirtualKeyboardEnabled(false);
486  EXPECT_TRUE(observer.observed());
487  EXPECT_FALSE(observer.observed_enabled());
488  EXPECT_EQ(observer.observed_type(),
489            ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD);
490  EXPECT_FALSE(IsVirtualKeyboardEnabled());
491}
492
493IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
494                       ChangingTypePrefInvokesNotification) {
495  MockAccessibilityObserver observer;
496
497  // Logs in.
498  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
499  UserManager::Get()->SessionStarted();
500
501  EXPECT_FALSE(observer.observed());
502  observer.reset();
503
504  SetSpokenFeedbackEnabledPref(true);
505  EXPECT_TRUE(observer.observed());
506  EXPECT_TRUE(observer.observed_enabled());
507  EXPECT_EQ(observer.observed_type(),
508            ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
509  EXPECT_TRUE(IsSpokenFeedbackEnabled());
510
511  observer.reset();
512  SetSpokenFeedbackEnabledPref(false);
513  EXPECT_TRUE(observer.observed());
514  EXPECT_FALSE(observer.observed_enabled());
515  EXPECT_EQ(observer.observed_type(),
516            ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
517  EXPECT_FALSE(IsSpokenFeedbackEnabled());
518
519  observer.reset();
520  SetHighContrastEnabledPref(true);
521  EXPECT_TRUE(observer.observed());
522  EXPECT_TRUE(observer.observed_enabled());
523  EXPECT_EQ(observer.observed_type(),
524            ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
525  EXPECT_TRUE(IsHighContrastEnabled());
526
527  observer.reset();
528  SetHighContrastEnabledPref(false);
529  EXPECT_TRUE(observer.observed());
530  EXPECT_FALSE(observer.observed_enabled());
531  EXPECT_EQ(observer.observed_type(),
532            ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
533  EXPECT_FALSE(IsHighContrastEnabled());
534
535  observer.reset();
536  SetVirtualKeyboardEnabledPref(true);
537  EXPECT_TRUE(observer.observed());
538  EXPECT_TRUE(observer.observed_enabled());
539  EXPECT_EQ(observer.observed_type(),
540            ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD);
541  EXPECT_TRUE(IsVirtualKeyboardEnabled());
542
543  observer.reset();
544  SetVirtualKeyboardEnabledPref(false);
545  EXPECT_TRUE(observer.observed());
546  EXPECT_FALSE(observer.observed_enabled());
547  EXPECT_EQ(observer.observed_type(),
548            ACCESSIBILITY_TOGGLE_VIRTUAL_KEYBOARD);
549  EXPECT_FALSE(IsVirtualKeyboardEnabled());
550}
551
552class AccessibilityManagerUserTypeTest
553    : public AccessibilityManagerTest,
554      public ::testing::WithParamInterface<const char*> {
555 protected:
556  AccessibilityManagerUserTypeTest() {}
557  virtual ~AccessibilityManagerUserTypeTest() {}
558
559  DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerUserTypeTest);
560};
561
562// TODO(yoshiki): Enable a test for retail mode.
563INSTANTIATE_TEST_CASE_P(
564    UserTypeInstantiation,
565    AccessibilityManagerUserTypeTest,
566    ::testing::Values(kTestUserName,
567                      UserManager::kGuestUserName,
568                      //UserManager::kRetailModeUserName,
569                      kTestLocallyManagedUserName));
570
571IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest,
572                       EnableOnLoginScreenAndLogin) {
573  // Enables large cursor.
574  SetLargeCursorEnabled(true);
575  EXPECT_TRUE(IsLargeCursorEnabled());
576  // Enables spoken feedback.
577  SetSpokenFeedbackEnabled(true);
578  EXPECT_TRUE(IsSpokenFeedbackEnabled());
579  // Enables high contrast.
580  SetHighContrastEnabled(true);
581  EXPECT_TRUE(IsHighContrastEnabled());
582  // Enables autoclick.
583  SetAutoclickEnabled(true);
584  EXPECT_TRUE(IsAutoclickEnabled());
585  // Set autoclick delay.
586  SetAutoclickDelay(kTestAutoclickDelayMs);
587  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
588
589  // Logs in.
590  const char* user_name = GetParam();
591  UserManager::Get()->UserLoggedIn(user_name, user_name, true);
592
593  // Confirms that the features are still enabled just after login.
594  EXPECT_TRUE(IsLargeCursorEnabled());
595  EXPECT_TRUE(IsSpokenFeedbackEnabled());
596  EXPECT_TRUE(IsHighContrastEnabled());
597  EXPECT_TRUE(IsAutoclickEnabled());
598  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
599
600  UserManager::Get()->SessionStarted();
601
602  // Confirms that the features keep enabled after session starts.
603  EXPECT_TRUE(IsLargeCursorEnabled());
604  EXPECT_TRUE(IsSpokenFeedbackEnabled());
605  EXPECT_TRUE(IsHighContrastEnabled());
606  EXPECT_TRUE(IsAutoclickEnabled());
607  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelay());
608
609  // Confirms that the prefs have been copied to the user's profile.
610  EXPECT_TRUE(GetLargeCursorEnabledFromPref());
611  EXPECT_TRUE(GetSpokenFeedbackEnabledFromPref());
612  EXPECT_TRUE(GetHighContrastEnabledFromPref());
613  EXPECT_TRUE(GetAutoclickEnabledFromPref());
614  EXPECT_EQ(kTestAutoclickDelayMs, GetAutoclickDelayFromPref());
615}
616
617IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest, BrailleWhenLoggedIn) {
618  // Logs in.
619  const char* user_name = GetParam();
620  UserManager::Get()->UserLoggedIn(user_name, user_name, true);
621  UserManager::Get()->SessionStarted();
622  // The |ComponentExtensionIMEManager| defers some initialization to the
623  // |FILE| thread.  We need to wait for that to finish before continuing.
624  InputMethodManager* imm = InputMethodManager::Get();
625  while (!imm->GetComponentExtensionIMEManager()->IsInitialized()) {
626    content::RunAllPendingInMessageLoop(BrowserThread::FILE);
627  }
628  // This object watches for IME preference changes and reflects those in
629  // the IME framework state.
630  chromeos::Preferences prefs;
631  prefs.InitUserPrefsForTesting(PrefServiceSyncable::FromProfile(GetProfile()),
632                                UserManager::Get()->GetActiveUser());
633
634  // Make sure we start in the expected state.
635  EXPECT_FALSE(IsBrailleImeActive());
636  EXPECT_FALSE(IsSpokenFeedbackEnabled());
637
638  // Signal the accessibility manager that a braille display was connected.
639  SetBrailleDisplayAvailability(true);
640
641  // Now, both spoken feedback and the Braille IME should be enabled.
642  EXPECT_TRUE(IsSpokenFeedbackEnabled());
643  EXPECT_TRUE(IsBrailleImeActive());
644
645  // Send a braille dots key event and make sure that the braille IME is
646  // enabled.
647  KeyEvent event;
648  event.command = extensions::api::braille_display_private::KEY_COMMAND_DOTS;
649  event.braille_dots.reset(new int(0));
650  braille_controller_.GetObserver()->OnBrailleKeyEvent(event);
651  EXPECT_TRUE(IsBrailleImeCurrent());
652
653  // Unplug the display.  Spolken feedback remains on, but the Braille IME
654  // should get deactivated.
655  SetBrailleDisplayAvailability(false);
656  EXPECT_TRUE(IsSpokenFeedbackEnabled());
657  EXPECT_FALSE(IsBrailleImeActive());
658  EXPECT_FALSE(IsBrailleImeCurrent());
659
660  // Plugging in a display while spoken feedback is enabled should activate
661  // the Braille IME.
662  SetBrailleDisplayAvailability(true);
663  EXPECT_TRUE(IsSpokenFeedbackEnabled());
664  EXPECT_TRUE(IsBrailleImeActive());
665}
666
667IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, AcessibilityMenuVisibility) {
668  // Log in.
669  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
670  UserManager::Get()->SessionStarted();
671
672  // Confirms that the features are disabled.
673  EXPECT_FALSE(IsLargeCursorEnabled());
674  EXPECT_FALSE(IsSpokenFeedbackEnabled());
675  EXPECT_FALSE(IsHighContrastEnabled());
676  EXPECT_FALSE(IsAutoclickEnabled());
677  EXPECT_FALSE(ShouldShowAccessibilityMenu());
678  EXPECT_FALSE(IsVirtualKeyboardEnabled());
679
680  // Check large cursor.
681  SetLargeCursorEnabled(true);
682  EXPECT_TRUE(ShouldShowAccessibilityMenu());
683  SetLargeCursorEnabled(false);
684  EXPECT_FALSE(ShouldShowAccessibilityMenu());
685
686  // Check spoken feedback.
687  SetSpokenFeedbackEnabled(true);
688  EXPECT_TRUE(ShouldShowAccessibilityMenu());
689  SetSpokenFeedbackEnabled(false);
690  EXPECT_FALSE(ShouldShowAccessibilityMenu());
691
692  // Check high contrast.
693  SetHighContrastEnabled(true);
694  EXPECT_TRUE(ShouldShowAccessibilityMenu());
695  SetHighContrastEnabled(false);
696  EXPECT_FALSE(ShouldShowAccessibilityMenu());
697
698  // Check autoclick.
699  SetAutoclickEnabled(true);
700  EXPECT_TRUE(ShouldShowAccessibilityMenu());
701  SetAutoclickEnabled(false);
702  EXPECT_FALSE(ShouldShowAccessibilityMenu());
703
704  // Check on-screen keyboard.
705  SetVirtualKeyboardEnabled(true);
706  EXPECT_TRUE(ShouldShowAccessibilityMenu());
707  SetVirtualKeyboardEnabled(false);
708  EXPECT_FALSE(ShouldShowAccessibilityMenu());
709}
710
711}  // namespace chromeos
712