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); |
108 } | 120 } |
109 | 121 |
110 DefaultSearchManager::Source | 122 TemplateURLData* DefaultSearchManager::GetDefaultSearchEngine( |
Peter Kasting
2014/05/03 00:28:18
Given the number of times you call this just to ge
erikwright (departed)
2014/05/05 01:49:38
It makes sense to have a single function calculate
| |
111 DefaultSearchManager::GetDefaultSearchEngineSource() const { | 123 Source* source) const { |
112 if (default_search_controlled_by_policy_) | 124 if (default_search_controlled_by_policy_) { |
113 return FROM_POLICY; | 125 if (source) |
114 if (extension_default_search_) | 126 *source = FROM_POLICY; |
115 return FROM_EXTENSION; | 127 return prefs_default_search_.get(); |
116 if (prefs_default_search_) | 128 } |
117 return FROM_USER; | 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 } | |
118 | 139 |
119 return FROM_FALLBACK; | 140 if (source) |
120 } | 141 *source = FROM_FALLBACK; |
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(); | 142 return fallback_default_search_.get(); |
131 } | 143 } |
132 | 144 |
133 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( | 145 void DefaultSearchManager::SetUserSelectedDefaultSearchEngine( |
134 const TemplateURLData& data) { | 146 const TemplateURLData& data) { |
147 if (!pref_service_) { | |
148 prefs_default_search_.reset(new TemplateURLData(data)); | |
149 MergePrefsDataWithPrepopulated(); | |
150 NotifyObserver(); | |
151 return; | |
152 } | |
153 | |
135 base::DictionaryValue url_dict; | 154 base::DictionaryValue url_dict; |
136 url_dict.SetString(kID, base::Int64ToString(data.id)); | 155 url_dict.SetString(kID, base::Int64ToString(data.id)); |
137 url_dict.SetString(kShortName, data.short_name); | 156 url_dict.SetString(kShortName, data.short_name); |
138 url_dict.SetString(kKeyword, data.keyword()); | 157 url_dict.SetString(kKeyword, data.keyword()); |
139 url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); | 158 url_dict.SetInteger(kPrepopulateID, data.prepopulate_id); |
140 url_dict.SetString(kSyncGUID, data.sync_guid); | 159 url_dict.SetString(kSyncGUID, data.sync_guid); |
141 | 160 |
142 url_dict.SetString(kURL, data.url()); | 161 url_dict.SetString(kURL, data.url()); |
143 url_dict.SetString(kSuggestionsURL, data.suggestions_url); | 162 url_dict.SetString(kSuggestionsURL, data.suggestions_url); |
144 url_dict.SetString(kInstantURL, data.instant_url); | 163 url_dict.SetString(kInstantURL, data.instant_url); |
(...skipping 10 matching lines...) Expand all Loading... | |
155 | 174 |
156 url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); | 175 url_dict.SetBoolean(kSafeForAutoReplace, data.safe_for_autoreplace); |
157 | 176 |
158 url_dict.SetDouble(kDateCreated, data.date_created.ToInternalValue()); | 177 url_dict.SetDouble(kDateCreated, data.date_created.ToInternalValue()); |
159 url_dict.SetDouble(kLastModified, data.last_modified.ToInternalValue()); | 178 url_dict.SetDouble(kLastModified, data.last_modified.ToInternalValue()); |
160 url_dict.SetInteger(kUsageCount, data.usage_count); | 179 url_dict.SetInteger(kUsageCount, data.usage_count); |
161 | 180 |
162 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); | 181 scoped_ptr<base::ListValue> alternate_urls(new base::ListValue); |
163 for (std::vector<std::string>::const_iterator it = | 182 for (std::vector<std::string>::const_iterator it = |
164 data.alternate_urls.begin(); | 183 data.alternate_urls.begin(); |
165 it != data.alternate_urls.end(); | 184 it != data.alternate_urls.end(); ++it) { |
166 ++it) { | |
167 alternate_urls->AppendString(*it); | 185 alternate_urls->AppendString(*it); |
168 } | 186 } |
169 url_dict.Set(kAlternateURLs, alternate_urls.release()); | 187 url_dict.Set(kAlternateURLs, alternate_urls.release()); |
170 | 188 |
171 scoped_ptr<base::ListValue> encodings(new base::ListValue); | 189 scoped_ptr<base::ListValue> encodings(new base::ListValue); |
172 for (std::vector<std::string>::const_iterator it = | 190 for (std::vector<std::string>::const_iterator it = |
173 data.input_encodings.begin(); | 191 data.input_encodings.begin(); |
174 it != data.input_encodings.end(); | 192 it != data.input_encodings.end(); ++it) { |
175 ++it) { | |
176 encodings->AppendString(*it); | 193 encodings->AppendString(*it); |
177 } | 194 } |
178 url_dict.Set(kInputEncodings, encodings.release()); | 195 url_dict.Set(kInputEncodings, encodings.release()); |
179 | 196 |
180 url_dict.SetString(kSearchTermsReplacementKey, | 197 url_dict.SetString(kSearchTermsReplacementKey, |
181 data.search_terms_replacement_key); | 198 data.search_terms_replacement_key); |
182 | 199 |
183 url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); | 200 url_dict.SetBoolean(kCreatedByPolicy, data.created_by_policy); |
184 | 201 |
185 pref_service_->Set(kDefaultSearchProviderData, url_dict); | 202 pref_service_->Set(kDefaultSearchProviderDataPrefName, url_dict); |
186 } | 203 } |
187 | 204 |
188 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( | 205 void DefaultSearchManager::SetExtensionControlledDefaultSearchEngine( |
189 TemplateURLData* data) { | 206 TemplateURLData* data) { |
207 DCHECK(data); | |
208 Source old_source = FROM_FALLBACK; | |
Peter Kasting
2014/05/03 00:28:18
Nit: I think initting this before the call, when t
erikwright (departed)
2014/05/05 01:49:38
Done.
| |
209 GetDefaultSearchEngine(&old_source); | |
190 extension_default_search_.reset(data); | 210 extension_default_search_.reset(data); |
211 if (old_source <= FROM_EXTENSION) | |
Peter Kasting
2014/05/03 00:28:18
This implies that the Source values are in sorted
erikwright (departed)
2014/05/05 01:49:38
Done.
| |
212 NotifyObserver(); | |
191 } | 213 } |
192 | 214 |
193 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { | 215 void DefaultSearchManager::ClearExtensionControlledDefaultSearchEngine() { |
216 Source old_source = FROM_FALLBACK; | |
217 GetDefaultSearchEngine(&old_source); | |
194 extension_default_search_.reset(); | 218 extension_default_search_.reset(); |
219 if (old_source == FROM_EXTENSION) | |
220 NotifyObserver(); | |
195 } | 221 } |
196 | 222 |
197 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { | 223 void DefaultSearchManager::ClearUserSelectedDefaultSearchEngine() { |
198 pref_service_->ClearPref(kDefaultSearchProviderData); | 224 if (pref_service_) { |
225 pref_service_->ClearPref(kDefaultSearchProviderDataPrefName); | |
226 } else { | |
227 prefs_default_search_.reset(); | |
228 NotifyObserver(); | |
229 } | |
199 } | 230 } |
200 | 231 |
201 void DefaultSearchManager::OnDefaultSearchPrefChanged() { | 232 void DefaultSearchManager::OnDefaultSearchPrefChanged() { |
202 TemplateURLData* data; | 233 Source old_source = FROM_FALLBACK; |
203 if (ReadDefaultSearchEngineFromPrefs(&data)) { | 234 GetDefaultSearchEngine(&old_source); |
204 prefs_default_search_.reset(data); | 235 LoadDefaultSearchEngineFromPrefs(); |
205 MergePrefsDataWithPrepopulated(); | 236 |
237 if (old_source == FROM_USER || old_source == FROM_POLICY) { | |
238 NotifyObserver(); | |
206 } else { | 239 } else { |
207 prefs_default_search_.reset(); | 240 Source new_source = FROM_FALLBACK; |
241 GetDefaultSearchEngine(&new_source); | |
242 if (new_source == FROM_USER || new_source == FROM_POLICY) | |
243 NotifyObserver(); | |
208 } | 244 } |
Peter Kasting
2014/05/03 00:28:18
Nit: Simpler:
Source source;
GetDefaultSearch
erikwright (departed)
2014/05/05 01:49:38
Done.
| |
209 UpdatePolicyStatus(); | |
210 } | 245 } |
211 | 246 |
212 void DefaultSearchManager::OnOverridesPrefChanged() { | 247 void DefaultSearchManager::OnOverridesPrefChanged() { |
213 scoped_ptr<TemplateURLData> data = | 248 LoadPrepopulatedDefaultSearch(); |
214 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | |
215 fallback_default_search_ = data.Pass(); | |
216 MergePrefsDataWithPrepopulated(); | |
217 } | |
218 | 249 |
219 void DefaultSearchManager::UpdatePolicyStatus() { | 250 TemplateURLData* effective_data = GetDefaultSearchEngine(NULL); |
220 const PrefService::Preference* pref = | 251 if (effective_data && effective_data->prepopulate_id) { |
221 pref_service_->FindPreference(kDefaultSearchProviderData); | 252 // A user-selected, policy-selected or fallback pre-populated engine is |
222 default_search_controlled_by_policy_ = pref && pref->IsManaged(); | 253 // active and may have changed with this event. |
254 NotifyObserver(); | |
255 } | |
223 } | 256 } |
224 | 257 |
225 void DefaultSearchManager::MergePrefsDataWithPrepopulated() { | 258 void DefaultSearchManager::MergePrefsDataWithPrepopulated() { |
226 if (!prefs_default_search_ || !prefs_default_search_->prepopulate_id) | 259 if (!prefs_default_search_ || !prefs_default_search_->prepopulate_id) |
227 return; | 260 return; |
228 | 261 |
229 size_t default_search_index; | 262 size_t default_search_index; |
230 ScopedVector<TemplateURLData> prepopulated_urls = | 263 ScopedVector<TemplateURLData> prepopulated_urls = |
231 TemplateURLPrepopulateData::GetPrepopulatedEngines(pref_service_, | 264 TemplateURLPrepopulateData::GetPrepopulatedEngines( |
232 &default_search_index); | 265 pref_service_, &default_search_index); |
Peter Kasting
2014/05/03 00:28:18
Nit: Indenting is wrong (3 instead of 4) -- I woul
erikwright (departed)
2014/05/05 01:49:38
Done.
| |
233 | 266 |
234 for (size_t i = 0; i < prepopulated_urls.size(); ++i) { | 267 for (size_t i = 0; i < prepopulated_urls.size(); ++i) { |
235 if (prepopulated_urls[i]->prepopulate_id == | 268 if (prepopulated_urls[i]->prepopulate_id == |
236 prefs_default_search_->prepopulate_id) { | 269 prefs_default_search_->prepopulate_id) { |
237 if (!prefs_default_search_->safe_for_autoreplace) { | 270 if (!prefs_default_search_->safe_for_autoreplace) { |
238 prepopulated_urls[i]->safe_for_autoreplace = false; | 271 prepopulated_urls[i]->safe_for_autoreplace = false; |
239 prepopulated_urls[i]->SetKeyword(prefs_default_search_->keyword()); | 272 prepopulated_urls[i]->SetKeyword(prefs_default_search_->keyword()); |
240 prepopulated_urls[i]->short_name = prefs_default_search_->short_name; | 273 prepopulated_urls[i]->short_name = prefs_default_search_->short_name; |
241 } | 274 } |
242 prepopulated_urls[i]->id = prefs_default_search_->id; | 275 prepopulated_urls[i]->id = prefs_default_search_->id; |
243 prepopulated_urls[i]->sync_guid = prefs_default_search_->sync_guid; | 276 prepopulated_urls[i]->sync_guid = prefs_default_search_->sync_guid; |
244 prepopulated_urls[i]->date_created = prefs_default_search_->date_created; | 277 prepopulated_urls[i]->date_created = prefs_default_search_->date_created; |
245 prepopulated_urls[i]->last_modified = | 278 prepopulated_urls[i]->last_modified = |
246 prefs_default_search_->last_modified; | 279 prefs_default_search_->last_modified; |
247 prefs_default_search_.reset(prepopulated_urls[i]); | 280 prefs_default_search_.reset(prepopulated_urls[i]); |
248 prepopulated_urls.weak_erase(prepopulated_urls.begin() + i); | |
Peter Kasting
2014/05/03 00:28:18
Doesn't removing this line result in the URL being
| |
249 return; | 281 return; |
250 } | 282 } |
251 } | 283 } |
252 } | 284 } |
253 | 285 |
254 bool DefaultSearchManager::ReadDefaultSearchEngineFromPrefs( | 286 void DefaultSearchManager::LoadDefaultSearchEngineFromPrefs() { |
255 TemplateURLData** dse_data) { | 287 if (!pref_service_) |
288 return; | |
289 | |
290 prefs_default_search_.reset(); | |
291 default_search_controlled_by_policy_ = | |
292 IsDefaultSearchProviderManaged(pref_service_); | |
293 | |
256 const base::DictionaryValue* url_dict = | 294 const base::DictionaryValue* url_dict = |
257 pref_service_->GetDictionary(kDefaultSearchProviderData); | 295 pref_service_->GetDictionary(kDefaultSearchProviderDataPrefName); |
296 if (url_dict->empty()) | |
297 return; | |
258 | 298 |
259 if (url_dict->empty()) | 299 if (default_search_controlled_by_policy_) { |
260 return false; | 300 bool disabled_by_policy = false; |
261 | 301 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && |
262 bool disabled_by_policy = false; | 302 disabled_by_policy) { |
Peter Kasting
2014/05/03 00:28:18
Nit: No {}
erikwright (departed)
2014/05/05 01:49:38
Done.
| |
263 if (url_dict->GetBoolean(kDisabledByPolicy, &disabled_by_policy) && | 303 return; |
264 disabled_by_policy) { | 304 } |
265 *dse_data = NULL; | |
266 return true; | |
267 } | 305 } |
268 | 306 |
269 TemplateURLData* data = new TemplateURLData(); | |
270 std::string search_url; | 307 std::string search_url; |
271 base::string16 keyword; | 308 base::string16 keyword; |
272 url_dict->GetString(kURL, &search_url); | 309 url_dict->GetString(kURL, &search_url); |
273 url_dict->GetString(kKeyword, &keyword); | 310 url_dict->GetString(kKeyword, &keyword); |
274 if (search_url.empty()) | 311 if (search_url.empty() || keyword.empty()) |
275 return false; | 312 return; |
276 if (keyword.empty()) | 313 |
277 keyword = TemplateURLService::GenerateKeyword(GURL(search_url)); | 314 prefs_default_search_.reset(new TemplateURLData); |
278 data->SetKeyword(keyword); | 315 prefs_default_search_->SetKeyword(keyword); |
279 data->SetURL(search_url); | 316 prefs_default_search_->SetURL(search_url); |
280 | 317 |
281 std::string id; | 318 std::string id; |
282 url_dict->GetString(kID, &id); | 319 url_dict->GetString(kID, &id); |
283 base::StringToInt64(id, &data->id); | 320 base::StringToInt64(id, &prefs_default_search_->id); |
284 url_dict->GetString(kShortName, &data->short_name); | 321 url_dict->GetString(kShortName, &prefs_default_search_->short_name); |
285 url_dict->GetInteger(kPrepopulateID, &data->prepopulate_id); | 322 url_dict->GetInteger(kPrepopulateID, &prefs_default_search_->prepopulate_id); |
286 url_dict->GetString(kSyncGUID, &data->sync_guid); | 323 url_dict->GetString(kSyncGUID, &prefs_default_search_->sync_guid); |
287 | 324 |
288 url_dict->GetString(kSuggestionsURL, &data->suggestions_url); | 325 url_dict->GetString(kSuggestionsURL, &prefs_default_search_->suggestions_url); |
289 url_dict->GetString(kInstantURL, &data->instant_url); | 326 url_dict->GetString(kInstantURL, &prefs_default_search_->instant_url); |
290 url_dict->GetString(kImageURL, &data->image_url); | 327 url_dict->GetString(kImageURL, &prefs_default_search_->image_url); |
291 url_dict->GetString(kNewTabURL, &data->new_tab_url); | 328 url_dict->GetString(kNewTabURL, &prefs_default_search_->new_tab_url); |
292 | 329 |
293 std::string favicon_url; | 330 std::string favicon_url; |
294 std::string originating_url; | 331 std::string originating_url; |
295 url_dict->GetString(kFaviconURL, &favicon_url); | 332 url_dict->GetString(kFaviconURL, &favicon_url); |
296 url_dict->GetString(kOriginatingURL, &originating_url); | 333 url_dict->GetString(kOriginatingURL, &originating_url); |
297 data->favicon_url = GURL(favicon_url); | 334 prefs_default_search_->favicon_url = GURL(favicon_url); |
298 data->originating_url = GURL(originating_url); | 335 prefs_default_search_->originating_url = GURL(originating_url); |
299 | 336 |
300 url_dict->GetString(kSearchURLPostParams, &data->search_url_post_params); | 337 url_dict->GetString(kSearchURLPostParams, |
338 &prefs_default_search_->search_url_post_params); | |
301 url_dict->GetString(kSuggestionsURLPostParams, | 339 url_dict->GetString(kSuggestionsURLPostParams, |
302 &data->suggestions_url_post_params); | 340 &prefs_default_search_->suggestions_url_post_params); |
303 url_dict->GetString(kInstantURLPostParams, &data->instant_url_post_params); | 341 url_dict->GetString(kInstantURLPostParams, |
304 url_dict->GetString(kImageURLPostParams, &data->image_url_post_params); | 342 &prefs_default_search_->instant_url_post_params); |
343 url_dict->GetString(kImageURLPostParams, | |
344 &prefs_default_search_->image_url_post_params); | |
305 | 345 |
306 url_dict->GetBoolean(kSafeForAutoReplace, &data->safe_for_autoreplace); | 346 url_dict->GetBoolean(kSafeForAutoReplace, |
347 &prefs_default_search_->safe_for_autoreplace); | |
307 | 348 |
308 double date_created = 0.0; | 349 double date_created = 0.0; |
309 double last_modified = 0.0; | 350 double last_modified = 0.0; |
310 url_dict->GetDouble(kDateCreated, &date_created); | 351 url_dict->GetDouble(kDateCreated, &date_created); |
311 url_dict->GetDouble(kLastModified, &last_modified); | 352 url_dict->GetDouble(kLastModified, &last_modified); |
312 data->date_created = base::Time::FromInternalValue(date_created); | 353 prefs_default_search_->date_created = |
313 data->last_modified = base::Time::FromInternalValue(last_modified); | 354 base::Time::FromInternalValue(date_created); |
355 prefs_default_search_->last_modified = | |
356 base::Time::FromInternalValue(last_modified); | |
314 | 357 |
315 url_dict->GetInteger(kUsageCount, &data->usage_count); | 358 url_dict->GetInteger(kUsageCount, &prefs_default_search_->usage_count); |
316 | 359 |
317 const base::ListValue* alternate_urls; | 360 const base::ListValue* alternate_urls = NULL; |
318 url_dict->GetList(kAlternateURLs, &alternate_urls); | 361 if (url_dict->GetList(kAlternateURLs, &alternate_urls)) { |
319 data->alternate_urls.clear(); | 362 for (base::ListValue::const_iterator it = alternate_urls->begin(); |
320 for (base::ListValue::const_iterator it = alternate_urls->begin(); | 363 it != alternate_urls->end(); |
321 it != alternate_urls->end(); ++it) { | 364 ++it) { |
322 std::string alternate_url; | 365 std::string alternate_url; |
323 if ((*it)->GetAsString(&alternate_url)) | 366 if ((*it)->GetAsString(&alternate_url)) |
324 data->alternate_urls.push_back(alternate_url); | 367 prefs_default_search_->alternate_urls.push_back(alternate_url); |
368 } | |
325 } | 369 } |
326 | 370 |
327 const base::ListValue* encodings; | 371 const base::ListValue* encodings = NULL; |
328 url_dict->GetList(kInputEncodings, &encodings); | 372 if (url_dict->GetList(kInputEncodings, &encodings)) { |
329 data->input_encodings.clear(); | 373 for (base::ListValue::const_iterator it = encodings->begin(); |
330 for (base::ListValue::const_iterator it = encodings->begin(); | 374 it != encodings->end(); |
331 it != encodings->end(); ++it) { | 375 ++it) { |
332 std::string encoding; | 376 std::string encoding; |
333 if ((*it)->GetAsString(&encoding)) | 377 if ((*it)->GetAsString(&encoding)) |
334 data->input_encodings.push_back(encoding); | 378 prefs_default_search_->input_encodings.push_back(encoding); |
379 } | |
335 } | 380 } |
336 | 381 |
337 url_dict->GetString(kSearchTermsReplacementKey, | 382 url_dict->GetString(kSearchTermsReplacementKey, |
338 &data->search_terms_replacement_key); | 383 &prefs_default_search_->search_terms_replacement_key); |
339 | 384 |
340 url_dict->GetBoolean(kCreatedByPolicy, &data->created_by_policy); | 385 url_dict->GetBoolean(kCreatedByPolicy, |
386 &prefs_default_search_->created_by_policy); | |
341 | 387 |
342 data->show_in_default_list = true; | 388 prefs_default_search_->show_in_default_list = true; |
343 *dse_data = data; | 389 MergePrefsDataWithPrepopulated(); |
344 return true; | |
345 } | 390 } |
391 | |
392 void DefaultSearchManager::LoadPrepopulatedDefaultSearch() { | |
393 scoped_ptr<TemplateURLData> data = | |
394 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(pref_service_); | |
395 fallback_default_search_ = data.Pass(); | |
396 MergePrefsDataWithPrepopulated(); | |
397 } | |
398 | |
399 void DefaultSearchManager::NotifyObserver() { | |
400 if (!change_observer_.is_null()) { | |
401 Source source = FROM_FALLBACK; | |
402 TemplateURLData* data = GetDefaultSearchEngine(&source); | |
403 change_observer_.Run(data, source); | |
404 } | |
405 } | |
OLD | NEW |