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