OLD | NEW |
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 "components/search_engines/default_search_manager.h" | 5 #include "components/search_engines/default_search_manager.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/bind_helpers.h" | 14 #include "base/bind_helpers.h" |
15 #include "base/compiler_specific.h" | 15 #include "base/compiler_specific.h" |
16 #include "base/i18n/case_conversion.h" | 16 #include "base/i18n/case_conversion.h" |
17 #include "base/logging.h" | 17 #include "base/logging.h" |
| 18 #include "base/strings/string_number_conversions.h" |
18 #include "base/strings/string_split.h" | 19 #include "base/strings/string_split.h" |
19 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
20 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
21 #include "base/time/time.h" | 22 #include "base/time/time.h" |
22 #include "components/pref_registry/pref_registry_syncable.h" | 23 #include "components/pref_registry/pref_registry_syncable.h" |
23 #include "components/prefs/pref_service.h" | 24 #include "components/prefs/pref_service.h" |
24 #include "components/prefs/pref_value_map.h" | 25 #include "components/prefs/pref_value_map.h" |
25 #include "components/search_engines/search_engines_pref_names.h" | 26 #include "components/search_engines/search_engines_pref_names.h" |
26 #include "components/search_engines/template_url_data.h" | 27 #include "components/search_engines/template_url_data.h" |
27 #include "components/search_engines/template_url_data_util.h" | 28 #include "components/search_engines/template_url_data_util.h" |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 if (extension_default_search_) { | 133 if (extension_default_search_) { |
133 if (source) | 134 if (source) |
134 *source = FROM_EXTENSION; | 135 *source = FROM_EXTENSION; |
135 return extension_default_search_.get(); | 136 return extension_default_search_.get(); |
136 } | 137 } |
137 if (prefs_default_search_) { | 138 if (prefs_default_search_) { |
138 if (source) | 139 if (source) |
139 *source = FROM_USER; | 140 *source = FROM_USER; |
140 return prefs_default_search_.get(); | 141 return prefs_default_search_.get(); |
141 } | 142 } |
| 143 |
142 if (source) | 144 if (source) |
143 *source = FROM_FALLBACK; | 145 *source = FROM_FALLBACK; |
144 return g_fallback_search_engines_disabled ? | 146 return g_fallback_search_engines_disabled ? |
145 NULL : fallback_default_search_.get(); | 147 NULL : fallback_default_search_.get(); |
146 } | 148 } |
147 | 149 |
148 DefaultSearchManager::Source | 150 DefaultSearchManager::Source |
149 DefaultSearchManager::GetDefaultSearchEngineSource() const { | 151 DefaultSearchManager::GetDefaultSearchEngineSource() const { |
150 Source source; | 152 Source source; |
151 GetDefaultSearchEngine(&source); | 153 GetDefaultSearchEngine(&source); |
152 return source; | 154 return source; |
153 } | 155 } |
154 | 156 |
155 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( | 157 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( |
156 const TemplateURLData& data) { | 158 const TemplateURLData& data) { |
157 if (!pref_service_) { | 159 if (!pref_service_) { |
158 prefs_default_search_.reset(new TemplateURLData(data)); | 160 prefs_default_search_.reset(new TemplateURLData(data)); |
159 MergePrefsDataWithPrepopulated(); | 161 MergePrefsDataWithPrepopulated(); |
160 NotifyObserver(); | 162 NotifyObserver(); |
161 return; | 163 return; |
162 } | 164 } |
163 | 165 |
164 pref_service_->Set(kDefaultSearchProviderDataPrefName, | 166 pref_service_->Set(kDefaultSearchProviderDataPrefName, |
165 *TemplateURLDataToDictionary(data)); | 167 *TemplateURLDataToDictionary(data)); |
166 } | 168 } |
167 | 169 |
| 170 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( |
| 171 const TemplateURLData& data) { |
| 172 extension_default_search_.reset(new TemplateURLData(data)); |
| 173 if (GetDefaultSearchEngineSource() == FROM_EXTENSION) |
| 174 NotifyObserver(); |
| 175 } |
| 176 |
| 177 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { |
| 178 Source old_source = GetDefaultSearchEngineSource(); |
| 179 extension_default_search_.reset(); |
| 180 if (old_source == FROM_EXTENSION) |
| 181 NotifyObserver(); |
| 182 } |
| 183 |
168 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { | 184 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { |
169 if (pref_service_) { | 185 if (pref_service_) { |
170 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); | 186 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); |
171 } else { | 187 } else { |
172 prefs_default_search_.reset(); | 188 prefs_default_search_.reset(); |
173 NotifyObserver(); | 189 NotifyObserver(); |
174 } | 190 } |
175 } | 191 } |
176 | 192 |
177 void DefaultSearchManager::OnDefaultSearchPrefChanged() { | 193 void DefaultSearchManager::OnDefaultSearchPrefChanged() { |
178 bool source_was_fallback = GetDefaultSearchEngineSource() == FROM_FALLBACK; | 194 Source source = GetDefaultSearchEngineSource(); |
179 | |
180 LoadDefaultSearchEngineFromPrefs(); | 195 LoadDefaultSearchEngineFromPrefs(); |
181 | 196 |
182 // The effective DSE may have changed unless we were using the fallback source | 197 // If we were/are FROM_USER or FROM_POLICY the effective DSE may have changed. |
183 // both before and after the above load. | 198 if (source != FROM_USER && source != FROM_POLICY) |
184 if (!source_was_fallback || (GetDefaultSearchEngineSource() != FROM_FALLBACK)) | 199 source = GetDefaultSearchEngineSource(); |
| 200 if (source == FROM_USER || source == FROM_POLICY) |
185 NotifyObserver(); | 201 NotifyObserver(); |
186 } | 202 } |
187 | 203 |
188 void DefaultSearchManager::OnOverridesPrefChanged() { | 204 void DefaultSearchManager::OnOverridesPrefChanged() { |
189 LoadPrepopulatedDefaultSearch(); | 205 LoadPrepopulatedDefaultSearch(); |
190 | 206 |
191 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); | 207 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); |
192 if (effective_data && effective_data->prepopulate_id) { | 208 if (effective_data && effective_data->prepopulate_id) { |
193 // A user-selected, policy-selected or fallback pre-populated engine is | 209 // A user-selected, policy-selected or fallback pre-populated engine is |
194 // active and may have changed with this event. | 210 // active and may have changed with this event. |
(...skipping 28 matching lines...) Expand all Loading... |
223 prefs_default_search_ = std::move(engine); | 239 prefs_default_search_ = std::move(engine); |
224 return; | 240 return; |
225 } | 241 } |
226 } | 242 } |
227 | 243 |
228 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { | 244 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { |
229 if (!pref_service_) | 245 if (!pref_service_) |
230 return; | 246 return; |
231 | 247 |
232 prefs_default_search_.reset(); | 248 prefs_default_search_.reset(); |
233 extension_default_search_.reset(); | |
234 const PrefService::Preference* pref = | 249 const PrefService::Preference* pref = |
235 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); | 250 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); |
236 DCHECK(pref); | 251 DCHECK(pref); |
237 default_search_controlled_by_policy_ = pref->IsManaged(); | 252 default_search_controlled_by_policy_ = pref->IsManaged(); |
238 | 253 |
239 const base::DictionaryValue* url_dict = | 254 const base::DictionaryValue* url_dict = |
240 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); | 255 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); |
241 if (url_dict->empty()) | 256 if (url_dict->empty()) |
242 return; | 257 return; |
243 | 258 |
244 if (default_search_controlled_by_policy_) { | 259 if (default_search_controlled_by_policy_) { |
245 bool disabled_by_policy = false; | 260 bool disabled_by_policy = false; |
246 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 261 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
247 disabled_by_policy) | 262 disabled_by_policy) |
248 return; | 263 return; |
249 } | 264 } |
250 | 265 |
251 auto turl_data = TemplateURLDataFromDictionary(*url_dict); | 266 auto turl_data = TemplateURLDataFromDictionary(*url_dict); |
252 if (!turl_data) | 267 if (!turl_data) |
253 return; | 268 return; |
254 | 269 |
255 // Check if default search preference is overriden by extension. | 270 prefs_default_search_ = std::move(turl_data); |
256 if (pref->IsExtensionControlled()) { | 271 MergePrefsDataWithPrepopulated(); |
257 extension_default_search_ = std::move(turl_data); | |
258 } else { | |
259 prefs_default_search_ = std::move(turl_data); | |
260 MergePrefsDataWithPrepopulated(); | |
261 } | |
262 } | 272 } |
263 | 273 |
264 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { | 274 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { |
265 std::unique_ptr<TemplateURLData> data = | 275 std::unique_ptr<TemplateURLData> data = |
266 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | 276 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); |
267 fallback_default_search_ = std::move(data); | 277 fallback_default_search_ = std::move(data); |
268 MergePrefsDataWithPrepopulated(); | 278 MergePrefsDataWithPrepopulated(); |
269 } | 279 } |
270 | 280 |
271 void DefaultSearchManager::NotifyObserver() { | 281 void DefaultSearchManager::NotifyObserver() { |
272 if (!change_observer_.is_null()) { | 282 if (!change_observer_.is_null()) { |
273 Source source = FROM_FALLBACK; | 283 Source source = FROM_FALLBACK; |
274 TemplateURLData* data = GetDefaultSearchEngine(&source); | 284 TemplateURLData* data = GetDefaultSearchEngine(&source); |
275 change_observer_.Run(data, source); | 285 change_observer_.Run(data, source); |
276 } | 286 } |
277 } | 287 } |
OLD | NEW |