// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/search_engines/default_search_pref_migration.h" #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 "components/search_engines/default_search_manager.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/template_url_data.h" #include "components/search_engines/template_url_service.h" namespace { // Loads the user-selected DSE (if there is one, and it's not masked by policy // or an extension) from legacy preferences. scoped_ptr LoadDefaultSearchProviderFromPrefs( PrefService* pref_service) { scoped_ptr legacy_dse_from_prefs; bool legacy_is_managed = false; TemplateURLService::LoadDefaultSearchProviderFromPrefs( pref_service, &legacy_dse_from_prefs, &legacy_is_managed); return legacy_is_managed ? scoped_ptr() : legacy_dse_from_prefs.Pass(); } 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); } void MigrateDefaultSearchPref(PrefService* pref_service) { DCHECK(pref_service); scoped_ptr legacy_dse_from_prefs = LoadDefaultSearchProviderFromPrefs(pref_service); if (!legacy_dse_from_prefs) return; DefaultSearchManager default_search_manager( pref_service, DefaultSearchManager::ObserverCallback()); DefaultSearchManager::Source modern_source; TemplateURLData* modern_value = default_search_manager.GetDefaultSearchEngine(&modern_source); if (modern_source == DefaultSearchManager::FROM_FALLBACK) { // |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, bool pref_service_initialization_success) { MigrateDefaultSearchPref(pref_service); } } // namespace void ConfigureDefaultSearchPrefMigrationToDictionaryValue( PrefService* pref_service) { if (pref_service->GetInitializationStatus() == PrefService::INITIALIZATION_STATUS_WAITING) { pref_service->AddPrefInitObserver( base::Bind(&OnPrefsInitialized, base::Unretained(pref_service))); } else { MigrateDefaultSearchPref(pref_service); } }