Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(47)

Side by Side Diff: components/search_engines/default_search_manager.cc

Issue 2639153002: Make extensions DSE persistent in browser prefs (Reland) (Closed)
Patch Set: Fixed after review, round 4 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698