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 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 const char DefaultSearchManager::kLastModified[] = "last_modified"; | 71 const char DefaultSearchManager::kLastModified[] = "last_modified"; |
73 const char DefaultSearchManager::kLastVisited[] = "last_visited"; | 72 const char DefaultSearchManager::kLastVisited[] = "last_visited"; |
74 | 73 |
75 const char DefaultSearchManager::kUsageCount[] = "usage_count"; | 74 const char DefaultSearchManager::kUsageCount[] = "usage_count"; |
76 const char DefaultSearchManager::kAlternateURLs[] = "alternate_urls"; | 75 const char DefaultSearchManager::kAlternateURLs[] = "alternate_urls"; |
77 const char DefaultSearchManager::kSearchTermsReplacementKey[] = | 76 const char DefaultSearchManager::kSearchTermsReplacementKey[] = |
78 "search_terms_replacement_key"; | 77 "search_terms_replacement_key"; |
79 const char DefaultSearchManager::kCreatedByPolicy[] = "created_by_policy"; | 78 const char DefaultSearchManager::kCreatedByPolicy[] = "created_by_policy"; |
80 const char DefaultSearchManager::kDisabledByPolicy[] = "disabled_by_policy"; | 79 const char DefaultSearchManager::kDisabledByPolicy[] = "disabled_by_policy"; |
81 | 80 |
| 81 const char DefaultSearchManager::kExtensionID[] = "extension_id"; |
| 82 |
82 DefaultSearchManager::DefaultSearchManager( | 83 DefaultSearchManager::DefaultSearchManager( |
83 PrefService* pref_service, | 84 PrefService* pref_service, |
84 const ObserverCallback& change_observer) | 85 const ObserverCallback& change_observer) |
85 : pref_service_(pref_service), | 86 : pref_service_(pref_service), |
86 change_observer_(change_observer), | 87 change_observer_(change_observer), |
87 default_search_controlled_by_policy_(false) { | 88 default_search_controlled_by_policy_(false) { |
88 if (pref_service_) { | 89 if (pref_service_) { |
89 pref_change_registrar_.Init(pref_service_); | 90 pref_change_registrar_.Init(pref_service_); |
90 pref_change_registrar_.Add( | 91 pref_change_registrar_.Add( |
91 kDefaultSearchProviderDataPrefName, | 92 kDefaultSearchProviderDataPrefName, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 if (extension_default_search_) { | 134 if (extension_default_search_) { |
134 if (source) | 135 if (source) |
135 *source = FROM_EXTENSION; | 136 *source = FROM_EXTENSION; |
136 return extension_default_search_.get(); | 137 return extension_default_search_.get(); |
137 } | 138 } |
138 if (prefs_default_search_) { | 139 if (prefs_default_search_) { |
139 if (source) | 140 if (source) |
140 *source = FROM_USER; | 141 *source = FROM_USER; |
141 return prefs_default_search_.get(); | 142 return prefs_default_search_.get(); |
142 } | 143 } |
143 | |
144 if (source) | 144 if (source) |
145 *source = FROM_FALLBACK; | 145 *source = FROM_FALLBACK; |
146 return g_fallback_search_engines_disabled ? | 146 return g_fallback_search_engines_disabled ? |
147 NULL : fallback_default_search_.get(); | 147 NULL : fallback_default_search_.get(); |
148 } | 148 } |
149 | 149 |
150 DefaultSearchManager::Source | 150 DefaultSearchManager::Source |
151 DefaultSearchManager::GetDefaultSearchEngineSource() const { | 151 DefaultSearchManager::GetDefaultSearchEngineSource() const { |
152 Source source; | 152 Source source; |
153 GetDefaultSearchEngine(&source); | 153 GetDefaultSearchEngine(&source); |
154 return source; | 154 return source; |
155 } | 155 } |
156 | 156 |
157 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( | 157 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( |
158 const TemplateURLData& data) { | 158 const TemplateURLData& data) { |
159 if (!pref_service_) { | 159 if (!pref_service_) { |
160 prefs_default_search_.reset(new TemplateURLData(data)); | 160 prefs_default_search_.reset(new TemplateURLData(data)); |
161 MergePrefsDataWithPrepopulated(); | 161 MergePrefsDataWithPrepopulated(); |
162 NotifyObserver(); | 162 NotifyObserver(); |
163 return; | 163 return; |
164 } | 164 } |
165 | 165 |
166 pref_service_->Set(kDefaultSearchProviderDataPrefName, | 166 pref_service_->Set(kDefaultSearchProviderDataPrefName, |
167 *TemplateURLDataToDictionary(data)); | 167 *TemplateURLDataToDictionary(data)); |
168 } | 168 } |
169 | 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 | |
184 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { | 170 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { |
185 if (pref_service_) { | 171 if (pref_service_) { |
186 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); | 172 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); |
187 } else { | 173 } else { |
188 prefs_default_search_.reset(); | 174 prefs_default_search_.reset(); |
189 NotifyObserver(); | 175 NotifyObserver(); |
190 } | 176 } |
191 } | 177 } |
192 | 178 |
193 void DefaultSearchManager::OnDefaultSearchPrefChanged() { | 179 void DefaultSearchManager::OnDefaultSearchPrefChanged() { |
194 Source source = GetDefaultSearchEngineSource(); | 180 bool source_was_fallback = GetDefaultSearchEngineSource() == FROM_FALLBACK; |
| 181 |
195 LoadDefaultSearchEngineFromPrefs(); | 182 LoadDefaultSearchEngineFromPrefs(); |
196 | 183 |
197 // If we were/are FROM_USER or FROM_POLICY the effective DSE may have changed. | 184 // The effective DSE may have changed unless we were using the fallback source |
198 if (source != FROM_USER && source != FROM_POLICY) | 185 // both before and after the above load. |
199 source = GetDefaultSearchEngineSource(); | 186 if (!source_was_fallback || (GetDefaultSearchEngineSource() != FROM_FALLBACK)) |
200 if (source == FROM_USER || source == FROM_POLICY) | |
201 NotifyObserver(); | 187 NotifyObserver(); |
202 } | 188 } |
203 | 189 |
204 void DefaultSearchManager::OnOverridesPrefChanged() { | 190 void DefaultSearchManager::OnOverridesPrefChanged() { |
205 LoadPrepopulatedDefaultSearch(); | 191 LoadPrepopulatedDefaultSearch(); |
206 | 192 |
207 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); | 193 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); |
208 if (effective_data && effective_data->prepopulate_id) { | 194 if (effective_data && effective_data->prepopulate_id) { |
209 // A user-selected, policy-selected or fallback pre-populated engine is | 195 // A user-selected, policy-selected or fallback pre-populated engine is |
210 // active and may have changed with this event. | 196 // active and may have changed with this event. |
(...skipping 27 matching lines...) Expand all Loading... |
238 prefs_default_search_ = std::move(engine); | 224 prefs_default_search_ = std::move(engine); |
239 return; | 225 return; |
240 } | 226 } |
241 } | 227 } |
242 | 228 |
243 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { | 229 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { |
244 if (!pref_service_) | 230 if (!pref_service_) |
245 return; | 231 return; |
246 | 232 |
247 prefs_default_search_.reset(); | 233 prefs_default_search_.reset(); |
| 234 extension_default_search_.reset(); |
248 const PrefService::Preference* pref = | 235 const PrefService::Preference* pref = |
249 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); | 236 pref_service_->FindPreference(kDefaultSearchProviderDataPrefName); |
250 DCHECK(pref); | 237 DCHECK(pref); |
251 default_search_controlled_by_policy_ = pref->IsManaged(); | 238 default_search_controlled_by_policy_ = pref->IsManaged(); |
252 | 239 |
253 const base::DictionaryValue* url_dict = | 240 const base::DictionaryValue* url_dict = |
254 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); | 241 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); |
255 if (url_dict->empty()) | 242 if (url_dict->empty()) |
256 return; | 243 return; |
257 | 244 |
258 if (default_search_controlled_by_policy_) { | 245 if (default_search_controlled_by_policy_) { |
259 bool disabled_by_policy = false; | 246 bool disabled_by_policy = false; |
260 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 247 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
261 disabled_by_policy) | 248 disabled_by_policy) |
262 return; | 249 return; |
263 } | 250 } |
264 | 251 |
265 auto turl_data = TemplateURLDataFromDictionary(*url_dict); | 252 auto turl_data = TemplateURLDataFromDictionary(*url_dict); |
266 if (!turl_data) | 253 if (!turl_data) |
267 return; | 254 return; |
268 | 255 |
269 prefs_default_search_ = std::move(turl_data); | 256 // Check if default search preference is overriden by extension. |
270 MergePrefsDataWithPrepopulated(); | 257 if (pref->IsExtensionControlled()) { |
| 258 extension_default_search_ = std::move(turl_data); |
| 259 } else { |
| 260 prefs_default_search_ = std::move(turl_data); |
| 261 MergePrefsDataWithPrepopulated(); |
| 262 } |
271 } | 263 } |
272 | 264 |
273 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { | 265 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { |
274 std::unique_ptr<TemplateURLData> data = | 266 std::unique_ptr<TemplateURLData> data = |
275 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | 267 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); |
276 fallback_default_search_ = std::move(data); | 268 fallback_default_search_ = std::move(data); |
277 MergePrefsDataWithPrepopulated(); | 269 MergePrefsDataWithPrepopulated(); |
278 } | 270 } |
279 | 271 |
280 void DefaultSearchManager::NotifyObserver() { | 272 void DefaultSearchManager::NotifyObserver() { |
281 if (!change_observer_.is_null()) { | 273 if (!change_observer_.is_null()) { |
282 Source source = FROM_FALLBACK; | 274 Source source = FROM_FALLBACK; |
283 TemplateURLData* data = GetDefaultSearchEngine(&source); | 275 TemplateURLData* data = GetDefaultSearchEngine(&source); |
284 change_observer_.Run(data, source); | 276 change_observer_.Run(data, source); |
285 } | 277 } |
286 } | 278 } |
OLD | NEW |