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