accessibility_features_apitest.cc revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
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"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// API tests for chrome.accessibilityFeatures API.
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Note that the API is implemented using preference API infrastructure.
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// See preference_api.cc for the list of accessibility features exposed by the
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// API and the related preferences.
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace extensions {
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace {
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Keys for data in the test config argument that will be set for the test app
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// to use.
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// The test that the app should run.
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestNameKey[] = "testName";
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Key for list of features enabled when the test is initialized.
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kEnabledFeaturesKey[] = "enabled";
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Key for list fo features disabled when the test is initialized.
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kDisabledFeaturesKey[] = "disabled";
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A test extension path. The extension has only |accessibilityFeatures.read|
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// permission.
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestExtensionPathReadPermission[] =
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    "accessibility_features/read_permission/";
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A test extension path. The extension has only |accessibilityFeatures.modify|
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// permission.
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochconst char kTestExtensionPathMofifyPermission[] =
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    "accessibility_features/modify_permission/";
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Accessibility features API test.
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests are parameterized by whether the test extension is write-only (the
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// parameter value is true) or read-only (the parameter value is false).
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass AccessibilityFeaturesApiTest : public ExtensionApiTest,
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     public testing::WithParamInterface<bool> {
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  AccessibilityFeaturesApiTest() {}
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~AccessibilityFeaturesApiTest() {}
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch protected:
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns pref service to be used to initialize and later verify
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // accessibility preference values.
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  PrefService* GetPrefs() { return browser()->profile()->GetPrefs(); }
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns the path of the extension that should be used in a parameterized
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test.
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string GetTestExtensionPath() const {
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (GetParam())
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      return kTestExtensionPathMofifyPermission;
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return kTestExtensionPathReadPermission;
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Whether a parameterized test should have been able to modify accessibility
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // preferences (i.e. whether the test extension had modify permission).
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool ShouldModifyingFeatureSucceed() const { return GetParam(); }
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Returns preference path for accessibility features as defined by the API.
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const char* const GetPrefForFeature(const std::string& feature) {
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "spokenFeedback")
71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilitySpokenFeedbackEnabled;
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "largeCursor")
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityLargeCursorEnabled;
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "stickyKeys")
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityStickyKeysEnabled;
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "highContrast")
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityHighContrastEnabled;
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "screenMagnifier")
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityScreenMagnifierEnabled;
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "autoclick")
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityAutoclickEnabled;
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    if (feature == "virtualKeyboard")
83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      return prefs::kAccessibilityVirtualKeyboardEnabled;
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return NULL;
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Initializes preferences before running the test extension.
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |prefs| Pref service which should be initializzed.
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |enabled_features| List of boolean preference whose value should be set to
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     true.
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |disabled_features| List of boolean preferences whose value should be set
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     to false.
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool InitPrefServiceForTest(
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PrefService* prefs,
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& enabled_features,
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& disabled_features) {
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i) {
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(enabled_features[i]);
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_TRUE(pref_name) << "Invalid feature " << enabled_features[i];
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!pref_name)
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return false;
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      prefs->SetBoolean(pref_name, true);
103effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i) {
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(disabled_features[i]);
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      EXPECT_TRUE(pref_name) << "Invalid feature " << disabled_features[i];
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      if (!pref_name)
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        return false;
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      prefs->SetBoolean(pref_name, false);
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return true;
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Verifies that preferences have the expected value.
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |prefs| The pref service to be verified.
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |enabled_features| The list of boolean preferences whose value should be
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     true.
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |disabled_features| The list of boolean preferences whose value should be
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //     false.
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void VerifyPrefServiceState(
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PrefService* prefs,
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& enabled_features,
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::vector<std::string>& disabled_features) {
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i) {
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(enabled_features[i]);
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(pref_name) << "Invalid feature " << enabled_features[i];
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(prefs->GetBoolean(pref_name));
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i) {
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const char* const pref_name = GetPrefForFeature(disabled_features[i]);
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_TRUE(pref_name) << "Invalid feature " << disabled_features[i];
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      ASSERT_FALSE(prefs->GetBoolean(pref_name));
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    }
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Given the test name and list of enabled and disabled features, generates
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // and sets the JSON string that should be given to the test extension as
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test configuration.
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The result is saved to |result|. The return value is whether the test
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // argument was successfully generated.
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  bool GenerateTestArg(const std::string& test_name,
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const std::vector<std::string>& enabled_features,
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       const std::vector<std::string>& disabled_features,
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                       std::string* result) {
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    base::DictionaryValue test_arg;
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.SetString(kTestNameKey, test_name);
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::ListValue> enabled_list(new base::ListValue);
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < enabled_features.size(); ++i)
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      enabled_list->AppendString(enabled_features[i]);
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.Set(kEnabledFeaturesKey, enabled_list.release());
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    scoped_ptr<base::ListValue> disabled_list(new base::ListValue);
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    for (size_t i = 0; i < disabled_features.size(); ++i)
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      disabled_list->AppendString(disabled_features[i]);
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    test_arg.Set(kDisabledFeaturesKey, disabled_list.release());
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return base::JSONWriter::Write(&test_arg, result);
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Disabled now as this test is being flaky, see http://crbug.com/384266.
165f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DISABLED_AccessibilityFeatureaApiTestInstantiatePermission,
167f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    AccessibilityFeaturesApiTest,
168f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    testing::Bool());
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission can read accessibility features
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// state, while an extension that doesn't have the permission cannot.
172effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Get) {
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("largeCursor");
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("highContrast");
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("spokenFeedback");
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("autoclick");
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("virtualKeyboard");
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "getterTest", enabled_features, disabled_features, &test_arg));
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_TRUE(
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str()));
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with modify permission can modify accessibility
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features, while an extension that doesn't have the permission can't.
196effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Set) {
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("spokenFeedback");
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("autoclick");
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("virtualKeyboard");
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("largeCursor");
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("highContrast");
206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
211effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "setterTest", enabled_features, disabled_features, &test_arg));
214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test extension attempts to flip all feature values.
216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str()));
218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test tries to flip the feature states.
220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  if (ShouldModifyingFeatureSucceed()) {
221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VerifyPrefServiceState(GetPrefs(), disabled_features, enabled_features);
222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  } else {
223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    VerifyPrefServiceState(GetPrefs(), enabled_features, disabled_features);
224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
225effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
226effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission is notified when accessibility
228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features change.
229effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(AccessibilityFeaturesApiTest, ObserveFeatures) {
230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> enabled_features;
231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("largeCursor");
232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("stickyKeys");
233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  enabled_features.push_back("highContrast");
234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<std::string> disabled_features;
236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  disabled_features.push_back("screenMagnifier");
237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
238effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features));
240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string test_arg;
242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(GenerateTestArg(
243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "observerTest", enabled_features, disabled_features, &test_arg));
244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The test extension is supposed to report result twice when runnign this
246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // test. First time when in initializes it's feature listeners, and second
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // time, when gets all expected events. This is done so the extension is
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // running when the accessibility features are flipped; oterwise, the
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // extension may not see events.
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(RunPlatformAppTestWithArg(kTestExtensionPathReadPermission,
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                        test_arg.c_str()));
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This should flip all features.
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      InitPrefServiceForTest(GetPrefs(), disabled_features, enabled_features));
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Catch the second result notification sent by the test extension.
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ResultCatcher result_catcher;
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  ASSERT_TRUE(result_catcher.GetNextResult()) << result_catcher.message();
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace extensions
265