OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/files/scoped_temp_dir.h" | 5 #include "base/files/scoped_temp_dir.h" |
| 6 #include "base/memory/scoped_ptr.h" |
6 #include "base/strings/string_split.h" | 7 #include "base/strings/string_split.h" |
7 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
8 #include "base/strings/utf_string_conversions.h" | 9 #include "base/strings/utf_string_conversions.h" |
9 #include "base/time/time.h" | 10 #include "base/time/time.h" |
10 #include "chrome/browser/search_engines/default_search_manager.h" | 11 #include "chrome/browser/search_engines/default_search_manager.h" |
11 #include "chrome/browser/search_engines/template_url.h" | 12 #include "chrome/browser/search_engines/template_url.h" |
| 13 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
| 14 #include "chrome/common/pref_names.h" |
12 #include "chrome/test/base/testing_pref_service_syncable.h" | 15 #include "chrome/test/base/testing_pref_service_syncable.h" |
13 #include "components/user_prefs/pref_registry_syncable.h" | 16 #include "components/user_prefs/pref_registry_syncable.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
15 | 18 |
16 namespace { | 19 namespace { |
| 20 // A dictionary to hold all data related to the Default Search Engine. |
| 21 // Eventually, this should replace all the data stored in the |
| 22 // default_search_provider.* prefs. |
| 23 const char kDefaultSearchProviderData[] = |
| 24 "default_search_provider_data.template_url_data"; |
17 | 25 |
18 // Checks that the two TemplateURLs are similar. It does not check the id, the | 26 // Checks that the two TemplateURLs are similar. It does not check the id, the |
19 // date_created or the last_modified time. Neither pointer should be NULL. | 27 // date_created or the last_modified time. Neither pointer should be NULL. |
20 void ExpectSimilar(const TemplateURLData* expected, | 28 void ExpectSimilar(const TemplateURLData* expected, |
21 const TemplateURLData* actual) { | 29 const TemplateURLData* actual) { |
22 ASSERT_TRUE(expected != NULL); | 30 ASSERT_TRUE(expected != NULL); |
23 ASSERT_TRUE(actual != NULL); | 31 ASSERT_TRUE(actual != NULL); |
24 | 32 |
25 EXPECT_EQ(expected->short_name, actual->short_name); | 33 EXPECT_EQ(expected->short_name, actual->short_name); |
26 EXPECT_EQ(expected->keyword(), actual->keyword()); | 34 EXPECT_EQ(expected->keyword(), actual->keyword()); |
27 EXPECT_EQ(expected->url(), actual->url()); | 35 EXPECT_EQ(expected->url(), actual->url()); |
28 EXPECT_EQ(expected->suggestions_url, actual->suggestions_url); | 36 EXPECT_EQ(expected->suggestions_url, actual->suggestions_url); |
29 EXPECT_EQ(expected->favicon_url, actual->favicon_url); | 37 EXPECT_EQ(expected->favicon_url, actual->favicon_url); |
30 EXPECT_EQ(expected->alternate_urls, actual->alternate_urls); | 38 EXPECT_EQ(expected->alternate_urls, actual->alternate_urls); |
31 EXPECT_EQ(expected->show_in_default_list, actual->show_in_default_list); | 39 EXPECT_EQ(expected->show_in_default_list, actual->show_in_default_list); |
32 EXPECT_EQ(expected->safe_for_autoreplace, actual->safe_for_autoreplace); | 40 EXPECT_EQ(expected->safe_for_autoreplace, actual->safe_for_autoreplace); |
33 EXPECT_EQ(expected->input_encodings, actual->input_encodings); | 41 EXPECT_EQ(expected->input_encodings, actual->input_encodings); |
34 EXPECT_EQ(expected->search_terms_replacement_key, | 42 EXPECT_EQ(expected->search_terms_replacement_key, |
35 actual->search_terms_replacement_key); | 43 actual->search_terms_replacement_key); |
36 } | 44 } |
37 | 45 |
| 46 // TODO(caitkp): TemplateURLData-ify this. |
| 47 void SetOverrides(TestingPrefServiceSyncable* prefs, bool update) { |
| 48 prefs->SetUserPref(prefs::kSearchProviderOverridesVersion, |
| 49 base::Value::CreateIntegerValue(1)); |
| 50 base::ListValue* overrides = new base::ListValue; |
| 51 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue); |
| 52 |
| 53 entry->SetString("name", update ? "new_foo" : "foo"); |
| 54 entry->SetString("keyword", update ? "new_fook" : "fook"); |
| 55 entry->SetString("search_url", "http://foo.com/s?q={searchTerms}"); |
| 56 entry->SetString("favicon_url", "http://foi.com/favicon.ico"); |
| 57 entry->SetString("encoding", "UTF-8"); |
| 58 entry->SetInteger("id", 1001); |
| 59 entry->SetString("suggest_url", "http://foo.com/suggest?q={searchTerms}"); |
| 60 entry->SetString("instant_url", "http://foo.com/instant?q={searchTerms}"); |
| 61 base::ListValue* alternate_urls = new base::ListValue; |
| 62 alternate_urls->AppendString("http://foo.com/alternate?q={searchTerms}"); |
| 63 entry->Set("alternate_urls", alternate_urls); |
| 64 entry->SetString("search_terms_replacement_key", "espv"); |
| 65 overrides->Append(entry->DeepCopy()); |
| 66 |
| 67 entry.reset(new base::DictionaryValue); |
| 68 entry->SetInteger("id", 1002); |
| 69 entry->SetString("name", update ? "new_bar" : "bar"); |
| 70 entry->SetString("keyword", update ? "new_bark" : "bark"); |
| 71 entry->SetString("encoding", std::string()); |
| 72 overrides->Append(entry->DeepCopy()); |
| 73 entry->SetInteger("id", 1003); |
| 74 entry->SetString("name", "baz"); |
| 75 entry->SetString("keyword", "bazk"); |
| 76 entry->SetString("encoding", "UTF-8"); |
| 77 overrides->Append(entry->DeepCopy()); |
| 78 prefs->SetUserPref(prefs::kSearchProviderOverrides, overrides); |
| 79 } |
| 80 |
| 81 void SetPolicy(TestingPrefServiceSyncable* prefs, |
| 82 bool enabled, |
| 83 TemplateURLData* data) { |
| 84 if (enabled) { |
| 85 EXPECT_FALSE(data->keyword().empty()); |
| 86 EXPECT_FALSE(data->url().empty()); |
| 87 } |
| 88 scoped_ptr<base::DictionaryValue> entry(new base::DictionaryValue); |
| 89 entry->SetString(DefaultSearchManager::kShortName, data->short_name); |
| 90 entry->SetString(DefaultSearchManager::kKeyword, data->keyword()); |
| 91 entry->SetString(DefaultSearchManager::kURL, data->url()); |
| 92 entry->SetString(DefaultSearchManager::kFaviconURL, data->favicon_url.spec()); |
| 93 entry->SetString(DefaultSearchManager::kSuggestionsURL, |
| 94 data->suggestions_url); |
| 95 entry->SetBoolean(DefaultSearchManager::kSafeForAutoReplace, |
| 96 data->safe_for_autoreplace); |
| 97 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); |
| 98 for (std::vector<std::string>::const_iterator it = |
| 99 data->alternate_urls.begin(); |
| 100 it != data->alternate_urls.end(); ++it) { |
| 101 alternate_urls->AppendString(*it); |
| 102 } |
| 103 entry->Set(DefaultSearchManager::kAlternateURLs, alternate_urls.release()); |
| 104 |
| 105 scoped_ptr<base::ListValue> encodings(new base::ListValue); |
| 106 for (std::vector<std::string>::const_iterator it = |
| 107 data->input_encodings.begin(); |
| 108 it != data->input_encodings.end(); ++it) { |
| 109 encodings->AppendString(*it); |
| 110 } |
| 111 entry->Set(DefaultSearchManager::kInputEncodings, encodings.release()); |
| 112 |
| 113 entry->SetString(DefaultSearchManager::kSearchTermsReplacementKey, |
| 114 data->search_terms_replacement_key); |
| 115 entry->SetBoolean(DefaultSearchManager::kDisabledByPolicy, !enabled); |
| 116 prefs->SetManagedPref(kDefaultSearchProviderData, entry.release()); |
| 117 } |
| 118 |
| 119 scoped_ptr<TemplateURLData> GenerateDummyTemplateURLData(std::string type) { |
| 120 scoped_ptr<TemplateURLData> data(new TemplateURLData()); |
| 121 data->short_name = base::UTF8ToUTF16(std::string(type).append("name")); |
| 122 data->SetKeyword(base::UTF8ToUTF16(std::string(type).append("key"))); |
| 123 data->SetURL(std::string("http://").append(type).append("foo/{searchTerms}")); |
| 124 data->suggestions_url = std::string("http://").append(type).append("sugg"); |
| 125 data->alternate_urls.push_back( |
| 126 std::string("http://").append(type).append("foo/alt")); |
| 127 data->favicon_url = GURL("http://icon1"); |
| 128 data->safe_for_autoreplace = true; |
| 129 data->show_in_default_list = true; |
| 130 base::SplitString("UTF-8;UTF-16", ';', &data->input_encodings); |
| 131 data->date_created = base::Time(); |
| 132 data->last_modified = base::Time(); |
| 133 return data.Pass(); |
| 134 } |
| 135 |
38 } // namespace | 136 } // namespace |
39 | 137 |
40 class DefaultSearchManagerTest : public testing::Test { | 138 class DefaultSearchManagerTest : public testing::Test { |
41 public: | 139 public: |
42 DefaultSearchManagerTest() {}; | 140 DefaultSearchManagerTest() {}; |
43 | 141 |
44 virtual void SetUp() OVERRIDE { | 142 virtual void SetUp() OVERRIDE { |
45 pref_service_.reset(new TestingPrefServiceSyncable); | 143 pref_service_.reset(new TestingPrefServiceSyncable); |
46 DefaultSearchManager::RegisterProfilePrefs(pref_service_->registry()); | 144 DefaultSearchManager::RegisterProfilePrefs(pref_service_->registry()); |
| 145 TemplateURLPrepopulateData::RegisterProfilePrefs(pref_service_->registry()); |
47 } | 146 } |
48 | 147 |
49 PrefService* pref_service() { return pref_service_.get(); } | 148 TestingPrefServiceSyncable* pref_service() { return pref_service_.get(); } |
50 | 149 |
51 private: | 150 private: |
52 scoped_ptr<TestingPrefServiceSyncable> pref_service_; | 151 scoped_ptr<TestingPrefServiceSyncable> pref_service_; |
53 | 152 |
54 DISALLOW_COPY_AND_ASSIGN(DefaultSearchManagerTest); | 153 DISALLOW_COPY_AND_ASSIGN(DefaultSearchManagerTest); |
55 }; | 154 }; |
56 | 155 |
57 // Test that a TemplateURLData object is properly written and read from Prefs. | 156 // Test that a TemplateURLData object is properly written and read from Prefs. |
58 TEST_F(DefaultSearchManagerTest, ReadAndWritePref) { | 157 TEST_F(DefaultSearchManagerTest, ReadAndWritePref) { |
59 DefaultSearchManager manager(pref_service()); | 158 DefaultSearchManager manager(pref_service(), |
| 159 DefaultSearchManager::ObserverCallback()); |
60 TemplateURLData data; | 160 TemplateURLData data; |
61 data.short_name = base::UTF8ToUTF16("name1"); | 161 data.short_name = base::UTF8ToUTF16("name1"); |
62 data.SetKeyword(base::UTF8ToUTF16("key1")); | 162 data.SetKeyword(base::UTF8ToUTF16("key1")); |
63 data.SetURL("http://foo1/{searchTerms}"); | 163 data.SetURL("http://foo1/{searchTerms}"); |
64 data.suggestions_url = "http://sugg1"; | 164 data.suggestions_url = "http://sugg1"; |
65 data.alternate_urls.push_back("http://foo1/alt"); | 165 data.alternate_urls.push_back("http://foo1/alt"); |
66 data.favicon_url = GURL("http://icon1"); | 166 data.favicon_url = GURL("http://icon1"); |
67 data.safe_for_autoreplace = true; | 167 data.safe_for_autoreplace = true; |
68 data.show_in_default_list = true; | 168 data.show_in_default_list = true; |
69 base::SplitString("UTF-8;UTF-16", ';', &data.input_encodings); | 169 base::SplitString("UTF-8;UTF-16", ';', &data.input_encodings); |
70 data.date_created = base::Time(); | 170 data.date_created = base::Time(); |
71 data.last_modified = base::Time(); | 171 data.last_modified = base::Time(); |
72 | 172 |
73 manager.SetUserSelectedDefaultSearchEngine(data); | 173 manager.SetUserSelectedDefaultSearchEngine(data); |
74 TemplateURLData read_data; | 174 TemplateURLData* read_data = manager.GetDefaultSearchEngine(NULL); |
75 manager.GetDefaultSearchEngine(&read_data); | 175 ExpectSimilar(&data, read_data); |
76 ExpectSimilar(&data, &read_data); | |
77 } | 176 } |
78 | 177 |
79 // Test that there is no default value set in the pref. | 178 // Test DefaultSearchmanager handles user-selected DSEs correctly. |
80 TEST_F(DefaultSearchManagerTest, ReadDefaultPref) { | 179 TEST_F(DefaultSearchManagerTest, DefaultSearchSetByUserPref) { |
81 DefaultSearchManager manager(pref_service()); | 180 size_t default_search_index = 0; |
82 TemplateURLData read_data; | 181 DefaultSearchManager manager(pref_service(), |
83 EXPECT_FALSE(manager.GetDefaultSearchEngine(&read_data)); | 182 DefaultSearchManager::ObserverCallback()); |
| 183 ScopedVector<TemplateURLData> prepopulated_urls = |
| 184 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(), |
| 185 &default_search_index); |
| 186 DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY; |
| 187 // If no user pref is set, we should use the pre-populated values. |
| 188 ExpectSimilar(prepopulated_urls[default_search_index], |
| 189 manager.GetDefaultSearchEngine(&source)); |
| 190 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); |
| 191 |
| 192 // Setting a user pref overrides the pre-populated values. |
| 193 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user"); |
| 194 manager.SetUserSelectedDefaultSearchEngine(*data.get()); |
| 195 |
| 196 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source)); |
| 197 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 198 |
| 199 // Updating the user pref (externally to this instance of |
| 200 // DefaultSearchManager) triggers an update. |
| 201 scoped_ptr<TemplateURLData> new_data = GenerateDummyTemplateURLData("user2"); |
| 202 DefaultSearchManager other_manager(pref_service(), |
| 203 DefaultSearchManager::ObserverCallback()); |
| 204 other_manager.SetUserSelectedDefaultSearchEngine(*new_data.get()); |
| 205 |
| 206 ExpectSimilar(new_data.get(), manager.GetDefaultSearchEngine(&source)); |
| 207 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 208 |
| 209 // Clearing the user pref should cause the default search to revert to the |
| 210 // prepopulated vlaues. |
| 211 manager.ClearUserSelectedDefaultSearchEngine(); |
| 212 ExpectSimilar(prepopulated_urls[default_search_index], |
| 213 manager.GetDefaultSearchEngine(&source)); |
| 214 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); |
84 } | 215 } |
| 216 |
| 217 // Test that DefaultSearch manager detects changes to kSearchProviderOverrides. |
| 218 TEST_F(DefaultSearchManagerTest, DefaultSearchSetByOverrides) { |
| 219 SetOverrides(pref_service(), false); |
| 220 size_t default_search_index = 0; |
| 221 DefaultSearchManager manager(pref_service(), |
| 222 DefaultSearchManager::ObserverCallback()); |
| 223 ScopedVector<TemplateURLData> prepopulated_urls = |
| 224 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service(), |
| 225 &default_search_index); |
| 226 |
| 227 DefaultSearchManager::Source source = DefaultSearchManager::FROM_POLICY; |
| 228 TemplateURLData first_default(*manager.GetDefaultSearchEngine(&source)); |
| 229 ExpectSimilar(prepopulated_urls[default_search_index], &first_default); |
| 230 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); |
| 231 |
| 232 // Update the overrides: |
| 233 SetOverrides(pref_service(), true); |
| 234 prepopulated_urls = TemplateURLPrepopulateData::GetPrepopulatedEngines( |
| 235 pref_service(), &default_search_index); |
| 236 |
| 237 // Make sure DefaultSearchManager updated: |
| 238 ExpectSimilar(prepopulated_urls[default_search_index], |
| 239 manager.GetDefaultSearchEngine(&source)); |
| 240 EXPECT_EQ(DefaultSearchManager::FROM_FALLBACK, source); |
| 241 EXPECT_NE(manager.GetDefaultSearchEngine(NULL)->short_name, |
| 242 first_default.short_name); |
| 243 EXPECT_NE(manager.GetDefaultSearchEngine(NULL)->keyword(), |
| 244 first_default.keyword()); |
| 245 } |
| 246 |
| 247 // Test DefaultSearchManager handles policy-enforced DSEs correctly. |
| 248 TEST_F(DefaultSearchManagerTest, DefaultSearchSetByPolicy) { |
| 249 DefaultSearchManager manager(pref_service(), |
| 250 DefaultSearchManager::ObserverCallback()); |
| 251 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user"); |
| 252 manager.SetUserSelectedDefaultSearchEngine(*data.get()); |
| 253 |
| 254 DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK; |
| 255 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source)); |
| 256 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 257 |
| 258 scoped_ptr<TemplateURLData> policy_data = |
| 259 GenerateDummyTemplateURLData("policy"); |
| 260 SetPolicy(pref_service(), true, policy_data.get()); |
| 261 |
| 262 ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source)); |
| 263 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source); |
| 264 |
| 265 TemplateURLData null_policy_data; |
| 266 SetPolicy(pref_service(), false, &null_policy_data); |
| 267 EXPECT_EQ(NULL, manager.GetDefaultSearchEngine(&source)); |
| 268 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source); |
| 269 |
| 270 pref_service()->RemoveManagedPref(kDefaultSearchProviderData); |
| 271 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source)); |
| 272 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 273 } |
| 274 |
| 275 // Test DefaultSearchManager handles extension-controlled DSEs correctly. |
| 276 TEST_F(DefaultSearchManagerTest, DefaultSearchSetByExtension) { |
| 277 DefaultSearchManager manager(pref_service(), |
| 278 DefaultSearchManager::ObserverCallback()); |
| 279 scoped_ptr<TemplateURLData> data = GenerateDummyTemplateURLData("user"); |
| 280 manager.SetUserSelectedDefaultSearchEngine(*data); |
| 281 |
| 282 DefaultSearchManager::Source source = DefaultSearchManager::FROM_FALLBACK; |
| 283 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source)); |
| 284 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 285 |
| 286 // Extension trumps prefs: |
| 287 scoped_ptr<TemplateURLData> extension_data_1 = |
| 288 GenerateDummyTemplateURLData("ext1"); |
| 289 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_1); |
| 290 |
| 291 ExpectSimilar(extension_data_1.get(), |
| 292 manager.GetDefaultSearchEngine(&source)); |
| 293 EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source); |
| 294 |
| 295 // Policy trumps extension: |
| 296 scoped_ptr<TemplateURLData> policy_data = |
| 297 GenerateDummyTemplateURLData("policy"); |
| 298 SetPolicy(pref_service(), true, policy_data.get()); |
| 299 |
| 300 ExpectSimilar(policy_data.get(), manager.GetDefaultSearchEngine(&source)); |
| 301 EXPECT_EQ(DefaultSearchManager::FROM_POLICY, source); |
| 302 pref_service()->RemoveManagedPref(kDefaultSearchProviderData); |
| 303 |
| 304 // Extensions trump each other: |
| 305 scoped_ptr<TemplateURLData> extension_data_2 = |
| 306 GenerateDummyTemplateURLData("ext2"); |
| 307 scoped_ptr<TemplateURLData> extension_data_3 = |
| 308 GenerateDummyTemplateURLData("ext3"); |
| 309 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_2); |
| 310 manager.SetExtensionControlledDefaultSearchEngine(*extension_data_3); |
| 311 |
| 312 ExpectSimilar(extension_data_3.get(), |
| 313 manager.GetDefaultSearchEngine(&source)); |
| 314 EXPECT_EQ(DefaultSearchManager::FROM_EXTENSION, source); |
| 315 |
| 316 manager.ClearExtensionControlledDefaultSearchEngine(); |
| 317 |
| 318 ExpectSimilar(data.get(), manager.GetDefaultSearchEngine(&source)); |
| 319 EXPECT_EQ(DefaultSearchManager::FROM_USER, source); |
| 320 } |
OLD | NEW |