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 "components/search_engines/default_search_manager.h" | 5 #include "components/search_engines/default_search_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/bind_helpers.h" | 14 #include "base/bind_helpers.h" |
15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
16 #include "base/i18n/case_conversion.h" | 16 #include "base/i18n/case_conversion.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
18 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
19 #include "base/strings/string_split.h" | 19 #include "base/strings/string_split.h" |
20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
22 #include "base/time/time.h" | 22 #include "base/time/time.h" |
23 #include "components/pref_registry/pref_registry_syncable.h" | 23 #include "components/pref_registry/pref_registry_syncable.h" |
24 #include "components/prefs/pref_service.h" | 24 #include "components/prefs/pref_service.h" |
25 #include "components/prefs/pref_value_map.h" | 25 #include "components/prefs/pref_value_map.h" |
26 #include "components/search_engines/search_engines_pref_names.h" | 26 #include "components/search_engines/search_engines_pref_names.h" |
27 #include "components/search_engines/template_url_data.h" | 27 #include "components/search_engines/template_url_data.h" |
| 28 #include "components/search_engines/template_url_data_util.h" |
28 #include "components/search_engines/template_url_prepopulate_data.h" | 29 #include "components/search_engines/template_url_prepopulate_data.h" |
29 | 30 |
30 namespace { | 31 namespace { |
31 | 32 |
32 bool g_fallback_search_engines_disabled = false; | 33 bool g_fallback_search_engines_disabled = false; |
33 | 34 |
34 } // namespace | 35 } // namespace |
35 | 36 |
36 // A dictionary to hold all data related to the Default Search Engine. | 37 // A dictionary to hold all data related to the Default Search Engine. |
37 // Eventually, this should replace all the data stored in the | 38 // Eventually, this should replace all the data stored in the |
38 // default_search_provider.* prefs. | 39 // default_search_provider.* prefs. |
39 const char DefaultSearchManager::kDefaultSearchProviderDataPrefName[] = | 40 const char DefaultSearchManager::kDefaultSearchProviderDataPrefName[] = |
40 "default_search_provider_data.template_url_data"; | 41 "default_search_provider_data.template_url_data"; |
41 | 42 |
42 const char DefaultSearchManager::kID[] = "id"; | 43 const char DefaultSearchManager::kID[] = "id"; |
43 const char DefaultSearchManager::kShortName[] = "short_name"; | 44 const char DefaultSearchManager::kShortName[] = "short_name"; |
44 const char DefaultSearchManager::kKeyword[] = "keyword"; | 45 const char DefaultSearchManager::kKeyword[] = "keyword"; |
45 const char DefaultSearchManager::kPrepopulateID[] = "prepopulate_id"; | 46 const char DefaultSearchManager::kPrepopulateID[] = "prepopulate_id"; |
46 const char DefaultSearchManager::kSyncGUID[] = "synced_guid"; | 47 const char DefaultSearchManager::kSyncGUID[] = "synced_guid"; |
47 | 48 |
48 const char DefaultSearchManager::kURL[] = "url"; | 49 const char DefaultSearchManager::kURL[] = "url"; |
49 const char DefaultSearchManager::kSuggestionsURL[] = "suggestions_url"; | 50 const char DefaultSearchManager::kSuggestionsURL[] = "suggestions_url"; |
50 const char DefaultSearchManager::kInstantURL[] = "instant_url"; | 51 const char DefaultSearchManager::kInstantURL[] = "instant_url"; |
51 const char DefaultSearchManager::kImageURL[] = "image_url"; | 52 const char DefaultSearchManager::kImageURL[] = "image_url"; |
52 const char DefaultSearchManager::kNewTabURL[] = "new_tab_url"; | 53 const char DefaultSearchManager::kNewTabURL[] = "new_tab_url"; |
| 54 const char DefaultSearchManager::kContextualSearchURL[] = |
| 55 "contextual_search_url"; |
53 const char DefaultSearchManager::kFaviconURL[] = "favicon_url"; | 56 const char DefaultSearchManager::kFaviconURL[] = "favicon_url"; |
54 const char DefaultSearchManager::kOriginatingURL[] = "originating_url"; | 57 const char DefaultSearchManager::kOriginatingURL[] = "originating_url"; |
55 | 58 |
56 const char DefaultSearchManager::kSearchURLPostParams[] = | 59 const char DefaultSearchManager::kSearchURLPostParams[] = |
57 "search_url_post_params"; | 60 "search_url_post_params"; |
58 const char DefaultSearchManager::kSuggestionsURLPostParams[] = | 61 const char DefaultSearchManager::kSuggestionsURLPostParams[] = |
59 "suggestions_url_post_params"; | 62 "suggestions_url_post_params"; |
60 const char DefaultSearchManager::kInstantURLPostParams[] = | 63 const char DefaultSearchManager::kInstantURLPostParams[] = |
61 "instant_url_post_params"; | 64 "instant_url_post_params"; |
62 const char DefaultSearchManager::kImageURLPostParams[] = | 65 const char DefaultSearchManager::kImageURLPostParams[] = |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
151 } | 154 } |
152 | 155 |
153 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( | 156 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( |
154 const TemplateURLData& data) { | 157 const TemplateURLData& data) { |
155 if (!pref_service_) { | 158 if (!pref_service_) { |
156 prefs_default_search_.reset(new TemplateURLData(data)); | 159 prefs_default_search_.reset(new TemplateURLData(data)); |
157 MergePrefsDataWithPrepopulated(); | 160 MergePrefsDataWithPrepopulated(); |
158 NotifyObserver(); | 161 NotifyObserver(); |
159 return; | 162 return; |
160 } | 163 } |
161 | 164 pref_service_->Set(kDefaultSearchProviderDataPrefName, |
162 base::DictionaryValue url_dict; | 165 *TemplateURLDataToDictionary(data)); |
163 url_dict.SetString(kID, base::Int64ToString(data.id)); | |
164 url_dict.SetString(kShortName, data.short_name()); | |
165 url_dict.SetString(kKeyword, data.keyword()); | |
166 url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); | |
167 url_dict.SetString(kSyncGUID, data.sync_guid); | |
168 | |
169 url_dict.SetString(kURL, data.url()); | |
170 url_dict.SetString(kSuggestionsURL, data.suggestions_url); | |
171 url_dict.SetString(kInstantURL, data.instant_url); | |
172 url_dict.SetString(kImageURL, data.image_url); | |
173 url_dict.SetString(kNewTabURL, data.new_tab_url); | |
174 url_dict.SetString(kFaviconURL, data.favicon_url.spec()); | |
175 url_dict.SetString(kOriginatingURL, data.originating_url.spec()); | |
176 | |
177 url_dict.SetString(kSearchURLPostParams, data.search_url_post_params); | |
178 url_dict.SetString(kSuggestionsURLPostParams, | |
179 data.suggestions_url_post_params); | |
180 url_dict.SetString(kInstantURLPostParams, data.instant_url_post_params); | |
181 url_dict.SetString(kImageURLPostParams, data.image_url_post_params); | |
182 | |
183 url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); | |
184 | |
185 url_dict.SetString(kDateCreated, | |
186 base::Int64ToString(data.date_created.ToInternalValue())); | |
187 url_dict.SetString(kLastModified, | |
188 base::Int64ToString(data.last_modified.ToInternalValue())); | |
189 url_dict.SetInteger(kUsageCount, data.usage_count); | |
190 | |
191 std::unique_ptr<base::ListValue> alternate_urls(new base::ListValue); | |
192 for (std::vector<std::string>::const_iterator it = | |
193 data.alternate_urls.begin(); | |
194 it != data.alternate_urls.end(); ++it) { | |
195 alternate_urls->AppendString(*it); | |
196 } | |
197 url_dict.Set(kAlternateURLs, alternate_urls.release()); | |
198 | |
199 std::unique_ptr<base::ListValue> encodings(new base::ListValue); | |
200 for (std::vector<std::string>::const_iterator it = | |
201 data.input_encodings.begin(); | |
202 it != data.input_encodings.end(); ++it) { | |
203 encodings->AppendString(*it); | |
204 } | |
205 url_dict.Set(kInputEncodings, encodings.release()); | |
206 | |
207 url_dict.SetString(kSearchTermsReplacementKey, | |
208 data.search_terms_replacement_key); | |
209 | |
210 url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); | |
211 | |
212 pref_service_->Set(kDefaultSearchProviderDataPrefName, url_dict); | |
213 } | 166 } |
214 | 167 |
215 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( | 168 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( |
216 const TemplateURLData& data) { | 169 const TemplateURLData& data) { |
217 extension_default_search_.reset(new TemplateURLData(data)); | 170 extension_default_search_.reset(new TemplateURLData(data)); |
218 if (GetDefaultSearchEngineSource() == FROM_EXTENSION) | 171 if (GetDefaultSearchEngineSource() == FROM_EXTENSION) |
219 NotifyObserver(); | 172 NotifyObserver(); |
220 } | 173 } |
221 | 174 |
222 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { | 175 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
300 if (url_dict->empty()) | 253 if (url_dict->empty()) |
301 return; | 254 return; |
302 | 255 |
303 if (default_search_controlled_by_policy_) { | 256 if (default_search_controlled_by_policy_) { |
304 bool disabled_by_policy = false; | 257 bool disabled_by_policy = false; |
305 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 258 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
306 disabled_by_policy) | 259 disabled_by_policy) |
307 return; | 260 return; |
308 } | 261 } |
309 | 262 |
310 std::string search_url; | 263 auto turl_data = TemplateURLDataFromDictionary(*url_dict); |
311 base::string16 keyword; | 264 if (!turl_data) |
312 url_dict->GetString(kURL, &search_url); | |
313 url_dict->GetString(kKeyword, &keyword); | |
314 if (search_url.empty() || keyword.empty()) | |
315 return; | 265 return; |
316 | 266 |
317 prefs_default_search_.reset(new TemplateURLData); | 267 prefs_default_search_ = std::move(turl_data); |
318 prefs_default_search_->SetKeyword(keyword); | |
319 prefs_default_search_->SetURL(search_url); | |
320 | |
321 std::string id; | |
322 url_dict->GetString(kID, &id); | |
323 base::StringToInt64(id, &prefs_default_search_->id); | |
324 base::string16 short_name; | |
325 url_dict->GetString(kShortName, &short_name); | |
326 prefs_default_search_->SetShortName(short_name); | |
327 url_dict->GetInteger(kPrepopulateID, &prefs_default_search_->prepopulate_id); | |
328 url_dict->GetString(kSyncGUID, &prefs_default_search_->sync_guid); | |
329 | |
330 url_dict->GetString(kSuggestionsURL, &prefs_default_search_->suggestions_url); | |
331 url_dict->GetString(kInstantURL, &prefs_default_search_->instant_url); | |
332 url_dict->GetString(kImageURL, &prefs_default_search_->image_url); | |
333 url_dict->GetString(kNewTabURL, &prefs_default_search_->new_tab_url); | |
334 | |
335 std::string favicon_url; | |
336 std::string originating_url; | |
337 url_dict->GetString(kFaviconURL, &favicon_url); | |
338 url_dict->GetString(kOriginatingURL, &originating_url); | |
339 prefs_default_search_->favicon_url = GURL(favicon_url); | |
340 prefs_default_search_->originating_url = GURL(originating_url); | |
341 | |
342 url_dict->GetString(kSearchURLPostParams, | |
343 &prefs_default_search_->search_url_post_params); | |
344 url_dict->GetString(kSuggestionsURLPostParams, | |
345 &prefs_default_search_->suggestions_url_post_params); | |
346 url_dict->GetString(kInstantURLPostParams, | |
347 &prefs_default_search_->instant_url_post_params); | |
348 url_dict->GetString(kImageURLPostParams, | |
349 &prefs_default_search_->image_url_post_params); | |
350 | |
351 url_dict->GetBoolean(kSafeForAutoReplace, | |
352 &prefs_default_search_->safe_for_autoreplace); | |
353 | |
354 std::string date_created_str; | |
355 std::string last_modified_str; | |
356 url_dict->GetString(kDateCreated, &date_created_str); | |
357 url_dict->GetString(kLastModified, &last_modified_str); | |
358 | |
359 int64_t date_created = 0; | |
360 if (base::StringToInt64(date_created_str, &date_created)) { | |
361 prefs_default_search_->date_created = | |
362 base::Time::FromInternalValue(date_created); | |
363 } | |
364 | |
365 int64_t last_modified = 0; | |
366 if (base::StringToInt64(date_created_str, &last_modified)) { | |
367 prefs_default_search_->last_modified = | |
368 base::Time::FromInternalValue(last_modified); | |
369 } | |
370 | |
371 url_dict->GetInteger(kUsageCount, &prefs_default_search_->usage_count); | |
372 | |
373 const base::ListValue* alternate_urls = NULL; | |
374 if (url_dict->GetList(kAlternateURLs, &alternate_urls)) { | |
375 for (base::ListValue::const_iterator it = alternate_urls->begin(); | |
376 it != alternate_urls->end(); | |
377 ++it) { | |
378 std::string alternate_url; | |
379 if ((*it)->GetAsString(&alternate_url)) | |
380 prefs_default_search_->alternate_urls.push_back(alternate_url); | |
381 } | |
382 } | |
383 | |
384 const base::ListValue* encodings = NULL; | |
385 if (url_dict->GetList(kInputEncodings, &encodings)) { | |
386 for (base::ListValue::const_iterator it = encodings->begin(); | |
387 it != encodings->end(); | |
388 ++it) { | |
389 std::string encoding; | |
390 if ((*it)->GetAsString(&encoding)) | |
391 prefs_default_search_->input_encodings.push_back(encoding); | |
392 } | |
393 } | |
394 | |
395 url_dict->GetString(kSearchTermsReplacementKey, | |
396 &prefs_default_search_->search_terms_replacement_key); | |
397 | |
398 url_dict->GetBoolean(kCreatedByPolicy, | |
399 &prefs_default_search_->created_by_policy); | |
400 | |
401 MergePrefsDataWithPrepopulated(); | 268 MergePrefsDataWithPrepopulated(); |
402 } | 269 } |
403 | 270 |
404 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { | 271 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { |
405 std::unique_ptr<TemplateURLData> data = | 272 std::unique_ptr<TemplateURLData> data = |
406 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | 273 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); |
407 fallback_default_search_ = std::move(data); | 274 fallback_default_search_ = std::move(data); |
408 MergePrefsDataWithPrepopulated(); | 275 MergePrefsDataWithPrepopulated(); |
409 } | 276 } |
410 | 277 |
411 void DefaultSearchManager::NotifyObserver() { | 278 void DefaultSearchManager::NotifyObserver() { |
412 if (!change_observer_.is_null()) { | 279 if (!change_observer_.is_null()) { |
413 Source source = FROM_FALLBACK; | 280 Source source = FROM_FALLBACK; |
414 TemplateURLData* data = GetDefaultSearchEngine(&source); | 281 TemplateURLData* data = GetDefaultSearchEngine(&source); |
415 change_observer_.Run(data, source); | 282 change_observer_.Run(data, source); |
416 } | 283 } |
417 } | 284 } |
OLD | NEW |