OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/util.h" | 5 #include "chrome/browser/search_engines/util.h" |
6 | 6 |
7 #include <set> | 7 #include <set> |
8 #include <string> | 8 #include <string> |
9 #include <map> | 9 #include <map> |
10 #include <vector> | 10 #include <vector> |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 DCHECK(template_urls->empty()); | 250 DCHECK(template_urls->empty()); |
251 DCHECK(default_search_provider); | 251 DCHECK(default_search_provider); |
252 DCHECK(*default_search_provider == NULL); | 252 DCHECK(*default_search_provider == NULL); |
253 DCHECK_EQ(KEYWORDS_RESULT, result.GetType()); | 253 DCHECK_EQ(KEYWORDS_RESULT, result.GetType()); |
254 DCHECK(new_resource_keyword_version); | 254 DCHECK(new_resource_keyword_version); |
255 | 255 |
256 *new_resource_keyword_version = 0; | 256 *new_resource_keyword_version = 0; |
257 WDKeywordsResult keyword_result = reinterpret_cast< | 257 WDKeywordsResult keyword_result = reinterpret_cast< |
258 const WDResult<WDKeywordsResult>*>(&result)->GetValue(); | 258 const WDResult<WDKeywordsResult>*>(&result)->GetValue(); |
259 | 259 |
260 for (KeywordTable::Keywords::const_iterator i( | 260 for (KeywordTable::Keywords::iterator i(keyword_result.keywords.begin()); |
261 keyword_result.keywords.begin()); i != keyword_result.keywords.end(); | 261 i != keyword_result.keywords.end(); ++i) { |
262 ++i) | 262 // Fix any duplicate encodings in the local database. Note that we don't |
| 263 // adjust the last_modified time of this keyword; this way, we won't later |
| 264 // overwrite any changes on the sync server that happened to this keyword |
| 265 // since the last time we synced. Instead, we also run a de-duping pass on |
| 266 // the server-provided data in |
| 267 // TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData() and |
| 268 // update the server with the merged, de-duped results at that time. We |
| 269 // still fix here, though, to correct problems in clients that have disabled |
| 270 // search engine sync, since in that case that code will never be reached. |
| 271 if (DeDupeEncodings(&i->input_encodings) && service) |
| 272 service->UpdateKeyword(*i); |
263 template_urls->push_back(new TemplateURL(profile, *i)); | 273 template_urls->push_back(new TemplateURL(profile, *i)); |
| 274 } |
264 | 275 |
265 int64 default_search_provider_id = keyword_result.default_search_provider_id; | 276 int64 default_search_provider_id = keyword_result.default_search_provider_id; |
266 if (default_search_provider_id) { | 277 if (default_search_provider_id) { |
267 *default_search_provider = | 278 *default_search_provider = |
268 GetTemplateURLByID(*template_urls, default_search_provider_id); | 279 GetTemplateURLByID(*template_urls, default_search_provider_id); |
269 } | 280 } |
270 | 281 |
271 ScopedVector<TemplateURL> prepopulated_urls; | 282 ScopedVector<TemplateURL> prepopulated_urls; |
272 size_t default_search_index; | 283 size_t default_search_index; |
273 TemplateURLPrepopulateData::GetPrepopulatedEngines(profile, | 284 TemplateURLPrepopulateData::GetPrepopulatedEngines(profile, |
274 &prepopulated_urls.get(), &default_search_index); | 285 &prepopulated_urls.get(), &default_search_index); |
275 RemoveDuplicatePrepopulateIDs(service, prepopulated_urls, | 286 RemoveDuplicatePrepopulateIDs(service, prepopulated_urls, |
276 *default_search_provider, template_urls, | 287 *default_search_provider, template_urls, |
277 removed_keyword_guids); | 288 removed_keyword_guids); |
278 | 289 |
279 const int resource_keyword_version = | 290 const int resource_keyword_version = |
280 TemplateURLPrepopulateData::GetDataVersion( | 291 TemplateURLPrepopulateData::GetDataVersion( |
281 profile ? profile->GetPrefs() : NULL); | 292 profile ? profile->GetPrefs() : NULL); |
282 if (keyword_result.builtin_keyword_version != resource_keyword_version) { | 293 if (keyword_result.builtin_keyword_version != resource_keyword_version) { |
283 MergeEnginesFromPrepopulateData(profile, service, &prepopulated_urls, | 294 MergeEnginesFromPrepopulateData(profile, service, &prepopulated_urls, |
284 default_search_index, template_urls, default_search_provider, | 295 default_search_index, template_urls, default_search_provider, |
285 removed_keyword_guids); | 296 removed_keyword_guids); |
286 *new_resource_keyword_version = resource_keyword_version; | 297 *new_resource_keyword_version = resource_keyword_version; |
287 } | 298 } |
288 } | 299 } |
289 | 300 |
| 301 bool DeDupeEncodings(std::vector<std::string>* encodings) { |
| 302 std::vector<std::string> deduped_encodings; |
| 303 std::set<std::string> encoding_set; |
| 304 for (std::vector<std::string>::const_iterator i(encodings->begin()); |
| 305 i != encodings->end(); ++i) { |
| 306 if (encoding_set.insert(*i).second) |
| 307 deduped_encodings.push_back(*i); |
| 308 } |
| 309 encodings->swap(deduped_encodings); |
| 310 return encodings->size() != deduped_encodings.size(); |
| 311 } |
| 312 |
290 bool DidDefaultSearchProviderChange( | 313 bool DidDefaultSearchProviderChange( |
291 const WDTypedResult& result, | 314 const WDTypedResult& result, |
292 Profile* profile, | 315 Profile* profile, |
293 scoped_ptr<TemplateURL>* backup_default_search_provider) { | 316 scoped_ptr<TemplateURL>* backup_default_search_provider) { |
294 DCHECK(backup_default_search_provider); | 317 DCHECK(backup_default_search_provider); |
295 DCHECK(!backup_default_search_provider->get()); | 318 DCHECK(!backup_default_search_provider->get()); |
296 DCHECK_EQ(result.GetType(), KEYWORDS_RESULT); | 319 DCHECK_EQ(result.GetType(), KEYWORDS_RESULT); |
297 | 320 |
298 WDKeywordsResult keyword_result = reinterpret_cast< | 321 WDKeywordsResult keyword_result = reinterpret_cast< |
299 const WDResult<WDKeywordsResult>*>(&result)->GetValue(); | 322 const WDResult<WDKeywordsResult>*>(&result)->GetValue(); |
300 | 323 |
301 if (!keyword_result.did_default_search_provider_change) | 324 if (!keyword_result.did_default_search_provider_change) |
302 return false; | 325 return false; |
303 | 326 |
304 if (keyword_result.backup_valid) { | 327 if (keyword_result.backup_valid) { |
305 backup_default_search_provider->reset(new TemplateURL(profile, | 328 backup_default_search_provider->reset(new TemplateURL(profile, |
306 keyword_result.default_search_provider_backup)); | 329 keyword_result.default_search_provider_backup)); |
307 } | 330 } |
308 return true; | 331 return true; |
309 } | 332 } |
OLD | NEW |