Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(141)

Side by Side Diff: chrome/browser/search_engines/default_search_pref_migration.cc

Issue 268643002: Use the DefaultSearchManager as the exclusive authority on DSE, ignoring Web Data. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Review comments. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "chrome/browser/search_engines/default_search_pref_migration.h" 5 #include "chrome/browser/search_engines/default_search_pref_migration.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/bind_helpers.h" 8 #include "base/bind_helpers.h"
9 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
10 #include "base/metrics/histogram.h" 11 #include "base/metrics/histogram.h"
11 #include "base/prefs/pref_service.h" 12 #include "base/prefs/pref_service.h"
13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h"
15 #include "base/strings/utf_string_conversions.h"
12 #include "chrome/browser/search_engines/default_search_manager.h" 16 #include "chrome/browser/search_engines/default_search_manager.h"
13 #include "chrome/browser/search_engines/template_url.h" 17 #include "chrome/browser/search_engines/template_url.h"
14 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" 18 #include "chrome/browser/search_engines/template_url_prepopulate_data.h"
15 #include "chrome/browser/search_engines/template_url_service.h" 19 #include "chrome/browser/search_engines/template_url_service.h"
20 #include "chrome/common/pref_names.h"
21 #include "url/gurl.h"
16 22
17 namespace { 23 namespace {
18 24
25 scoped_ptr<TemplateURLData> LoadDefaultSearchProviderFromLegacyPrefs(
26 PrefService* prefs) {
27 if (!prefs->HasPrefPath(prefs::kDefaultSearchProviderSearchURL) ||
28 !prefs->HasPrefPath(prefs::kDefaultSearchProviderKeyword))
29 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.
30
31 const PrefService::Preference* pref =
32 prefs->FindPreference(prefs::kDefaultSearchProviderSearchURL);
33 DCHECK(pref);
34 if (pref->IsManaged())
35 return scoped_ptr<TemplateURLData>();
36
37 base::string16 name =
38 base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderName));
39 base::string16 keyword =
40 base::UTF8ToUTF16(prefs->GetString(prefs::kDefaultSearchProviderKeyword));
41 if (keyword.empty())
42 return scoped_ptr<TemplateURLData>();
43 std::string search_url =
44 prefs->GetString(prefs::kDefaultSearchProviderSearchURL);
45 if (search_url.empty())
46 return scoped_ptr<TemplateURLData>();
47 std::string suggest_url =
48 prefs->GetString(prefs::kDefaultSearchProviderSuggestURL);
49 std::string instant_url =
50 prefs->GetString(prefs::kDefaultSearchProviderInstantURL);
51 std::string image_url =
52 prefs->GetString(prefs::kDefaultSearchProviderImageURL);
53 std::string new_tab_url =
54 prefs->GetString(prefs::kDefaultSearchProviderNewTabURL);
55 std::string search_url_post_params =
56 prefs->GetString(prefs::kDefaultSearchProviderSearchURLPostParams);
57 std::string suggest_url_post_params =
58 prefs->GetString(prefs::kDefaultSearchProviderSuggestURLPostParams);
59 std::string instant_url_post_params =
60 prefs->GetString(prefs::kDefaultSearchProviderInstantURLPostParams);
61 std::string image_url_post_params =
62 prefs->GetString(prefs::kDefaultSearchProviderImageURLPostParams);
63 std::string icon_url =
64 prefs->GetString(prefs::kDefaultSearchProviderIconURL);
65 std::string encodings =
66 prefs->GetString(prefs::kDefaultSearchProviderEncodings);
67 std::string id_string = prefs->GetString(prefs::kDefaultSearchProviderID);
68 std::string prepopulate_id =
69 prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID);
70 const base::ListValue* alternate_urls =
71 prefs->GetList(prefs::kDefaultSearchProviderAlternateURLs);
72 std::string search_terms_replacement_key = prefs->GetString(
73 prefs::kDefaultSearchProviderSearchTermsReplacementKey);
74
75 scoped_ptr<TemplateURLData> default_provider_data(new TemplateURLData);
76 default_provider_data->short_name = name;
77 default_provider_data->SetKeyword(keyword);
78 default_provider_data->SetURL(search_url);
79 default_provider_data->suggestions_url = suggest_url;
80 default_provider_data->instant_url = instant_url;
81 default_provider_data->image_url = image_url;
82 default_provider_data->new_tab_url = new_tab_url;
83 default_provider_data->search_url_post_params = search_url_post_params;
84 default_provider_data->suggestions_url_post_params =
85 suggest_url_post_params;
86 default_provider_data->instant_url_post_params = instant_url_post_params;
87 default_provider_data->image_url_post_params = image_url_post_params;
88 default_provider_data->favicon_url = GURL(icon_url);
89 default_provider_data->show_in_default_list = true;
90 default_provider_data->alternate_urls.clear();
91 for (size_t i = 0; i < alternate_urls->GetSize(); ++i) {
92 std::string alternate_url;
93 if (alternate_urls->GetString(i, &alternate_url))
94 default_provider_data->alternate_urls.push_back(alternate_url);
95 }
96 default_provider_data->search_terms_replacement_key =
97 search_terms_replacement_key;
98 base::SplitString(encodings, ';', &default_provider_data->input_encodings);
99 if (!id_string.empty()) {
100 int64 value;
101 base::StringToInt64(id_string, &value);
102 default_provider_data->id = value;
103 }
104 if (!prepopulate_id.empty()) {
105 int value;
106 base::StringToInt(prepopulate_id, &value);
107 default_provider_data->prepopulate_id = value;
108 }
109 return default_provider_data.Pass();
110 }
111
112 void ClearDefaultSearchProviderFromLegacyPrefs(PrefService* prefs) {
113 prefs->ClearPref(prefs::kDefaultSearchProviderName);
114 prefs->ClearPref(prefs::kDefaultSearchProviderKeyword);
115 prefs->ClearPref(prefs::kDefaultSearchProviderSearchURL);
116 prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURL);
117 prefs->ClearPref(prefs::kDefaultSearchProviderInstantURL);
118 prefs->ClearPref(prefs::kDefaultSearchProviderImageURL);
119 prefs->ClearPref(prefs::kDefaultSearchProviderNewTabURL);
120 prefs->ClearPref(prefs::kDefaultSearchProviderSearchURLPostParams);
121 prefs->ClearPref(prefs::kDefaultSearchProviderSuggestURLPostParams);
122 prefs->ClearPref(prefs::kDefaultSearchProviderInstantURLPostParams);
123 prefs->ClearPref(prefs::kDefaultSearchProviderImageURLPostParams);
124 prefs->ClearPref(prefs::kDefaultSearchProviderIconURL);
125 prefs->ClearPref(prefs::kDefaultSearchProviderEncodings);
126 prefs->ClearPref(prefs::kDefaultSearchProviderPrepopulateID);
127 prefs->ClearPref(prefs::kDefaultSearchProviderAlternateURLs);
128 prefs->ClearPref(prefs::kDefaultSearchProviderSearchTermsReplacementKey);
129 }
130
19 void MigrateDefaultSearchPref(PrefService* pref_service) { 131 void MigrateDefaultSearchPref(PrefService* pref_service) {
132 DCHECK(pref_service);
20 DefaultSearchManager default_search_manager( 133 DefaultSearchManager default_search_manager(
21 pref_service, DefaultSearchManager::ObserverCallback()); 134 pref_service, DefaultSearchManager::ObserverCallback());
22 135
23 if (default_search_manager.GetDefaultSearchEngineSource() == 136 DefaultSearchManager::Source modern_source;
24 DefaultSearchManager::FROM_USER) { 137 TemplateURLData* modern_value =
25 return; 138 default_search_manager.GetDefaultSearchEngine(&modern_source);
139 if (modern_source == DefaultSearchManager::FROM_FALLBACK) {
140 scoped_ptr<TemplateURLData> legacy_dse_from_prefs(
141 LoadDefaultSearchProviderFromLegacyPrefs(pref_service));
142 if (!legacy_dse_from_prefs) {
143 // The DSE is undefined. It might have been policy-defined. Nothing to
144 // migrate.
145 return;
146 }
147
148 // |modern_value| is the prepopulated default. If it matches the legacy DSE
149 // we assume it is not a user-selected value.
150 if (!modern_value ||
151 legacy_dse_from_prefs->prepopulate_id != modern_value->prepopulate_id) {
152 // This looks like a user-selected value, so let's migrate it.
153 // TODO(erikwright): Remove this migration logic when this stat approaches
154 // zero.
155 UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true);
156 default_search_manager.SetUserSelectedDefaultSearchEngine(
157 *legacy_dse_from_prefs);
158 }
159 ClearDefaultSearchProviderFromLegacyPrefs(pref_service);
26 } 160 }
27
28 scoped_ptr<TemplateURLData> legacy_dse_from_prefs;
29 bool legacy_is_managed = false;
30 bool has_legacy_dse_from_prefs =
31 TemplateURLService::LoadDefaultSearchProviderFromPrefs(
32 pref_service, &legacy_dse_from_prefs, &legacy_is_managed);
33
34 if (!has_legacy_dse_from_prefs) {
35 // The DSE is undefined. Nothing to migrate.
36 return;
37 }
38 if (!legacy_dse_from_prefs) {
39 // The DSE is defined as NULL. This can only really be done via policy.
40 // Policy-defined values will be automatically projected into the new
41 // format. Even if the user did somehow set this manually we do not have a
42 // way to migrate it.
43 return;
44 }
45 if (legacy_is_managed) {
46 // The DSE is policy-managed, not user-selected. It will automatically be
47 // projected into the new location.
48 return;
49 }
50
51 // If the pre-populated DSE matches the DSE from prefs we assume it is not a
52 // user-selected value.
53 scoped_ptr<TemplateURLData> prepopulated_dse(
54 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service));
55 if (prepopulated_dse &&
56 legacy_dse_from_prefs->prepopulate_id ==
57 prepopulated_dse->prepopulate_id) {
58 return;
59 }
60
61 UMA_HISTOGRAM_BOOLEAN("Search.MigratedPrefToDictionaryValue", true);
62
63 // This looks like a user-selected value, so let's migrate it. Subsequent
64 // changes to this value will be automatically stored in the correct location.
65 default_search_manager.SetUserSelectedDefaultSearchEngine(
66 *legacy_dse_from_prefs);
67
68 // TODO(erikwright): Clear the legacy value when the modern value is the
69 // authority. Don't forget to do this even if we don't migrate (because we
70 // migrated prior to implementing the clear.
71 } 161 }
72 162
73 void OnPrefsInitialized(PrefService* pref_service, 163 void OnPrefsInitialized(PrefService* pref_service,
74 bool pref_service_initialization_success) { 164 bool pref_service_initialization_success) {
75 MigrateDefaultSearchPref(pref_service); 165 MigrateDefaultSearchPref(pref_service);
76 } 166 }
77 167
78 } // namespace 168 } // namespace
79 169
80 void ConfigureDefaultSearchPrefMigrationToDictionaryValue( 170 void ConfigureDefaultSearchPrefMigrationToDictionaryValue(
81 PrefService* pref_service) { 171 PrefService* pref_service) {
82 if (pref_service->GetInitializationStatus() == 172 if (pref_service->GetInitializationStatus() ==
83 PrefService::INITIALIZATION_STATUS_WAITING) { 173 PrefService::INITIALIZATION_STATUS_WAITING) {
84 pref_service->AddPrefInitObserver( 174 pref_service->AddPrefInitObserver(
85 base::Bind(&OnPrefsInitialized, base::Unretained(pref_service))); 175 base::Bind(&OnPrefsInitialized, base::Unretained(pref_service)));
86 } else { 176 } else {
87 MigrateDefaultSearchPref(pref_service); 177 MigrateDefaultSearchPref(pref_service);
88 } 178 }
89 } 179 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698