accessibility_features_apitest.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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 1646d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AccessibilityFeatureaApiTestInstantiatePermission, 1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) AccessibilityFeaturesApiTest, 1666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) testing::Bool()); 167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission can read accessibility features 169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// state, while an extension that doesn't have the permission cannot. 170effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Get) { 1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // WARNING: Make sure that spoken feedback is not among enabled_features 1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // (see |Set| test for the reason). 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( 1916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str())) 1926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) << message_; 193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with modify permission can modify accessibility 196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features, while an extension that doesn't have the permission can't. 197effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_P(AccessibilityFeaturesApiTest, Set) { 1986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // WARNING: Make sure that spoken feedback does not get enabled at this point 1996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // (before the test app is loaded), as that may break the test: 2006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // |RunPlatformAppTestWithArg| waits for the test extension to load by 2016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // waiting for EXTENSION_LOADED notification to be observed. It also assumes 2026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // that there is only one extension being loaded during this time (it finishes 2036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // when the first notification is seen). Enabling spoken feedback here would 2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // break this assumption as it would induce loading of ChromeVox extension. 205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<std::string> enabled_features; 206effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("stickyKeys"); 207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("autoclick"); 208effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("virtualKeyboard"); 209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 210effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<std::string> disabled_features; 2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) disabled_features.push_back("spokenFeedback"); 212effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch disabled_features.push_back("largeCursor"); 213effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch disabled_features.push_back("highContrast"); 214effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch disabled_features.push_back("screenMagnifier"); 215effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 216effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE( 217effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features)); 218effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 219effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string test_arg; 220effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(GenerateTestArg( 221effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "setterTest", enabled_features, disabled_features, &test_arg)); 222effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 223effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The test extension attempts to flip all feature values. 224effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE( 2256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) RunPlatformAppTestWithArg(GetTestExtensionPath(), test_arg.c_str())) 2266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) << message_; 227effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 228effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The test tries to flip the feature states. 229effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch if (ShouldModifyingFeatureSucceed()) { 230effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch VerifyPrefServiceState(GetPrefs(), disabled_features, enabled_features); 231effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } else { 232effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch VerifyPrefServiceState(GetPrefs(), enabled_features, disabled_features); 233effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch } 234effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 235effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 236effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Tests that an extension with read permission is notified when accessibility 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// features change. 238effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochIN_PROC_BROWSER_TEST_F(AccessibilityFeaturesApiTest, ObserveFeatures) { 2396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // WARNING: Make sure that spoken feedback is not among enabled_features 2406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // (see |Set| test for the reason). 241effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<std::string> enabled_features; 242effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("largeCursor"); 243effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("stickyKeys"); 244effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch enabled_features.push_back("highContrast"); 245effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 246effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::vector<std::string> disabled_features; 247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch disabled_features.push_back("screenMagnifier"); 248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE( 250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InitPrefServiceForTest(GetPrefs(), enabled_features, disabled_features)); 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch std::string test_arg; 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(GenerateTestArg( 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch "observerTest", enabled_features, disabled_features, &test_arg)); 255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // The test extension is supposed to report result twice when runnign this 257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // test. First time when in initializes it's feature listeners, and second 258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // time, when gets all expected events. This is done so the extension is 259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // running when the accessibility features are flipped; oterwise, the 260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // extension may not see events. 261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(RunPlatformAppTestWithArg(kTestExtensionPathReadPermission, 2626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) test_arg.c_str())) 2636d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) << message_; 264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // This should flip all features. 266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE( 267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch InitPrefServiceForTest(GetPrefs(), disabled_features, enabled_features)); 268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Catch the second result notification sent by the test extension. 270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ResultCatcher result_catcher; 271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch ASSERT_TRUE(result_catcher.GetNextResult()) << result_catcher.message(); 272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} 273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace 275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // namespace extensions 277