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 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
133 if (extension_default_search_) { | 132 if (extension_default_search_) { |
134 if (source) | 133 if (source) |
135 *source = FROM_EXTENSION; | 134 *source = FROM_EXTENSION; |
136 return extension_default_search_.get(); | 135 return extension_default_search_.get(); |
137 } | 136 } |
138 if (prefs_default_search_) { | 137 if (prefs_default_search_) { |
139 if (source) | 138 if (source) |
140 *source = FROM_USER; | 139 *source = FROM_USER; |
141 return prefs_default_search_.get(); | 140 return prefs_default_search_.get(); |
142 } | 141 } |
143 | |
144 if (source) | 142 if (source) |
145 *source = FROM_FALLBACK; | 143 *source = FROM_FALLBACK; |
146 return GetFallbackSearchEngine(); | 144 return GetFallbackSearchEngine(); |
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; |
(...skipping 10 matching lines...) Expand all Loading... | |
164 prefs_default_search_.reset(new TemplateURLData(data)); | 162 prefs_default_search_.reset(new TemplateURLData(data)); |
165 MergePrefsDataWithPrepopulated(); | 163 MergePrefsDataWithPrepopulated(); |
166 NotifyObserver(); | 164 NotifyObserver(); |
167 return; | 165 return; |
168 } | 166 } |
169 | 167 |
170 pref_service_->Set(kDefaultSearchProviderDataPrefName, | 168 pref_service_->Set(kDefaultSearchProviderDataPrefName, |
171 *TemplateURLDataToDictionary(data)); | 169 *TemplateURLDataToDictionary(data)); |
172 } | 170 } |
173 | 171 |
174 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( | |
175 const TemplateURLData& data) { | |
176 extension_default_search_.reset(new TemplateURLData(data)); | |
177 if (GetDefaultSearchEngineSource() == FROM_EXTENSION) | |
178 NotifyObserver(); | |
179 } | |
180 | |
181 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { | |
182 Source old_source = GetDefaultSearchEngineSource(); | |
183 extension_default_search_.reset(); | |
184 if (old_source == FROM_EXTENSION) | |
185 NotifyObserver(); | |
186 } | |
187 | |
188 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { | 172 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { |
189 if (pref_service_) { | 173 if (pref_service_) { |
190 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); | 174 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); |
191 } else { | 175 } else { |
192 prefs_default_search_.reset(); | 176 prefs_default_search_.reset(); |
193 NotifyObserver(); | 177 NotifyObserver(); |
194 } | 178 } |
195 } | 179 } |
196 | 180 |
197 void DefaultSearchManager::OnDefaultSearchPrefChanged() { | 181 void DefaultSearchManager::OnDefaultSearchPrefChanged() { |
198 Source source = GetDefaultSearchEngineSource(); | 182 bool source_was_fallback = GetDefaultSearchEngineSource() == FROM_FALLBACK; |
183 | |
199 LoadDefaultSearchEngineFromPrefs(); | 184 LoadDefaultSearchEngineFromPrefs(); |
200 | 185 |
201 // If we were/are FROM_USER or FROM_POLICY the effective DSE may have changed. | 186 // The effective DSE may have changed unless we were using the fallback source |
202 if (source != FROM_USER && source != FROM_POLICY) | 187 // both before and after the above load. |
203 source = GetDefaultSearchEngineSource(); | 188 if (!source_was_fallback || (GetDefaultSearchEngineSource() != FROM_FALLBACK)) |
204 if (source == FROM_USER || source == FROM_POLICY) | |
205 NotifyObserver(); | 189 NotifyObserver(); |
206 } | 190 } |
207 | 191 |
208 void DefaultSearchManager::OnOverridesPrefChanged() { | 192 void DefaultSearchManager::OnOverridesPrefChanged() { |
209 LoadPrepopulatedDefaultSearch(); | 193 LoadPrepopulatedDefaultSearch(); |
210 | 194 |
211 const TemplateURLData* effective_data = GetDefaultSearchEngine(nullptr); | 195 const TemplateURLData* effective_data = GetDefaultSearchEngine(nullptr); |
212 if (effective_data && effective_data->prepopulate_id) { | 196 if (effective_data && effective_data->prepopulate_id) { |
213 // A user-selected, policy-selected or fallback pre-populated engine is | 197 // A user-selected, policy-selected or fallback pre-populated engine is |
214 // active and may have changed with this event. | 198 // active and may have changed with this event. |
(...skipping 27 matching lines...) Expand all Loading... | |
242 prefs_default_search_ = std::move(engine); | 226 prefs_default_search_ = std::move(engine); |
243 return; | 227 return; |
244 } | 228 } |
245 } | 229 } |
246 | 230 |
247 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { | 231 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { |
248 if (!pref_service_) | 232 if (!pref_service_) |
249 return; | 233 return; |
250 | 234 |
251 prefs_default_search_.reset(); | 235 prefs_default_search_.reset(); |
236 extension_default_search_.reset(); | |
252 const PrefService::Preference* pref = | 237 const PrefService::Preference* pref = |
253 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); | 238 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); |
254 DCHECK(pref); | 239 DCHECK(pref); |
255 default_search_controlled_by_policy_ = pref->IsManaged(); | 240 default_search_controlled_by_policy_ = pref->IsManaged(); |
256 | 241 |
257 const base::DictionaryValue* url_dict = | 242 const base::DictionaryValue* url_dict = |
258 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); | 243 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); |
259 if (url_dict->empty()) | 244 if (url_dict->empty()) |
260 return; | 245 return; |
261 | 246 |
262 if (default_search_controlled_by_policy_) { | 247 if (default_search_controlled_by_policy_) { |
263 bool disabled_by_policy = false; | 248 bool disabled_by_policy = false; |
264 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 249 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
265 disabled_by_policy) | 250 disabled_by_policy) |
266 return; | 251 return; |
267 } | 252 } |
268 | 253 |
269 auto turl_data = TemplateURLDataFromDictionary(*url_dict); | 254 auto turl_data = TemplateURLDataFromDictionary(*url_dict); |
270 if (!turl_data) | 255 if (!turl_data) |
271 return; | 256 return; |
272 | 257 |
273 prefs_default_search_ = std::move(turl_data); | 258 // Check if default search preference is overriden by extension. |
274 MergePrefsDataWithPrepopulated(); | 259 if (pref->IsExtensionControlled()) { |
260 extension_default_search_ = std::move(turl_data); | |
261 } else { | |
262 prefs_default_search_ = std::move(turl_data); | |
263 MergePrefsDataWithPrepopulated(); | |
Peter Kasting
2017/02/28 00:56:37
Do we need to make this call regardless?
It seems
Alexander Yashkin
2017/02/28 11:59:56
MergePrefsDataWithPrepopulated is updating values
Peter Kasting
2017/02/28 23:30:30
Could you spell this out more?
The scenario is th
Alexander Yashkin
2017/03/01 05:36:43
I think I was wrong.
This was my a theory:
1. Ext
| |
264 } | |
275 } | 265 } |
276 | 266 |
277 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { | 267 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { |
278 std::unique_ptr<TemplateURLData> data = | 268 std::unique_ptr<TemplateURLData> data = |
279 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | 269 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); |
280 fallback_default_search_ = std::move(data); | 270 fallback_default_search_ = std::move(data); |
281 MergePrefsDataWithPrepopulated(); | 271 MergePrefsDataWithPrepopulated(); |
282 } | 272 } |
283 | 273 |
284 void DefaultSearchManager::NotifyObserver() { | 274 void DefaultSearchManager::NotifyObserver() { |
285 if (!change_observer_.is_null()) { | 275 if (!change_observer_.is_null()) { |
286 Source source = FROM_FALLBACK; | 276 Source source = FROM_FALLBACK; |
287 const TemplateURLData* data = GetDefaultSearchEngine(&source); | 277 const TemplateURLData* data = GetDefaultSearchEngine(&source); |
288 change_observer_.Run(data, source); | 278 change_observer_.Run(data, source); |
289 } | 279 } |
290 } | 280 } |
OLD | NEW |