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..b6b0190702a9b92618c6a26d1fda96df76675132 100644 |
--- a/chrome/browser/search_engines/default_search_pref_migration.cc |
+++ b/chrome/browser/search_engines/default_search_pref_migration.cc |
@@ -6,68 +6,158 @@ |
#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>(); |
Peter Kasting
2014/05/07 23:38:29
Nit: Another possibility would be to declare |defa
erikwright (departed)
2014/05/08 12:46:24
Reverted this code move for simplicity.
|
- 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. |
+ // TODO(erikwright): Remove this migration logic when this stat approaches |
+ // zero. |
+ UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true); |
+ default_search_manager.SetUserSelectedDefaultSearchEngine( |
+ *legacy_dse_from_prefs); |
+ } |
+ ClearDefaultSearchProviderFromLegacyPrefs(pref_service); |
+ } |
} |
void OnPrefsInitialized(PrefService* pref_service, |