1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <string>
6effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include <vector>
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/json/json_writer.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/prefs/pref_service.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/strings/stringprintf.h"
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "base/values.h"
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/browser/extensions/extension_apitest.h"
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "chrome/common/pref_names.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/result_catcher.h"
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// API tests for chrome.accessibilityFeatures API.
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Note that the API is implemented using preference API infrastructure.
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// See preference_api.cc for the list of accessibility features exposed by the
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// API and the related preferences.
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace extensions {
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Keys for data in the test config argument that will be set for the test app
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// to use.
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The test that the app should run.
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestNameKey[] = "testName";
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Key for list of features enabled when the test is initialized.
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kEnabledFeaturesKey[] = "enabled";
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Key for list fo features disabled when the test is initialized.
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kDisabledFeaturesKey[] = "disabled";
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A test extension path. The extension has only |accessibilityFeatures.read|
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// permission.
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestExtensionPathReadPermission[] =
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    "accessibility_features/read_permission/";
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A test extension path. The extension has only |accessibilityFeatures.modify|
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// permission.
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestExtensionPathMofifyPermission[] =
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    "accessibility_features/modify_permission/";
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Accessibility features API test.
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests are parameterized by whether the test extension is write-only (the
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// parameter value is true) or read-only (the parameter value is false).
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass AccessibilityFeaturesApiTest : public ExtensionApiTest,
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     public testing::WithParamInterface<bool> {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AccessibilityFeaturesApiTest() {}
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~AccessibilityFeaturesApiTest() {}
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns pref service to be used to initialize and later verify
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // accessibility preference values.
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PrefService* GetPrefs() { return browser()->profile()->GetPrefs(); }
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns the path of the extension that should be used in a parameterized
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test.
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string GetTestExtensionPath() const {
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (GetParam())
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return kTestExtensionPathMofifyPermission;
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return kTestExtensionPathReadPermission;
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Whether a parameterized test should have been able to modify accessibility
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // preferences (i.e. whether the test extension had modify permission).
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool ShouldModifyingFeatureSucceed() const { return GetParam(); }
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns preference path for accessibility features as defined by the API.
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const char* const GetPrefForFeature(const std::string& feature) {
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "spokenFeedback")
72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilitySpokenFeedbackEnabled;
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "largeCursor")
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityLargeCursorEnabled;
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "stickyKeys")
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityStickyKeysEnabled;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "highContrast")
78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityHighContrastEnabled;
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "screenMagnifier")
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityScreenMagnifierEnabled;
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "autoclick")
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityAutoclickEnabled;
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "virtualKeyboard")
84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityVirtualKeyboardEnabled;
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Initializes preferences before running the test extension.
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |prefs| Pref service which should be initializzed.
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |enabled_features| List of boolean preference whose value should be set to
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     true.
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |disabled_features| List of boolean preferences whose value should be set
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     to false.
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool InitPrefServiceForTest(
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PrefService* prefs,
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& enabled_features,
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& disabled_features) {
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i) {
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(enabled_features[i]);
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_TRUE(pref_name) << "Invalid feature " << enabled_features[i];
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!pref_name)
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return false;
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      prefs->SetBoolean(pref_name, true);
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i) {
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(disabled_features[i]);
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_TRUE(pref_name) << "Invalid feature " << disabled_features[i];
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!pref_name)
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return false;
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      prefs->SetBoolean(pref_name, false);
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return true;
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Verifies that preferences have the expected value.
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |prefs| The pref service to be verified.
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |enabled_features| The list of boolean preferences whose value should be
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     true.
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |disabled_features| The list of boolean preferences whose value should be
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     false.
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void VerifyPrefServiceState(
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PrefService* prefs,
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& enabled_features,
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& disabled_features) {
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i) {
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(enabled_features[i]);
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(pref_name) << "Invalid feature " << enabled_features[i];
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(prefs->GetBoolean(pref_name));
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i) {
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(disabled_features[i]);
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(pref_name) << "Invalid feature " << disabled_features[i];
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_FALSE(prefs->GetBoolean(pref_name));
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Given the test name and list of enabled and disabled features, generates
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // and sets the JSON string that should be given to the test extension as
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test configuration.
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The result is saved to |result|. The return value is whether the test
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // argument was successfully generated.
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool GenerateTestArg(const std::string& test_name,
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const std::vector<std::string>& enabled_features,
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const std::vector<std::string>& disabled_features,
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       std::string* result) {
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::DictionaryValue test_arg;
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.SetString(kTestNameKey, test_name);
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::ListValue> enabled_list(new base::ListValue);
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i)
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      enabled_list->AppendString(enabled_features[i]);
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.Set(kEnabledFeaturesKey, enabled_list.release());
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::ListValue> disabled_list(new base::ListValue);
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i)
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      disabled_list->AppendString(disabled_features[i]);
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.Set(kDisabledFeaturesKey, disabled_list.release());
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return base::JSONWriter::Write(&test_arg, result);
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AccessibilityFeatureaApiTestInstantiatePermission,
1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        AccessibilityFeaturesApiTest,
1676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                        testing::Bool());
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission can read accessibility features
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// state, while an extension that doesn't have the permission cannot.
171effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Get) {
1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // WARNING: Make sure that spoken feedback is not among enabled_features
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // (see |Set| test for the reason).
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("largeCursor");
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("highContrast");
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("spokenFeedback");
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("autoclick");
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("virtualKeyboard");
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "getterTest", enabled_features, disabled_features, &test_arg));
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str()))
1936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      << message_;
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with modify permission can modify accessibility
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features, while an extension that doesn't have the permission can't.
198effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Set) {
1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // WARNING: Make sure that spoken feedback does not get enabled at this point
2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // (before the test app is loaded), as that may break the test:
2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // |RunPlatformAppTestWithArg| waits for the test extension to load by
2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // waiting for EXTENSION_LOADED notification to be observed. It also assumes
2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // that there is only one extension being loaded during this time (it finishes
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // when the first notification is seen). Enabling spoken feedback here would
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // break this assumption as it would induce loading of ChromeVox extension.
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("autoclick");
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("virtualKeyboard");
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  disabled_features.push_back("spokenFeedback");
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("largeCursor");
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("highContrast");
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "setterTest", enabled_features, disabled_features, &test_arg));
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test extension attempts to flip all feature values.
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str()))
2276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      << message_;
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test tries to flip the feature states.
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ShouldModifyingFeatureSucceed()) {
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VerifyPrefServiceState(GetPrefs(), disabled_features, enabled_features);
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else {
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VerifyPrefServiceState(GetPrefs(), enabled_features, disabled_features);
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission is notified when accessibility
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features change.
239effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(AccessibilityFeaturesApiTest, ObserveFeatures) {
2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // WARNING: Make sure that spoken feedback is not among enabled_features
2416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // (see |Set| test for the reason).
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("largeCursor");
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("highContrast");
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "observerTest", enabled_features, disabled_features, &test_arg));
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test extension is supposed to report result twice when runnign this
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test. First time when in initializes it's feature listeners, and second
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // time, when gets all expected events. This is done so the extension is
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // running when the accessibility features are flipped; oterwise, the
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // extension may not see events.
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(RunPlatformAppTestWithArg(kTestExtensionPathReadPermission,
2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)                                        test_arg.c_str()))
2646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      << message_;
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This should flip all features.
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), disabled_features, enabled_features));
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Catch the second result notification sent by the test extension.
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResultCatcher result_catcher;
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace extensions
278