accessibility_manager_browsertest.cc revision 4e180b6a0b4720a9b8e9e959a882386f690f08ff
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/user_manager.h"
17#include "chrome/browser/chromeos/login/user_manager_impl.h"
18#include "chrome/browser/chromeos/profiles/profile_helper.h"
19#include "chrome/browser/profiles/profile.h"
20#include "chrome/browser/profiles/profile_manager.h"
21#include "chrome/common/pref_names.h"
22#include "chrome/test/base/in_process_browser_test.h"
23#include "chrome/test/base/testing_profile.h"
24#include "chromeos/chromeos_switches.h"
25#include "content/public/browser/notification_service.h"
26#include "testing/gtest/include/gtest/gtest.h"
27
28namespace chromeos {
29
30namespace {
31
32const char kTestUserName[] = "owner@invalid.domain";
33
34// Test user name for locally managed user. The domain part must be matched
35// with UserManager::kLocallyManagedUserDomain.
36const char kTestLocallyManagedUserName[] = "test@locally-managed.localhost";
37
38class MockAccessibilityObserver : public content::NotificationObserver {
39 public:
40  MockAccessibilityObserver() : observed_(false),
41                                observed_enabled_(false),
42                                observed_type_(-1) {
43    registrar_.Add(
44        this,
45        chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK,
46        content::NotificationService::AllSources());
47    registrar_.Add(
48        this,
49        chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE,
50        content::NotificationService::AllSources());
51  }
52  virtual ~MockAccessibilityObserver() {}
53
54  bool observed() const { return observed_; }
55  bool observed_enabled() const { return observed_enabled_; }
56  int observed_type() const { return observed_type_; }
57
58  void reset() { observed_ = false; }
59
60 private:
61  // content::NotificationObserver implimentation:
62  virtual void Observe(int type,
63                       const content::NotificationSource& source,
64                       const content::NotificationDetails& details) OVERRIDE {
65    AccessibilityStatusEventDetails* accessibility_status =
66        content::Details<AccessibilityStatusEventDetails>(
67            details).ptr();
68    ASSERT_FALSE(observed_);
69
70    switch (type) {
71      case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK:
72        observed_ = true;
73        observed_enabled_ = accessibility_status->enabled;
74        observed_type_ = type;
75        break;
76      case chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE:
77        observed_ = true;
78        observed_enabled_ = accessibility_status->enabled;
79        observed_type_ = type;
80        break;
81    }
82  }
83
84  bool observed_;
85  bool observed_enabled_;
86  int observed_type_;
87
88  content::NotificationRegistrar registrar_;
89
90  DISALLOW_COPY_AND_ASSIGN(MockAccessibilityObserver);
91};
92
93void SetLargeCursorEnabled(bool enabled) {
94  return AccessibilityManager::Get()->EnableLargeCursor(enabled);
95}
96
97bool IsLargeCursorEnabled() {
98  return AccessibilityManager::Get()->IsLargeCursorEnabled();
99}
100
101void SetHighContrastEnabled(bool enabled) {
102  return AccessibilityManager::Get()->EnableHighContrast(enabled);
103}
104
105bool IsHighContrastEnabled() {
106  return AccessibilityManager::Get()->IsHighContrastEnabled();
107}
108
109void SetSpokenFeedbackEnabled(bool enabled) {
110  return AccessibilityManager::Get()->EnableSpokenFeedback(
111      enabled, ash::A11Y_NOTIFICATION_NONE);
112}
113
114bool IsSpokenFeedbackEnabled() {
115  return AccessibilityManager::Get()->IsSpokenFeedbackEnabled();
116}
117
118void SetAutoclickEnabled(bool enabled) {
119  return AccessibilityManager::Get()->EnableAutoclick(enabled);
120}
121
122bool IsAutoclickEnabled() {
123  return AccessibilityManager::Get()->IsAutoclickEnabled();
124}
125
126Profile* GetProfile() {
127  Profile* profile = ProfileManager::GetDefaultProfileOrOffTheRecord();
128  DCHECK(profile);
129  return profile;
130}
131
132PrefService* GetPrefs() {
133  return GetProfile()->GetPrefs();
134}
135
136void SetLargeCursorEnabledPref(bool enabled) {
137  GetPrefs()->SetBoolean(prefs::kLargeCursorEnabled, enabled);
138}
139
140void SetHighContrastEnabledPref(bool enabled) {
141  GetPrefs()->SetBoolean(prefs::kHighContrastEnabled, enabled);
142}
143
144void SetSpokenFeedbackEnabledPref(bool enabled) {
145  GetPrefs()->SetBoolean(prefs::kSpokenFeedbackEnabled, enabled);
146}
147
148void SetAutoclickEnabledPref(bool enabled) {
149  GetPrefs()->SetBoolean(prefs::kAutoclickEnabled, enabled);
150}
151
152bool GetLargeCursorEnabledFromPref() {
153  return GetPrefs()->GetBoolean(prefs::kLargeCursorEnabled);
154}
155
156bool GetHighContrastEnabledFromPref() {
157  return GetPrefs()->GetBoolean(prefs::kHighContrastEnabled);
158}
159
160bool GetSpokenFeedbackEnabledFromPref() {
161  return GetPrefs()->GetBoolean(prefs::kSpokenFeedbackEnabled);
162}
163
164bool GetAutoclickEnabledFromPref() {
165  return GetPrefs()->GetBoolean(prefs::kAutoclickEnabled);
166}
167
168}  // anonymouse namespace
169
170class AccessibilityManagerTest : public InProcessBrowserTest {
171 protected:
172  AccessibilityManagerTest() {}
173  virtual ~AccessibilityManagerTest() {}
174
175  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE {
176    command_line->AppendSwitch(chromeos::switches::kLoginManager);
177    command_line->AppendSwitchASCII(chromeos::switches::kLoginProfile,
178                                    TestingProfile::kTestUserProfileDir);
179  }
180
181  virtual void SetUpOnMainThread() OVERRIDE {
182    // Sets the login-screen profile.
183    AccessibilityManager::Get()->
184        SetProfileForTest(ProfileHelper::GetSigninProfile());
185  }
186
187  content::NotificationRegistrar registrar_;
188  DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerTest);
189};
190
191IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, Login) {
192  // Confirms that a11y features are disabled on the login screen.
193  EXPECT_FALSE(IsLargeCursorEnabled());
194  EXPECT_FALSE(IsSpokenFeedbackEnabled());
195  EXPECT_FALSE(IsHighContrastEnabled());
196  EXPECT_FALSE(IsAutoclickEnabled());
197
198  // Logs in.
199  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
200
201  // Confirms that the features still disabled just after login.
202  EXPECT_FALSE(IsLargeCursorEnabled());
203  EXPECT_FALSE(IsSpokenFeedbackEnabled());
204  EXPECT_FALSE(IsHighContrastEnabled());
205  EXPECT_FALSE(IsAutoclickEnabled());
206
207  UserManager::Get()->SessionStarted();
208
209  // Confirms that the features are still disabled just after login.
210  EXPECT_FALSE(IsLargeCursorEnabled());
211  EXPECT_FALSE(IsSpokenFeedbackEnabled());
212  EXPECT_FALSE(IsHighContrastEnabled());
213  EXPECT_FALSE(IsAutoclickEnabled());
214
215  // Enables large cursor.
216  SetLargeCursorEnabled(true);
217  // Confirms that large cursor is enabled.
218  EXPECT_TRUE(IsLargeCursorEnabled());
219
220  // Enables spoken feedback.
221  SetSpokenFeedbackEnabled(true);
222  // Confirms that the spoken feedback is enabled.
223  EXPECT_TRUE(IsSpokenFeedbackEnabled());
224
225  // Enables high contrast.
226  SetHighContrastEnabled(true);
227  // Confirms that high cotrast is enabled.
228  EXPECT_TRUE(IsHighContrastEnabled());
229
230  // Enables autoclick.
231  SetAutoclickEnabled(true);
232  // Confirms that autoclick is enabled.
233  EXPECT_TRUE(IsAutoclickEnabled());
234}
235
236IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, TypePref) {
237  // Logs in.
238  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
239  UserManager::Get()->SessionStarted();
240
241  // Confirms that the features are disabled just after login.
242  EXPECT_FALSE(IsLargeCursorEnabled());
243  EXPECT_FALSE(IsSpokenFeedbackEnabled());
244  EXPECT_FALSE(IsHighContrastEnabled());
245  EXPECT_FALSE(IsAutoclickEnabled());
246
247  // Sets the pref as true to enable the large cursor.
248  SetLargeCursorEnabledPref(true);
249  // Confirms that the large cursor is enabled.
250  EXPECT_TRUE(IsLargeCursorEnabled());
251
252  // Sets the pref as true to enable the spoken feedback.
253  SetSpokenFeedbackEnabledPref(true);
254  // Confirms that the spoken feedback is enabled.
255  EXPECT_TRUE(IsSpokenFeedbackEnabled());
256
257  // Sets the pref as true to enable high contrast mode.
258  SetHighContrastEnabledPref(true);
259  // Confirms that the high contrast mode is enabled.
260  EXPECT_TRUE(IsHighContrastEnabled());
261
262  // Sets the pref as true to enable autoclick.
263  SetAutoclickEnabledPref(true);
264  // Confirms that autoclick is enabled.
265  EXPECT_TRUE(IsAutoclickEnabled());
266
267  SetLargeCursorEnabledPref(false);
268  EXPECT_FALSE(IsLargeCursorEnabled());
269
270  SetSpokenFeedbackEnabledPref(false);
271  EXPECT_FALSE(IsSpokenFeedbackEnabled());
272
273  SetHighContrastEnabledPref(false);
274  EXPECT_FALSE(IsHighContrastEnabled());
275
276  SetAutoclickEnabledPref(false);
277  EXPECT_FALSE(IsAutoclickEnabled());
278}
279
280IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest, ResumeSavedPref) {
281  // Loads the profile of the user.
282  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
283
284  // Sets the pref to enable large cursor before login.
285  SetLargeCursorEnabledPref(true);
286  EXPECT_FALSE(IsLargeCursorEnabled());
287
288  // Sets the pref to enable spoken feedback before login.
289  SetSpokenFeedbackEnabledPref(true);
290  EXPECT_FALSE(IsSpokenFeedbackEnabled());
291
292  // Sets the pref to enable high contrast before login.
293  SetHighContrastEnabledPref(true);
294  EXPECT_FALSE(IsHighContrastEnabled());
295
296  // Sets the pref to enable autoclick before login.
297  SetAutoclickEnabledPref(true);
298  EXPECT_FALSE(IsAutoclickEnabled());
299
300  // Logs in.
301  UserManager::Get()->SessionStarted();
302
303  // Confirms that features are enabled by restring from pref just after login.
304  EXPECT_TRUE(IsLargeCursorEnabled());
305  EXPECT_TRUE(IsSpokenFeedbackEnabled());
306  EXPECT_TRUE(IsHighContrastEnabled());
307  EXPECT_TRUE(IsAutoclickEnabled());
308}
309
310IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
311                       ChangingTypeInvokesNotification) {
312  MockAccessibilityObserver observer;
313
314  // Logs in.
315  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
316  UserManager::Get()->SessionStarted();
317
318  EXPECT_FALSE(observer.observed());
319  observer.reset();
320
321  SetSpokenFeedbackEnabled(true);
322  EXPECT_TRUE(observer.observed());
323  EXPECT_TRUE(observer.observed_enabled());
324  EXPECT_EQ(observer.observed_type(),
325            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
326  EXPECT_TRUE(IsSpokenFeedbackEnabled());
327
328  observer.reset();
329  SetSpokenFeedbackEnabled(false);
330  EXPECT_TRUE(observer.observed());
331  EXPECT_FALSE(observer.observed_enabled());
332  EXPECT_EQ(observer.observed_type(),
333            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
334  EXPECT_FALSE(IsSpokenFeedbackEnabled());
335
336  observer.reset();
337  SetHighContrastEnabled(true);
338  EXPECT_TRUE(observer.observed());
339  EXPECT_TRUE(observer.observed_enabled());
340  EXPECT_EQ(observer.observed_type(),
341            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
342  EXPECT_TRUE(IsHighContrastEnabled());
343
344  observer.reset();
345  SetHighContrastEnabled(false);
346  EXPECT_TRUE(observer.observed());
347  EXPECT_FALSE(observer.observed_enabled());
348  EXPECT_EQ(observer.observed_type(),
349            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
350  EXPECT_FALSE(IsHighContrastEnabled());
351}
352
353IN_PROC_BROWSER_TEST_F(AccessibilityManagerTest,
354                       ChangingTypePrefInvokesNotification) {
355  MockAccessibilityObserver observer;
356
357  // Logs in.
358  UserManager::Get()->UserLoggedIn(kTestUserName, kTestUserName, true);
359  UserManager::Get()->SessionStarted();
360
361  EXPECT_FALSE(observer.observed());
362  observer.reset();
363
364  SetSpokenFeedbackEnabledPref(true);
365  EXPECT_TRUE(observer.observed());
366  EXPECT_TRUE(observer.observed_enabled());
367  EXPECT_EQ(observer.observed_type(),
368            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
369  EXPECT_TRUE(IsSpokenFeedbackEnabled());
370
371  observer.reset();
372  SetSpokenFeedbackEnabledPref(false);
373  EXPECT_TRUE(observer.observed());
374  EXPECT_FALSE(observer.observed_enabled());
375  EXPECT_EQ(observer.observed_type(),
376            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_SPOKEN_FEEDBACK);
377  EXPECT_FALSE(IsSpokenFeedbackEnabled());
378
379  observer.reset();
380  SetHighContrastEnabledPref(true);
381  EXPECT_TRUE(observer.observed());
382  EXPECT_TRUE(observer.observed_enabled());
383  EXPECT_EQ(observer.observed_type(),
384            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
385  EXPECT_TRUE(IsHighContrastEnabled());
386
387  observer.reset();
388  SetHighContrastEnabledPref(false);
389  EXPECT_TRUE(observer.observed());
390  EXPECT_FALSE(observer.observed_enabled());
391  EXPECT_EQ(observer.observed_type(),
392            chrome::NOTIFICATION_CROS_ACCESSIBILITY_TOGGLE_HIGH_CONTRAST_MODE);
393  EXPECT_FALSE(IsHighContrastEnabled());
394}
395
396class AccessibilityManagerUserTypeTest
397    : public AccessibilityManagerTest,
398      public ::testing::WithParamInterface<const char*> {
399 protected:
400  AccessibilityManagerUserTypeTest() {}
401  virtual ~AccessibilityManagerUserTypeTest() {}
402
403  DISALLOW_COPY_AND_ASSIGN(AccessibilityManagerUserTypeTest);
404};
405
406// TODO(yoshiki): Enable a test for retail mode.
407INSTANTIATE_TEST_CASE_P(
408    UserTypeInstantiation,
409    AccessibilityManagerUserTypeTest,
410    ::testing::Values(kTestUserName,
411                      UserManager::kGuestUserName,
412                      //UserManager::kRetailModeUserName,
413                      kTestLocallyManagedUserName));
414
415IN_PROC_BROWSER_TEST_P(AccessibilityManagerUserTypeTest,
416                       EnableOnLoginScreenAndLogin) {
417  // Enables large cursor.
418  SetLargeCursorEnabled(true);
419  EXPECT_TRUE(IsLargeCursorEnabled());
420  // Enables spoken feedback.
421  SetSpokenFeedbackEnabled(true);
422  EXPECT_TRUE(IsSpokenFeedbackEnabled());
423  // Enables high contrast.
424  SetHighContrastEnabled(true);
425  EXPECT_TRUE(IsHighContrastEnabled());
426  // Enables autoclick.
427  SetAutoclickEnabled(true);
428  EXPECT_TRUE(IsAutoclickEnabled());
429
430  // Logs in.
431  const char* user_name = GetParam();
432  UserManager::Get()->UserLoggedIn(user_name, user_name, true);
433
434  // Confirms that the features are still enabled just after login.
435  EXPECT_TRUE(IsLargeCursorEnabled());
436  EXPECT_TRUE(IsSpokenFeedbackEnabled());
437  EXPECT_TRUE(IsHighContrastEnabled());
438  EXPECT_TRUE(IsAutoclickEnabled());
439
440  UserManager::Get()->SessionStarted();
441
442  // Confirms that the features keep enabled after session starts.
443  EXPECT_TRUE(IsLargeCursorEnabled());
444  EXPECT_TRUE(IsSpokenFeedbackEnabled());
445  EXPECT_TRUE(IsHighContrastEnabled());
446  EXPECT_TRUE(IsAutoclickEnabled());
447
448  // Confirms that the prefs have been copied to the user's profile.
449  EXPECT_TRUE(GetLargeCursorEnabledFromPref());
450  EXPECT_TRUE(GetSpokenFeedbackEnabledFromPref());
451  EXPECT_TRUE(GetHighContrastEnabledFromPref());
452  EXPECT_TRUE(GetAutoclickEnabledFromPref());
453}
454
455}  // namespace chromeos
456