Chromium Code Reviews| Index: chrome/browser/search_engines/default_search_pref_migration.cc |
| diff --git a/chrome/browser/search_engines/default_search_pref_migration.cc b/chrome/browser/search_engines/default_search_pref_migration.cc |
| index 7516bfc9c2ad1a2c779ff171f103a157ed27090d..b5361ccf552f028abafaf309942cf0ab32de5e97 100644 |
| --- a/chrome/browser/search_engines/default_search_pref_migration.cc |
| +++ b/chrome/browser/search_engines/default_search_pref_migration.cc |
| @@ -6,68 +6,156 @@ |
| #include "base/bind.h" |
| #include "base/bind_helpers.h" |
| +#include "base/logging.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/metrics/histogram.h" |
| #include "base/prefs/pref_service.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/utf_string_conversions.h" |
| #include "chrome/browser/search_engines/default_search_manager.h" |
| #include "chrome/browser/search_engines/template_url.h" |
| #include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
| #include "chrome/browser/search_engines/template_url_service.h" |
| +#include "chrome/common/pref_names.h" |
| +#include "url/gurl.h" |
| namespace { |
| -void MigrateDefaultSearchPref(PrefService* pref_service) { |
| - DefaultSearchManager default_search_manager( |
| - pref_service, DefaultSearchManager::ObserverCallback()); |
| +scoped_ptr<TemplateURLData> LoadDefaultSearchProviderFromLegacyPrefs( |
| + PrefService* prefs) { |
| + if (!prefs->HasPrefPath(prefs::kDefaultSearchProviderSearchURL) || |
| + !prefs->HasPrefPath(prefs::kDefaultSearchProviderKeyword)) |
| + return scoped_ptr<TemplateURLData>(); |
| - if (default_search_manager.GetDefaultSearchEngineSource() == |
| - DefaultSearchManager::FROM_USER) { |
| - return; |
| - } |
| + const PrefService::Preference* pref = |
| + prefs->FindPreference(prefs::kDefaultSearchProviderSearchURL); |
| + DCHECK(pref); |
| + if (pref->IsManaged()) |
| + return scoped_ptr<TemplateURLData>(); |
| - scoped_ptr<TemplateURLData> legacy_dse_from_prefs; |
| - bool legacy_is_managed = false; |
| - bool has_legacy_dse_from_prefs = |
| - TemplateURLService::LoadDefaultSearchProviderFromPrefs( |
| - pref_service, &legacy_dse_from_prefs, &legacy_is_managed); |
| + base::string16 name = |
| + base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderName)); |
| + base::string16 keyword = |
| + base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderKeyword)); |
| + if (keyword.empty()) |
| + return scoped_ptr<TemplateURLData>(); |
| + std::string search_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderSearchURL); |
| + if (search_url.empty()) |
| + return scoped_ptr<TemplateURLData>(); |
| + std::string suggest_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderSuggestURL); |
| + std::string instant_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderInstantURL); |
| + std::string image_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderImageURL); |
| + std::string new_tab_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderNewTabURL); |
| + std::string search_url_post_params = |
| + prefs->GetString(prefs::kDefaultSearchProviderSearchURLPostParams); |
| + std::string suggest_url_post_params = |
| + prefs->GetString(prefs::kDefaultSearchProviderSuggestURLPostParams); |
| + std::string instant_url_post_params = |
| + prefs->GetString(prefs::kDefaultSearchProviderInstantURLPostParams); |
| + std::string image_url_post_params = |
| + prefs->GetString(prefs::kDefaultSearchProviderImageURLPostParams); |
| + std::string icon_url = |
| + prefs->GetString(prefs::kDefaultSearchProviderIconURL); |
| + std::string encodings = |
| + prefs->GetString(prefs::kDefaultSearchProviderEncodings); |
| + std::string id_string = prefs->GetString(prefs::kDefaultSearchProviderID); |
| + std::string prepopulate_id = |
| + prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID); |
| + const base::ListValue* alternate_urls = |
| + prefs->GetList(prefs::kDefaultSearchProviderAlternateURLs); |
| + std::string search_terms_replacement_key = prefs->GetString( |
| + prefs::kDefaultSearchProviderSearchTermsReplacementKey); |
| - if (!has_legacy_dse_from_prefs) { |
| - // The DSE is undefined. Nothing to migrate. |
| - return; |
| + scoped_ptr<TemplateURLData> default_provider_data(new TemplateURLData); |
| + default_provider_data->short_name = name; |
| + default_provider_data->SetKeyword(keyword); |
| + default_provider_data->SetURL(search_url); |
| + default_provider_data->suggestions_url = suggest_url; |
| + default_provider_data->instant_url = instant_url; |
| + default_provider_data->image_url = image_url; |
| + default_provider_data->new_tab_url = new_tab_url; |
| + default_provider_data->search_url_post_params = search_url_post_params; |
| + default_provider_data->suggestions_url_post_params = |
| + suggest_url_post_params; |
| + default_provider_data->instant_url_post_params = instant_url_post_params; |
| + default_provider_data->image_url_post_params = image_url_post_params; |
| + default_provider_data->favicon_url = GURL(icon_url); |
| + default_provider_data->show_in_default_list = true; |
| + default_provider_data->alternate_urls.clear(); |
| + for (size_t i = 0; i < alternate_urls->GetSize(); ++i) { |
| + std::string alternate_url; |
| + if (alternate_urls->GetString(i, &alternate_url)) |
| + default_provider_data->alternate_urls.push_back(alternate_url); |
| } |
| - if (!legacy_dse_from_prefs) { |
| - // The DSE is defined as NULL. This can only really be done via policy. |
| - // Policy-defined values will be automatically projected into the new |
| - // format. Even if the user did somehow set this manually we do not have a |
| - // way to migrate it. |
| - return; |
| + default_provider_data->search_terms_replacement_key = |
| + search_terms_replacement_key; |
| + base::SplitString(encodings, ';', &default_provider_data->input_encodings); |
| + if (!id_string.empty()) { |
| + int64 value; |
| + base::StringToInt64(id_string, &value); |
| + default_provider_data->id = value; |
| } |
| - if (legacy_is_managed) { |
| - // The DSE is policy-managed, not user-selected. It will automatically be |
| - // projected into the new location. |
| - return; |
| + if (!prepopulate_id.empty()) { |
| + int value; |
| + base::StringToInt(prepopulate_id, &value); |
| + default_provider_data->prepopulate_id = value; |
| } |
| + return default_provider_data.Pass(); |
| +} |
| - // If the pre-populated DSE matches the DSE from prefs we assume it is not a |
| - // user-selected value. |
| - scoped_ptr<TemplateURLData> prepopulated_dse( |
| - TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service)); |
| - if (prepopulated_dse && |
| - legacy_dse_from_prefs->prepopulate_id == |
| - prepopulated_dse->prepopulate_id) { |
| - return; |
| - } |
| +void ClearDefaultSearchProviderFromLegacyPrefs(PrefService* prefs) { |
| + prefs->ClearPref(prefs::kDefaultSearchProviderName); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderKeyword); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderSearchURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderInstantURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderImageURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderNewTabURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderSearchURLPostParams); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURLPostParams); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderInstantURLPostParams); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderImageURLPostParams); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderIconURL); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderEncodings); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderPrepopulateID); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderAlternateURLs); |
| + prefs->ClearPref(prefs::kDefaultSearchProviderSearchTermsReplacementKey); |
| +} |
| - UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true); |
| +void MigrateDefaultSearchPref(PrefService* pref_service) { |
| + DCHECK(pref_service); |
| + DefaultSearchManager default_search_manager( |
| + pref_service, DefaultSearchManager::ObserverCallback()); |
| - // This looks like a user-selected value, so let's migrate it. Subsequent |
| - // changes to this value will be automatically stored in the correct location. |
| - default_search_manager.SetUserSelectedDefaultSearchEngine( |
| - *legacy_dse_from_prefs); |
| + DefaultSearchManager::Source modern_source; |
| + TemplateURLData* modern_value = |
| + default_search_manager.GetDefaultSearchEngine(&modern_source); |
| + if (modern_source == DefaultSearchManager::FROM_FALLBACK) { |
| + scoped_ptr<TemplateURLData> legacy_dse_from_prefs( |
| + LoadDefaultSearchProviderFromLegacyPrefs(pref_service)); |
| + if (!legacy_dse_from_prefs) { |
| + // The DSE is undefined. It might have been policy-defined. Nothing to |
| + // migrate. |
| + return; |
| + } |
| - // TODO(erikwright): Clear the legacy value when the modern value is the |
| - // authority. Don't forget to do this even if we don't migrate (because we |
| - // migrated prior to implementing the clear. |
| + // |modern_value| is the prepopulated default. If it matches the legacy DSE |
| + // we assume it is not a user-selected value. |
| + if (!modern_value || |
| + legacy_dse_from_prefs->prepopulate_id != modern_value->prepopulate_id) { |
| + // This looks like a user-selected value, so let's migrate it. |
| + UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true); |
|
gab
2014/05/07 20:25:09
Add a TODO to remove this migration code once this
erikwright (departed)
2014/05/07 22:26:47
Done.
|
| + default_search_manager.SetUserSelectedDefaultSearchEngine( |
| + *legacy_dse_from_prefs); |
| + } |
| + ClearDefaultSearchProviderFromLegacyPrefs(pref_service); |
| + } |
| } |
| void OnPrefsInitialized(PrefService* pref_service, |