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