| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "components/search_engines/default_search_pref_migration.h" | |
| 6 | |
| 7 #include <stddef.h> | |
| 8 #include <stdint.h> | |
| 9 | |
| 10 #include <memory> | |
| 11 | |
| 12 #include "base/bind.h" | |
| 13 #include "base/bind_helpers.h" | |
| 14 #include "base/logging.h" | |
| 15 #include "base/metrics/histogram_macros.h" | |
| 16 #include "base/strings/string_number_conversions.h" | |
| 17 #include "base/strings/string_split.h" | |
| 18 #include "base/strings/utf_string_conversions.h" | |
| 19 #include "components/prefs/pref_service.h" | |
| 20 #include "components/search_engines/default_search_manager.h" | |
| 21 #include "components/search_engines/search_engines_pref_names.h" | |
| 22 #include "components/search_engines/template_url_data.h" | |
| 23 #include "components/search_engines/template_url_service.h" | |
| 24 #include "url/gurl.h" | |
| 25 | |
| 26 namespace { | |
| 27 | |
| 28 // Loads the user-selected DSE (if there is one) from legacy preferences. | |
| 29 std::unique_ptr<TemplateURLData> LoadDefaultSearchProviderFromLegacyPrefs( | |
| 30 PrefService* prefs) { | |
| 31 if (!prefs->HasPrefPath(prefs::kDefaultSearchProviderSearchURL) || | |
| 32 !prefs->HasPrefPath(prefs::kDefaultSearchProviderKeyword)) | |
| 33 return std::unique_ptr<TemplateURLData>(); | |
| 34 | |
| 35 const PrefService::Preference* pref = | |
| 36 prefs->FindPreference(prefs::kDefaultSearchProviderSearchURL); | |
| 37 DCHECK(pref); | |
| 38 if (pref->IsManaged()) | |
| 39 return std::unique_ptr<TemplateURLData>(); | |
| 40 | |
| 41 base::string16 keyword = | |
| 42 base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderKeyword)); | |
| 43 std::string search_url = | |
| 44 prefs->GetString(prefs::kDefaultSearchProviderSearchURL); | |
| 45 if (keyword.empty() || search_url.empty()) | |
| 46 return std::unique_ptr<TemplateURLData>(); | |
| 47 | |
| 48 std::unique_ptr<TemplateURLData> default_provider_data(new TemplateURLData); | |
| 49 default_provider_data->SetShortName( | |
| 50 base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderName))); | |
| 51 default_provider_data->SetKeyword(keyword); | |
| 52 default_provider_data->SetURL(search_url); | |
| 53 default_provider_data->suggestions_url = | |
| 54 prefs->GetString(prefs::kDefaultSearchProviderSuggestURL); | |
| 55 default_provider_data->instant_url = | |
| 56 prefs->GetString(prefs::kDefaultSearchProviderInstantURL); | |
| 57 default_provider_data->image_url = | |
| 58 prefs->GetString(prefs::kDefaultSearchProviderImageURL); | |
| 59 default_provider_data->new_tab_url = | |
| 60 prefs->GetString(prefs::kDefaultSearchProviderNewTabURL); | |
| 61 default_provider_data->search_url_post_params = | |
| 62 prefs->GetString(prefs::kDefaultSearchProviderSearchURLPostParams); | |
| 63 default_provider_data->suggestions_url_post_params = | |
| 64 prefs->GetString(prefs::kDefaultSearchProviderSuggestURLPostParams); | |
| 65 default_provider_data->instant_url_post_params = | |
| 66 prefs->GetString(prefs::kDefaultSearchProviderInstantURLPostParams); | |
| 67 default_provider_data->image_url_post_params = | |
| 68 prefs->GetString(prefs::kDefaultSearchProviderImageURLPostParams); | |
| 69 default_provider_data->favicon_url = | |
| 70 GURL(prefs->GetString(prefs::kDefaultSearchProviderIconURL)); | |
| 71 default_provider_data->search_terms_replacement_key = | |
| 72 prefs->GetString(prefs::kDefaultSearchProviderSearchTermsReplacementKey); | |
| 73 default_provider_data->input_encodings = base::SplitString( | |
| 74 prefs->GetString(prefs::kDefaultSearchProviderEncodings), | |
| 75 ";", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | |
| 76 | |
| 77 default_provider_data->alternate_urls.clear(); | |
| 78 const base::ListValue* alternate_urls = | |
| 79 prefs->GetList(prefs::kDefaultSearchProviderAlternateURLs); | |
| 80 for (size_t i = 0; i < alternate_urls->GetSize(); ++i) { | |
| 81 std::string alternate_url; | |
| 82 if (alternate_urls->GetString(i, &alternate_url)) | |
| 83 default_provider_data->alternate_urls.push_back(alternate_url); | |
| 84 } | |
| 85 | |
| 86 std::string id_string = prefs->GetString(prefs::kDefaultSearchProviderID); | |
| 87 if (!id_string.empty()) { | |
| 88 int64_t value; | |
| 89 base::StringToInt64(id_string, &value); | |
| 90 default_provider_data->id = value; | |
| 91 } | |
| 92 | |
| 93 std::string prepopulate_id = | |
| 94 prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID); | |
| 95 if (!prepopulate_id.empty()) { | |
| 96 int value; | |
| 97 base::StringToInt(prepopulate_id, &value); | |
| 98 default_provider_data->prepopulate_id = value; | |
| 99 } | |
| 100 | |
| 101 return default_provider_data; | |
| 102 } | |
| 103 | |
| 104 void ClearDefaultSearchProviderFromLegacyPrefs(PrefService* prefs) { | |
| 105 prefs->ClearPref(prefs::kDefaultSearchProviderName); | |
| 106 prefs->ClearPref(prefs::kDefaultSearchProviderKeyword); | |
| 107 prefs->ClearPref(prefs::kDefaultSearchProviderSearchURL); | |
| 108 prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURL); | |
| 109 prefs->ClearPref(prefs::kDefaultSearchProviderInstantURL); | |
| 110 prefs->ClearPref(prefs::kDefaultSearchProviderImageURL); | |
| 111 prefs->ClearPref(prefs::kDefaultSearchProviderNewTabURL); | |
| 112 prefs->ClearPref(prefs::kDefaultSearchProviderSearchURLPostParams); | |
| 113 prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURLPostParams); | |
| 114 prefs->ClearPref(prefs::kDefaultSearchProviderInstantURLPostParams); | |
| 115 prefs->ClearPref(prefs::kDefaultSearchProviderImageURLPostParams); | |
| 116 prefs->ClearPref(prefs::kDefaultSearchProviderIconURL); | |
| 117 prefs->ClearPref(prefs::kDefaultSearchProviderEncodings); | |
| 118 prefs->ClearPref(prefs::kDefaultSearchProviderPrepopulateID); | |
| 119 prefs->ClearPref(prefs::kDefaultSearchProviderAlternateURLs); | |
| 120 prefs->ClearPref(prefs::kDefaultSearchProviderSearchTermsReplacementKey); | |
| 121 } | |
| 122 | |
| 123 void MigrateDefaultSearchPref(PrefService* pref_service) { | |
| 124 DCHECK(pref_service); | |
| 125 | |
| 126 std::unique_ptr<TemplateURLData> legacy_dse_from_prefs = | |
| 127 LoadDefaultSearchProviderFromLegacyPrefs(pref_service); | |
| 128 if (!legacy_dse_from_prefs) | |
| 129 return; | |
| 130 | |
| 131 DefaultSearchManager default_search_manager( | |
| 132 pref_service, DefaultSearchManager::ObserverCallback()); | |
| 133 DefaultSearchManager::Source modern_source; | |
| 134 TemplateURLData* modern_value = | |
| 135 default_search_manager.GetDefaultSearchEngine(&modern_source); | |
| 136 if (modern_source == DefaultSearchManager::FROM_FALLBACK) { | |
| 137 // |modern_value| is the prepopulated default. If it matches the legacy DSE | |
| 138 // we assume it is not a user-selected value. | |
| 139 if (!modern_value || | |
| 140 legacy_dse_from_prefs->prepopulate_id != modern_value->prepopulate_id) { | |
| 141 // This looks like a user-selected value, so let's migrate it. | |
| 142 // TODO(erikwright): Remove this migration logic when this stat approaches | |
| 143 // zero. | |
| 144 UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true); | |
| 145 default_search_manager.SetUserSelectedDefaultSearchEngine( | |
| 146 *legacy_dse_from_prefs); | |
| 147 } | |
| 148 } | |
| 149 | |
| 150 ClearDefaultSearchProviderFromLegacyPrefs(pref_service); | |
| 151 } | |
| 152 | |
| 153 void OnPrefsInitialized(PrefService* pref_service, | |
| 154 bool pref_service_initialization_success) { | |
| 155 MigrateDefaultSearchPref(pref_service); | |
| 156 } | |
| 157 | |
| 158 } // namespace | |
| 159 | |
| 160 void ConfigureDefaultSearchPrefMigrationToDictionaryValue( | |
| 161 PrefService* pref_service) { | |
| 162 if (pref_service->GetInitializationStatus() == | |
| 163 PrefService::INITIALIZATION_STATUS_WAITING) { | |
| 164 pref_service->AddPrefInitObserver( | |
| 165 base::Bind(&OnPrefsInitialized, base::Unretained(pref_service))); | |
| 166 } else { | |
| 167 MigrateDefaultSearchPref(pref_service); | |
| 168 } | |
| 169 } | |
| OLD | NEW |