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 "chrome/browser/search_engines/default_search_manager.h" | 5 #include "chrome/browser/search_engines/default_search_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <utility> | 8 #include <utility> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 12 matching lines...) Expand all Loading... |
23 #include "chrome/browser/profiles/profile.h" | 23 #include "chrome/browser/profiles/profile.h" |
24 #include "chrome/browser/search_engines/template_url.h" | 24 #include "chrome/browser/search_engines/template_url.h" |
25 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" | 25 #include "chrome/browser/search_engines/template_url_prepopulate_data.h" |
26 #include "chrome/browser/search_engines/template_url_service.h" | 26 #include "chrome/browser/search_engines/template_url_service.h" |
27 #include "chrome/browser/search_engines/util.h" | 27 #include "chrome/browser/search_engines/util.h" |
28 #include "chrome/common/pref_names.h" | 28 #include "chrome/common/pref_names.h" |
29 #include "components/user_prefs/pref_registry_syncable.h" | 29 #include "components/user_prefs/pref_registry_syncable.h" |
30 | 30 |
31 namespace { | 31 namespace { |
32 | 32 |
| 33 bool IsDefaultSearchProviderManaged(PrefService* pref_service) { |
| 34 const PrefService::Preference* pref = pref_service->FindPreference( |
| 35 DefaultSearchManager::kDefaultSearchProviderDataPrefName); |
| 36 DCHECK(pref); |
| 37 return pref->IsManaged(); |
| 38 } |
| 39 |
| 40 } // namespace |
| 41 |
33 // A dictionary to hold all data related to the Default Search Engine. | 42 // A dictionary to hold all data related to the Default Search Engine. |
34 // Eventually, this should replace all the data stored in the | 43 // Eventually, this should replace all the data stored in the |
35 // default_search_provider.* prefs. | 44 // default_search_provider.* prefs. |
36 const char kDefaultSearchProviderData[] = | 45 const char DefaultSearchManager::kDefaultSearchProviderDataPrefName[] = |
37 "default_search_provider_data.template_url_data"; | 46 "default_search_provider_data.template_url_data"; |
38 | 47 |
39 } // namespace | |
40 | |
41 const char DefaultSearchManager::kID[] = "id"; | 48 const char DefaultSearchManager::kID[] = "id"; |
42 const char DefaultSearchManager::kShortName[] = "short_name"; | 49 const char DefaultSearchManager::kShortName[] = "short_name"; |
43 const char DefaultSearchManager::kKeyword[] = "keyword"; | 50 const char DefaultSearchManager::kKeyword[] = "keyword"; |
44 const char DefaultSearchManager::kPrepopulateID[] = "prepopulate_id"; | 51 const char DefaultSearchManager::kPrepopulateID[] = "prepopulate_id"; |
45 const char DefaultSearchManager::kSyncGUID[] = "synced_guid"; | 52 const char DefaultSearchManager::kSyncGUID[] = "synced_guid"; |
46 | 53 |
47 const char DefaultSearchManager::kURL[] = "url"; | 54 const char DefaultSearchManager::kURL[] = "url"; |
48 const char DefaultSearchManager::kSuggestionsURL[] = "suggestions_url"; | 55 const char DefaultSearchManager::kSuggestionsURL[] = "suggestions_url"; |
49 const char DefaultSearchManager::kInstantURL[] = "instant_url"; | 56 const char DefaultSearchManager::kInstantURL[] = "instant_url"; |
50 const char DefaultSearchManager::kImageURL[] = "image_url"; | 57 const char DefaultSearchManager::kImageURL[] = "image_url"; |
(...skipping 16 matching lines...) Expand all Loading... |
67 const char DefaultSearchManager::kDateCreated[] = "date_created"; | 74 const char DefaultSearchManager::kDateCreated[] = "date_created"; |
68 const char DefaultSearchManager::kLastModified[] = "last_modified"; | 75 const char DefaultSearchManager::kLastModified[] = "last_modified"; |
69 | 76 |
70 const char DefaultSearchManager::kUsageCount[] = "usage_count"; | 77 const char DefaultSearchManager::kUsageCount[] = "usage_count"; |
71 const char DefaultSearchManager::kAlternateURLs[] = "alternate_urls"; | 78 const char DefaultSearchManager::kAlternateURLs[] = "alternate_urls"; |
72 const char DefaultSearchManager::kSearchTermsReplacementKey[] = | 79 const char DefaultSearchManager::kSearchTermsReplacementKey[] = |
73 "search_terms_replacement_key"; | 80 "search_terms_replacement_key"; |
74 const char DefaultSearchManager::kCreatedByPolicy[] = "created_by_policy"; | 81 const char DefaultSearchManager::kCreatedByPolicy[] = "created_by_policy"; |
75 const char DefaultSearchManager::kDisabledByPolicy[] = "disabled_by_policy"; | 82 const char DefaultSearchManager::kDisabledByPolicy[] = "disabled_by_policy"; |
76 | 83 |
77 DefaultSearchManager::DefaultSearchManager(PrefService* pref_service) | 84 DefaultSearchManager::DefaultSearchManager( |
78 : pref_service_(pref_service), default_search_controlled_by_policy_(false) { | 85 PrefService* pref_service, |
79 DCHECK(pref_service_); | 86 const ObserverCallback& change_observer) |
80 pref_change_registrar_.Init(pref_service_); | 87 : pref_service_(pref_service), |
81 pref_change_registrar_.Add( | 88 change_observer_(change_observer), |
82 kDefaultSearchProviderData, | 89 default_search_controlled_by_policy_(false) { |
83 base::Bind(&DefaultSearchManager::OnDefaultSearchPrefChanged, | 90 if (pref_service_) { |
84 base::Unretained(this))); | 91 pref_change_registrar_.Init(pref_service_); |
85 pref_change_registrar_.Add( | 92 pref_change_registrar_.Add( |
86 prefs::kSearchProviderOverrides, | 93 kDefaultSearchProviderDataPrefName, |
87 base::Bind(&DefaultSearchManager::OnOverridesPrefChanged, | 94 base::Bind(&DefaultSearchManager::OnDefaultSearchPrefChanged, |
88 base::Unretained(this))); | 95 base::Unretained(this))); |
89 OnDefaultSearchPrefChanged(); | 96 pref_change_registrar_.Add( |
90 OnOverridesPrefChanged(); | 97 prefs::kSearchProviderOverrides, |
| 98 base::Bind(&DefaultSearchManager::OnOverridesPrefChanged, |
| 99 base::Unretained(this))); |
| 100 } |
| 101 LoadPrepopulatedDefaultSearch(); |
| 102 LoadDefaultSearchEngineFromPrefs(); |
91 } | 103 } |
92 | 104 |
93 DefaultSearchManager::~DefaultSearchManager() { | 105 DefaultSearchManager::~DefaultSearchManager() { |
94 } | 106 } |
95 | 107 |
96 // static | 108 // static |
97 void DefaultSearchManager::RegisterProfilePrefs( | 109 void DefaultSearchManager::RegisterProfilePrefs( |
98 user_prefs::PrefRegistrySyncable* registry) { | 110 user_prefs::PrefRegistrySyncable* registry) { |
99 registry->RegisterDictionaryPref( | 111 registry->RegisterDictionaryPref( |
100 kDefaultSearchProviderData, | 112 kDefaultSearchProviderDataPrefName, |
101 user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); | 113 user_prefs::PrefRegistrySyncable::SYNCABLE_PREF); |
102 } | 114 } |
103 | 115 |
104 // static | 116 // static |
105 void DefaultSearchManager::AddPrefValueToMap(base::DictionaryValue* value, | 117 void DefaultSearchManager::AddPrefValueToMap(base::DictionaryValue* value, |
106 PrefValueMap* pref_value_map) { | 118 PrefValueMap* pref_value_map) { |
107 pref_value_map->SetValue(kDefaultSearchProviderData, value); | 119 pref_value_map->SetValue(kDefaultSearchProviderDataPrefName, value); |
| 120 } |
| 121 |
| 122 TemplateURLData* DefaultSearchManager::GetDefaultSearchEngine( |
| 123 Source* source) const { |
| 124 if (default_search_controlled_by_policy_) { |
| 125 if (source) |
| 126 *source = FROM_POLICY; |
| 127 return prefs_default_search_.get(); |
| 128 } |
| 129 if (extension_default_search_) { |
| 130 if (source) |
| 131 *source = FROM_EXTENSION; |
| 132 return extension_default_search_.get(); |
| 133 } |
| 134 if (prefs_default_search_) { |
| 135 if (source) |
| 136 *source = FROM_USER; |
| 137 return prefs_default_search_.get(); |
| 138 } |
| 139 |
| 140 if (source) |
| 141 *source = FROM_FALLBACK; |
| 142 return TemplateURLService::FallbackSearchEnginesDisabled() |
| 143 ? NULL |
| 144 : fallback_default_search_.get(); |
108 } | 145 } |
109 | 146 |
110 DefaultSearchManager::Source | 147 DefaultSearchManager::Source |
111 DefaultSearchManager::GetDefaultSearchEngineSource() const { | 148 DefaultSearchManager::GetDefaultSearchEngineSource() const { |
112 if (default_search_controlled_by_policy_) | 149 Source source; |
113 return FROM_POLICY; | 150 GetDefaultSearchEngine(&source); |
114 if (extension_default_search_) | 151 return source; |
115 return FROM_EXTENSION; | |
116 if (prefs_default_search_) | |
117 return FROM_USER; | |
118 | |
119 return FROM_FALLBACK; | |
120 } | |
121 | |
122 TemplateURLData* DefaultSearchManager::GetDefaultSearchEngine() const { | |
123 if (default_search_controlled_by_policy_) | |
124 return prefs_default_search_.get(); | |
125 if (extension_default_search_) | |
126 return extension_default_search_.get(); | |
127 if (prefs_default_search_) | |
128 return prefs_default_search_.get(); | |
129 | |
130 return fallback_default_search_.get(); | |
131 } | 152 } |
132 | 153 |
133 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( | 154 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( |
134 const TemplateURLData& data) { | 155 const TemplateURLData& data) { |
| 156 if (!pref_service_) { |
| 157 prefs_default_search_.reset(new TemplateURLData(data)); |
| 158 MergePrefsDataWithPrepopulated(); |
| 159 NotifyObserver(); |
| 160 return; |
| 161 } |
| 162 |
135 base::DictionaryValue url_dict; | 163 base::DictionaryValue url_dict; |
136 url_dict.SetString(kID, base::Int64ToString(data.id)); | 164 url_dict.SetString(kID, base::Int64ToString(data.id)); |
137 url_dict.SetString(kShortName, data.short_name); | 165 url_dict.SetString(kShortName, data.short_name); |
138 url_dict.SetString(kKeyword, data.keyword()); | 166 url_dict.SetString(kKeyword, data.keyword()); |
139 url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); | 167 url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); |
140 url_dict.SetString(kSyncGUID, data.sync_guid); | 168 url_dict.SetString(kSyncGUID, data.sync_guid); |
141 | 169 |
142 url_dict.SetString(kURL, data.url()); | 170 url_dict.SetString(kURL, data.url()); |
143 url_dict.SetString(kSuggestionsURL, data.suggestions_url); | 171 url_dict.SetString(kSuggestionsURL, data.suggestions_url); |
144 url_dict.SetString(kInstantURL, data.instant_url); | 172 url_dict.SetString(kInstantURL, data.instant_url); |
(...skipping 10 matching lines...) Expand all Loading... |
155 | 183 |
156 url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); | 184 url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); |
157 | 185 |
158 url_dict.SetDouble(kDateCreated, data.date_created.ToInternalValue()); | 186 url_dict.SetDouble(kDateCreated, data.date_created.ToInternalValue()); |
159 url_dict.SetDouble(kLastModified, data.last_modified.ToInternalValue()); | 187 url_dict.SetDouble(kLastModified, data.last_modified.ToInternalValue()); |
160 url_dict.SetInteger(kUsageCount, data.usage_count); | 188 url_dict.SetInteger(kUsageCount, data.usage_count); |
161 | 189 |
162 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); | 190 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); |
163 for (std::vector<std::string>::const_iterator it = | 191 for (std::vector<std::string>::const_iterator it = |
164 data.alternate_urls.begin(); | 192 data.alternate_urls.begin(); |
165 it != data.alternate_urls.end(); | 193 it != data.alternate_urls.end(); ++it) { |
166 ++it) { | |
167 alternate_urls->AppendString(*it); | 194 alternate_urls->AppendString(*it); |
168 } | 195 } |
169 url_dict.Set(kAlternateURLs, alternate_urls.release()); | 196 url_dict.Set(kAlternateURLs, alternate_urls.release()); |
170 | 197 |
171 scoped_ptr<base::ListValue> encodings(new base::ListValue); | 198 scoped_ptr<base::ListValue> encodings(new base::ListValue); |
172 for (std::vector<std::string>::const_iterator it = | 199 for (std::vector<std::string>::const_iterator it = |
173 data.input_encodings.begin(); | 200 data.input_encodings.begin(); |
174 it != data.input_encodings.end(); | 201 it != data.input_encodings.end(); ++it) { |
175 ++it) { | |
176 encodings->AppendString(*it); | 202 encodings->AppendString(*it); |
177 } | 203 } |
178 url_dict.Set(kInputEncodings, encodings.release()); | 204 url_dict.Set(kInputEncodings, encodings.release()); |
179 | 205 |
180 url_dict.SetString(kSearchTermsReplacementKey, | 206 url_dict.SetString(kSearchTermsReplacementKey, |
181 data.search_terms_replacement_key); | 207 data.search_terms_replacement_key); |
182 | 208 |
183 url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); | 209 url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); |
184 | 210 |
185 pref_service_->Set(kDefaultSearchProviderData, url_dict); | 211 pref_service_->Set(kDefaultSearchProviderDataPrefName, url_dict); |
186 } | 212 } |
187 | 213 |
188 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( | 214 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( |
189 TemplateURLData* data) { | 215 const TemplateURLData& data) { |
190 extension_default_search_.reset(data); | 216 extension_default_search_.reset(new TemplateURLData(data)); |
| 217 if (GetDefaultSearchEngineSource() == FROM_EXTENSION) |
| 218 NotifyObserver(); |
191 } | 219 } |
192 | 220 |
193 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { | 221 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { |
| 222 Source old_source = GetDefaultSearchEngineSource(); |
194 extension_default_search_.reset(); | 223 extension_default_search_.reset(); |
| 224 if (old_source == FROM_EXTENSION) |
| 225 NotifyObserver(); |
195 } | 226 } |
196 | 227 |
197 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { | 228 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { |
198 pref_service_->ClearPref(kDefaultSearchProviderData); | 229 if (pref_service_) { |
| 230 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); |
| 231 } else { |
| 232 prefs_default_search_.reset(); |
| 233 NotifyObserver(); |
| 234 } |
199 } | 235 } |
200 | 236 |
201 void DefaultSearchManager::OnDefaultSearchPrefChanged() { | 237 void DefaultSearchManager::OnDefaultSearchPrefChanged() { |
202 TemplateURLData* data; | 238 Source source = GetDefaultSearchEngineSource(); |
203 if (ReadDefaultSearchEngineFromPrefs(&data)) { | 239 LoadDefaultSearchEngineFromPrefs(); |
204 prefs_default_search_.reset(data); | 240 |
205 MergePrefsDataWithPrepopulated(); | 241 // If we were/are FROM_USER or FROM_POLICY the effective DSE may have changed. |
206 } else { | 242 if (source != FROM_USER && source != FROM_POLICY) |
207 prefs_default_search_.reset(); | 243 source = GetDefaultSearchEngineSource(); |
208 } | 244 if (source == FROM_USER || source == FROM_POLICY) |
209 UpdatePolicyStatus(); | 245 NotifyObserver(); |
210 } | 246 } |
211 | 247 |
212 void DefaultSearchManager::OnOverridesPrefChanged() { | 248 void DefaultSearchManager::OnOverridesPrefChanged() { |
213 scoped_ptr<TemplateURLData> data = | 249 LoadPrepopulatedDefaultSearch(); |
214 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | |
215 fallback_default_search_ = data.Pass(); | |
216 MergePrefsDataWithPrepopulated(); | |
217 } | |
218 | 250 |
219 void DefaultSearchManager::UpdatePolicyStatus() { | 251 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); |
220 const PrefService::Preference* pref = | 252 if (effective_data && effective_data->prepopulate_id) { |
221 pref_service_->FindPreference(kDefaultSearchProviderData); | 253 // A user-selected, policy-selected or fallback pre-populated engine is |
222 default_search_controlled_by_policy_ = pref && pref->IsManaged(); | 254 // active and may have changed with this event. |
| 255 NotifyObserver(); |
| 256 } |
223 } | 257 } |
224 | 258 |
225 void DefaultSearchManager::MergePrefsDataWithPrepopulated() { | 259 void DefaultSearchManager::MergePrefsDataWithPrepopulated() { |
226 if (!prefs_default_search_ || !prefs_default_search_->prepopulate_id) | 260 if (!prefs_default_search_ || !prefs_default_search_->prepopulate_id) |
227 return; | 261 return; |
228 | 262 |
229 size_t default_search_index; | 263 size_t default_search_index; |
230 ScopedVector<TemplateURLData> prepopulated_urls = | 264 ScopedVector<TemplateURLData> prepopulated_urls = |
231 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service_, | 265 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service_, |
232 &default_search_index); | 266 &default_search_index); |
(...skipping 11 matching lines...) Expand all Loading... |
244 prepopulated_urls[i]->date_created = prefs_default_search_->date_created; | 278 prepopulated_urls[i]->date_created = prefs_default_search_->date_created; |
245 prepopulated_urls[i]->last_modified = | 279 prepopulated_urls[i]->last_modified = |
246 prefs_default_search_->last_modified; | 280 prefs_default_search_->last_modified; |
247 prefs_default_search_.reset(prepopulated_urls[i]); | 281 prefs_default_search_.reset(prepopulated_urls[i]); |
248 prepopulated_urls.weak_erase(prepopulated_urls.begin() + i); | 282 prepopulated_urls.weak_erase(prepopulated_urls.begin() + i); |
249 return; | 283 return; |
250 } | 284 } |
251 } | 285 } |
252 } | 286 } |
253 | 287 |
254 bool DefaultSearchManager::ReadDefaultSearchEngineFromPrefs( | 288 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { |
255 TemplateURLData** dse_data) { | 289 if (!pref_service_) |
| 290 return; |
| 291 |
| 292 prefs_default_search_.reset(); |
| 293 default_search_controlled_by_policy_ = |
| 294 IsDefaultSearchProviderManaged(pref_service_); |
| 295 |
256 const base::DictionaryValue* url_dict = | 296 const base::DictionaryValue* url_dict = |
257 pref_service_->GetDictionary(kDefaultSearchProviderData); | 297 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); |
| 298 if (url_dict->empty()) |
| 299 return; |
258 | 300 |
259 if (url_dict->empty()) | 301 if (default_search_controlled_by_policy_) { |
260 return false; | 302 bool disabled_by_policy = false; |
261 | 303 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
262 bool disabled_by_policy = false; | 304 disabled_by_policy) |
263 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 305 return; |
264 disabled_by_policy) { | |
265 *dse_data = NULL; | |
266 return true; | |
267 } | 306 } |
268 | 307 |
269 TemplateURLData* data = new TemplateURLData(); | |
270 std::string search_url; | 308 std::string search_url; |
271 base::string16 keyword; | 309 base::string16 keyword; |
272 url_dict->GetString(kURL, &search_url); | 310 url_dict->GetString(kURL, &search_url); |
273 url_dict->GetString(kKeyword, &keyword); | 311 url_dict->GetString(kKeyword, &keyword); |
274 if (search_url.empty()) | 312 if (search_url.empty() || keyword.empty()) |
275 return false; | 313 return; |
276 if (keyword.empty()) | 314 |
277 keyword = TemplateURLService::GenerateKeyword(GURL(search_url)); | 315 prefs_default_search_.reset(new TemplateURLData); |
278 data->SetKeyword(keyword); | 316 prefs_default_search_->SetKeyword(keyword); |
279 data->SetURL(search_url); | 317 prefs_default_search_->SetURL(search_url); |
280 | 318 |
281 std::string id; | 319 std::string id; |
282 url_dict->GetString(kID, &id); | 320 url_dict->GetString(kID, &id); |
283 base::StringToInt64(id, &data->id); | 321 base::StringToInt64(id, &prefs_default_search_->id); |
284 url_dict->GetString(kShortName, &data->short_name); | 322 url_dict->GetString(kShortName, &prefs_default_search_->short_name); |
285 url_dict->GetInteger(kPrepopulateID, &data->prepopulate_id); | 323 url_dict->GetInteger(kPrepopulateID, &prefs_default_search_->prepopulate_id); |
286 url_dict->GetString(kSyncGUID, &data->sync_guid); | 324 url_dict->GetString(kSyncGUID, &prefs_default_search_->sync_guid); |
287 | 325 |
288 url_dict->GetString(kSuggestionsURL, &data->suggestions_url); | 326 url_dict->GetString(kSuggestionsURL, &prefs_default_search_->suggestions_url); |
289 url_dict->GetString(kInstantURL, &data->instant_url); | 327 url_dict->GetString(kInstantURL, &prefs_default_search_->instant_url); |
290 url_dict->GetString(kImageURL, &data->image_url); | 328 url_dict->GetString(kImageURL, &prefs_default_search_->image_url); |
291 url_dict->GetString(kNewTabURL, &data->new_tab_url); | 329 url_dict->GetString(kNewTabURL, &prefs_default_search_->new_tab_url); |
292 | 330 |
293 std::string favicon_url; | 331 std::string favicon_url; |
294 std::string originating_url; | 332 std::string originating_url; |
295 url_dict->GetString(kFaviconURL, &favicon_url); | 333 url_dict->GetString(kFaviconURL, &favicon_url); |
296 url_dict->GetString(kOriginatingURL, &originating_url); | 334 url_dict->GetString(kOriginatingURL, &originating_url); |
297 data->favicon_url = GURL(favicon_url); | 335 prefs_default_search_->favicon_url = GURL(favicon_url); |
298 data->originating_url = GURL(originating_url); | 336 prefs_default_search_->originating_url = GURL(originating_url); |
299 | 337 |
300 url_dict->GetString(kSearchURLPostParams, &data->search_url_post_params); | 338 url_dict->GetString(kSearchURLPostParams, |
| 339 &prefs_default_search_->search_url_post_params); |
301 url_dict->GetString(kSuggestionsURLPostParams, | 340 url_dict->GetString(kSuggestionsURLPostParams, |
302 &data->suggestions_url_post_params); | 341 &prefs_default_search_->suggestions_url_post_params); |
303 url_dict->GetString(kInstantURLPostParams, &data->instant_url_post_params); | 342 url_dict->GetString(kInstantURLPostParams, |
304 url_dict->GetString(kImageURLPostParams, &data->image_url_post_params); | 343 &prefs_default_search_->instant_url_post_params); |
| 344 url_dict->GetString(kImageURLPostParams, |
| 345 &prefs_default_search_->image_url_post_params); |
305 | 346 |
306 url_dict->GetBoolean(kSafeForAutoReplace, &data->safe_for_autoreplace); | 347 url_dict->GetBoolean(kSafeForAutoReplace, |
| 348 &prefs_default_search_->safe_for_autoreplace); |
307 | 349 |
308 double date_created = 0.0; | 350 double date_created = 0.0; |
309 double last_modified = 0.0; | 351 double last_modified = 0.0; |
310 url_dict->GetDouble(kDateCreated, &date_created); | 352 url_dict->GetDouble(kDateCreated, &date_created); |
311 url_dict->GetDouble(kLastModified, &last_modified); | 353 url_dict->GetDouble(kLastModified, &last_modified); |
312 data->date_created = base::Time::FromInternalValue(date_created); | 354 prefs_default_search_->date_created = |
313 data->last_modified = base::Time::FromInternalValue(last_modified); | 355 base::Time::FromInternalValue(date_created); |
| 356 prefs_default_search_->last_modified = |
| 357 base::Time::FromInternalValue(last_modified); |
314 | 358 |
315 url_dict->GetInteger(kUsageCount, &data->usage_count); | 359 url_dict->GetInteger(kUsageCount, &prefs_default_search_->usage_count); |
316 | 360 |
317 const base::ListValue* alternate_urls; | 361 const base::ListValue* alternate_urls = NULL; |
318 url_dict->GetList(kAlternateURLs, &alternate_urls); | 362 if (url_dict->GetList(kAlternateURLs, &alternate_urls)) { |
319 data->alternate_urls.clear(); | 363 for (base::ListValue::const_iterator it = alternate_urls->begin(); |
320 for (base::ListValue::const_iterator it = alternate_urls->begin(); | 364 it != alternate_urls->end(); |
321 it != alternate_urls->end(); ++it) { | 365 ++it) { |
322 std::string alternate_url; | 366 std::string alternate_url; |
323 if ((*it)->GetAsString(&alternate_url)) | 367 if ((*it)->GetAsString(&alternate_url)) |
324 data->alternate_urls.push_back(alternate_url); | 368 prefs_default_search_->alternate_urls.push_back(alternate_url); |
| 369 } |
325 } | 370 } |
326 | 371 |
327 const base::ListValue* encodings; | 372 const base::ListValue* encodings = NULL; |
328 url_dict->GetList(kInputEncodings, &encodings); | 373 if (url_dict->GetList(kInputEncodings, &encodings)) { |
329 data->input_encodings.clear(); | 374 for (base::ListValue::const_iterator it = encodings->begin(); |
330 for (base::ListValue::const_iterator it = encodings->begin(); | 375 it != encodings->end(); |
331 it != encodings->end(); ++it) { | 376 ++it) { |
332 std::string encoding; | 377 std::string encoding; |
333 if ((*it)->GetAsString(&encoding)) | 378 if ((*it)->GetAsString(&encoding)) |
334 data->input_encodings.push_back(encoding); | 379 prefs_default_search_->input_encodings.push_back(encoding); |
| 380 } |
335 } | 381 } |
336 | 382 |
337 url_dict->GetString(kSearchTermsReplacementKey, | 383 url_dict->GetString(kSearchTermsReplacementKey, |
338 &data->search_terms_replacement_key); | 384 &prefs_default_search_->search_terms_replacement_key); |
339 | 385 |
340 url_dict->GetBoolean(kCreatedByPolicy, &data->created_by_policy); | 386 url_dict->GetBoolean(kCreatedByPolicy, |
| 387 &prefs_default_search_->created_by_policy); |
341 | 388 |
342 data->show_in_default_list = true; | 389 prefs_default_search_->show_in_default_list = true; |
343 *dse_data = data; | 390 MergePrefsDataWithPrepopulated(); |
344 return true; | |
345 } | 391 } |
| 392 |
| 393 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { |
| 394 scoped_ptr<TemplateURLData> data = |
| 395 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); |
| 396 fallback_default_search_ = data.Pass(); |
| 397 MergePrefsDataWithPrepopulated(); |
| 398 } |
| 399 |
| 400 void DefaultSearchManager::NotifyObserver() { |
| 401 if (!change_observer_.is_null()) { |
| 402 Source source = FROM_FALLBACK; |
| 403 TemplateURLData* data = GetDefaultSearchEngine(&source); |
| 404 change_observer_.Run(data, source); |
| 405 } |
| 406 } |
OLD | NEW |