Chromium Code Reviews| 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/template_url_service.h" | 5 #include "components/search_engines/template_url_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/auto_reset.h" | 10 #include "base/auto_reset.h" |
| 11 #include "base/command_line.h" | 11 #include "base/command_line.h" |
| 12 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 13 #include "base/guid.h" | 13 #include "base/guid.h" |
| 14 #include "base/i18n/case_conversion.h" | 14 #include "base/i18n/case_conversion.h" |
| 15 #include "base/memory/ptr_util.h" | |
| 15 #include "base/memory/scoped_vector.h" | 16 #include "base/memory/scoped_vector.h" |
| 16 #include "base/metrics/histogram_macros.h" | 17 #include "base/metrics/histogram_macros.h" |
| 17 #include "base/profiler/scoped_tracker.h" | 18 #include "base/profiler/scoped_tracker.h" |
| 18 #include "base/stl_util.h" | |
| 19 #include "base/strings/string_split.h" | 19 #include "base/strings/string_split.h" |
| 20 #include "base/strings/string_util.h" | 20 #include "base/strings/string_util.h" |
| 21 #include "base/strings/utf_string_conversions.h" | 21 #include "base/strings/utf_string_conversions.h" |
| 22 #include "base/time/default_clock.h" | 22 #include "base/time/default_clock.h" |
| 23 #include "base/time/time.h" | 23 #include "base/time/time.h" |
| 24 #include "components/omnibox/browser/omnibox_field_trial.h" | 24 #include "components/omnibox/browser/omnibox_field_trial.h" |
| 25 #include "components/pref_registry/pref_registry_syncable.h" | 25 #include "components/pref_registry/pref_registry_syncable.h" |
| 26 #include "components/prefs/pref_service.h" | 26 #include "components/prefs/pref_service.h" |
| 27 #include "components/rappor/rappor_service.h" | 27 #include "components/rappor/rappor_service.h" |
| 28 #include "components/search_engines/search_engines_pref_names.h" | 28 #include "components/search_engines/search_engines_pref_names.h" |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 const TemplateURL* turl) { | 175 const TemplateURL* turl) { |
| 176 if (OmniboxFieldTrial::KeywordRequiresRegistry()) | 176 if (OmniboxFieldTrial::KeywordRequiresRegistry()) |
| 177 return keyword.length(); | 177 return keyword.length(); |
| 178 const size_t registry_length = GetRegistryLength(keyword); | 178 const size_t registry_length = GetRegistryLength(keyword); |
| 179 if (registry_length == std::string::npos) | 179 if (registry_length == std::string::npos) |
| 180 return keyword.length(); | 180 return keyword.length(); |
| 181 DCHECK_LT(registry_length, keyword.length()); | 181 DCHECK_LT(registry_length, keyword.length()); |
| 182 // The meaningful keyword length is the length of any portion before the | 182 // The meaningful keyword length is the length of any portion before the |
| 183 // registry ("co.uk") and its preceding dot. | 183 // registry ("co.uk") and its preceding dot. |
| 184 return keyword.length() - (registry_length ? (registry_length + 1) : 0); | 184 return keyword.length() - (registry_length ? (registry_length + 1) : 0); |
| 185 } | |
| 185 | 186 |
| 187 bool Contains(TemplateURLService::OwnedTemplateURLVector* template_urls, | |
| 188 TemplateURL* turl) { | |
| 189 return FindTemplateURL(template_urls, turl) != template_urls->end(); | |
| 186 } | 190 } |
| 187 | 191 |
| 188 } // namespace | 192 } // namespace |
| 189 | 193 |
| 190 // TemplateURLService::LessWithPrefix ----------------------------------------- | 194 // TemplateURLService::LessWithPrefix ----------------------------------------- |
| 191 | 195 |
| 192 class TemplateURLService::LessWithPrefix { | 196 class TemplateURLService::LessWithPrefix { |
| 193 public: | 197 public: |
| 194 // We want to find the set of keywords that begin with a prefix. The STL | 198 // We want to find the set of keywords that begin with a prefix. The STL |
| 195 // algorithms will return the set of elements that are "equal to" the | 199 // algorithms will return the set of elements that are "equal to" the |
| 196 // prefix, where "equal(x, y)" means "!(cmp(x, y) || cmp(y, x))". When | 200 // prefix, where "equal(x, y)" means "!(cmp(x, y) || cmp(y, x))". When |
| 197 // cmp() is the typical std::less<>, this results in lexicographic equality; | 201 // cmp() is the typical std::less<>, this results in lexicographic equality; |
| 198 // we need to extend this to mark a prefix as "not less than" a keyword it | 202 // we need to extend this to mark a prefix as "not less than" a keyword it |
| 199 // begins, which will cause the desired elements to be considered "equal to" | 203 // begins, which will cause the desired elements to be considered "equal to" |
| 200 // the prefix. Note: this is still a strict weak ordering, as required by | 204 // the prefix. Note: this is still a strict weak ordering, as required by |
| 201 // equal_range() (though I will not prove that here). | 205 // equal_range() (though I will not prove that here). |
| 202 // | 206 // |
| 203 // Unfortunately the calling convention is not "prefix and element" but | 207 // Unfortunately the calling convention is not "prefix and element" but |
| 204 // rather "two elements", so we pass the prefix as a fake "element" which has | 208 // rather "two elements", so we pass the prefix as a fake "element" which has |
| 205 // a NULL KeywordDataElement pointer. | 209 // a NULL KeywordDataElement pointer. |
| 206 bool operator()( | 210 bool operator()( |
| 207 const KeywordToTURLAndMeaningfulLength::value_type& elem1, | 211 const KeywordToTURLAndMeaningfulLength::value_type& elem1, |
| 208 const KeywordToTURLAndMeaningfulLength::value_type& elem2) const { | 212 const KeywordToTURLAndMeaningfulLength::value_type& elem2) const { |
| 209 return (elem1.second.first == NULL) ? | 213 return (elem1.second.first == nullptr) |
| 210 (elem2.first.compare(0, elem1.first.length(), elem1.first) > 0) : | 214 ? (elem2.first.compare(0, elem1.first.length(), elem1.first) > 0) |
| 211 (elem1.first < elem2.first); | 215 : (elem1.first < elem2.first); |
| 212 } | 216 } |
| 213 }; | 217 }; |
| 214 | 218 |
| 215 | 219 |
| 216 // TemplateURLService --------------------------------------------------------- | 220 // TemplateURLService --------------------------------------------------------- |
| 217 | 221 |
| 218 TemplateURLService::TemplateURLService( | 222 TemplateURLService::TemplateURLService( |
| 219 PrefService* prefs, | 223 PrefService* prefs, |
| 220 std::unique_ptr<SearchTermsData> search_terms_data, | 224 std::unique_ptr<SearchTermsData> search_terms_data, |
| 221 const scoped_refptr<KeywordWebDataService>& web_data_service, | 225 const scoped_refptr<KeywordWebDataService>& web_data_service, |
| 222 std::unique_ptr<TemplateURLServiceClient> client, | 226 std::unique_ptr<TemplateURLServiceClient> client, |
| 223 GoogleURLTracker* google_url_tracker, | 227 GoogleURLTracker* google_url_tracker, |
| 224 rappor::RapporService* rappor_service, | 228 rappor::RapporService* rappor_service, |
| 225 const base::Closure& dsp_change_callback) | 229 const base::Closure& dsp_change_callback) |
| 226 : prefs_(prefs), | 230 : prefs_(prefs), |
| 227 search_terms_data_(std::move(search_terms_data)), | 231 search_terms_data_(std::move(search_terms_data)), |
| 228 web_data_service_(web_data_service), | 232 web_data_service_(web_data_service), |
| 229 client_(std::move(client)), | 233 client_(std::move(client)), |
| 230 google_url_tracker_(google_url_tracker), | 234 google_url_tracker_(google_url_tracker), |
| 231 rappor_service_(rappor_service), | 235 rappor_service_(rappor_service), |
| 232 dsp_change_callback_(dsp_change_callback), | 236 dsp_change_callback_(dsp_change_callback), |
| 233 provider_map_(new SearchHostToURLsMap), | 237 provider_map_(new SearchHostToURLsMap), |
| 234 loaded_(false), | 238 loaded_(false), |
| 235 load_failed_(false), | 239 load_failed_(false), |
| 236 disable_load_(false), | 240 disable_load_(false), |
| 237 load_handle_(0), | 241 load_handle_(0), |
| 238 default_search_provider_(NULL), | 242 default_search_provider_(nullptr), |
| 239 next_id_(kInvalidTemplateURLID + 1), | 243 next_id_(kInvalidTemplateURLID + 1), |
| 240 clock_(new base::DefaultClock), | 244 clock_(new base::DefaultClock), |
| 241 models_associated_(false), | 245 models_associated_(false), |
| 242 processing_syncer_changes_(false), | 246 processing_syncer_changes_(false), |
| 243 dsp_change_origin_(DSP_CHANGE_OTHER), | 247 dsp_change_origin_(DSP_CHANGE_OTHER), |
| 244 default_search_manager_( | 248 default_search_manager_( |
| 245 prefs_, | 249 prefs_, |
| 246 base::Bind(&TemplateURLService::OnDefaultSearchChange, | 250 base::Bind(&TemplateURLService::OnDefaultSearchChange, |
| 247 base::Unretained(this))) { | 251 base::Unretained(this))) { |
| 248 DCHECK(search_terms_data_); | 252 DCHECK(search_terms_data_); |
| 249 Init(NULL, 0); | 253 Init(nullptr, 0); |
| 250 } | 254 } |
| 251 | 255 |
| 252 TemplateURLService::TemplateURLService(const Initializer* initializers, | 256 TemplateURLService::TemplateURLService(const Initializer* initializers, |
| 253 const int count) | 257 const int count) |
| 254 : prefs_(NULL), | 258 : prefs_(nullptr), |
| 255 search_terms_data_(new SearchTermsData), | 259 search_terms_data_(new SearchTermsData), |
| 256 web_data_service_(NULL), | 260 web_data_service_(nullptr), |
| 257 google_url_tracker_(NULL), | 261 google_url_tracker_(nullptr), |
| 258 rappor_service_(NULL), | 262 rappor_service_(nullptr), |
| 259 provider_map_(new SearchHostToURLsMap), | 263 provider_map_(new SearchHostToURLsMap), |
| 260 loaded_(false), | 264 loaded_(false), |
| 261 load_failed_(false), | 265 load_failed_(false), |
| 262 disable_load_(false), | 266 disable_load_(false), |
| 263 load_handle_(0), | 267 load_handle_(0), |
| 264 default_search_provider_(NULL), | 268 default_search_provider_(nullptr), |
| 265 next_id_(kInvalidTemplateURLID + 1), | 269 next_id_(kInvalidTemplateURLID + 1), |
| 266 clock_(new base::DefaultClock), | 270 clock_(new base::DefaultClock), |
| 267 models_associated_(false), | 271 models_associated_(false), |
| 268 processing_syncer_changes_(false), | 272 processing_syncer_changes_(false), |
| 269 dsp_change_origin_(DSP_CHANGE_OTHER), | 273 dsp_change_origin_(DSP_CHANGE_OTHER), |
| 270 default_search_manager_( | 274 default_search_manager_( |
| 271 prefs_, | 275 prefs_, |
| 272 base::Bind(&TemplateURLService::OnDefaultSearchChange, | 276 base::Bind(&TemplateURLService::OnDefaultSearchChange, |
| 273 base::Unretained(this))) { | 277 base::Unretained(this))) { |
| 274 Init(initializers, count); | 278 Init(initializers, count); |
| 275 } | 279 } |
| 276 | 280 |
| 277 TemplateURLService::~TemplateURLService() { | 281 TemplateURLService::~TemplateURLService() { |
| 278 // |web_data_service_| should be deleted during Shutdown(). | 282 // |web_data_service_| should be deleted during Shutdown(). |
| 279 DCHECK(!web_data_service_.get()); | 283 DCHECK(!web_data_service_.get()); |
| 280 base::STLDeleteElements(&template_urls_); | |
| 281 } | 284 } |
| 282 | 285 |
| 283 // static | 286 // static |
| 284 void TemplateURLService::RegisterProfilePrefs( | 287 void TemplateURLService::RegisterProfilePrefs( |
| 285 user_prefs::PrefRegistrySyncable* registry) { | 288 user_prefs::PrefRegistrySyncable* registry) { |
| 286 #if defined(OS_IOS) || defined(OS_ANDROID) | 289 #if defined(OS_IOS) || defined(OS_ANDROID) |
| 287 uint32_t flags = PrefRegistry::NO_REGISTRATION_FLAGS; | 290 uint32_t flags = PrefRegistry::NO_REGISTRATION_FLAGS; |
| 288 #else | 291 #else |
| 289 uint32_t flags = user_prefs::PrefRegistrySyncable::SYNCABLE_PREF; | 292 uint32_t flags = user_prefs::PrefRegistrySyncable::SYNCABLE_PREF; |
| 290 #endif | 293 #endif |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 403 keyword_domain_to_turl_and_length_, prefix, supports_replacement_only, | 406 keyword_domain_to_turl_and_length_, prefix, supports_replacement_only, |
| 404 matches); | 407 matches); |
| 405 } | 408 } |
| 406 | 409 |
| 407 TemplateURL* TemplateURLService::GetTemplateURLForKeyword( | 410 TemplateURL* TemplateURLService::GetTemplateURLForKeyword( |
| 408 const base::string16& keyword) { | 411 const base::string16& keyword) { |
| 409 KeywordToTURLAndMeaningfulLength::const_iterator elem( | 412 KeywordToTURLAndMeaningfulLength::const_iterator elem( |
| 410 keyword_to_turl_and_length_.find(keyword)); | 413 keyword_to_turl_and_length_.find(keyword)); |
| 411 if (elem != keyword_to_turl_and_length_.end()) | 414 if (elem != keyword_to_turl_and_length_.end()) |
| 412 return elem->second.first; | 415 return elem->second.first; |
| 413 return (!loaded_ && | 416 return (!loaded_ && initial_default_search_provider_.get() && |
|
Peter Kasting
2016/08/31 04:12:56
Nit: Can this .get() be removed?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 414 initial_default_search_provider_.get() && | 417 (initial_default_search_provider_->keyword() == keyword)) |
| 415 (initial_default_search_provider_->keyword() == keyword)) ? | 418 ? initial_default_search_provider_.get() |
| 416 initial_default_search_provider_.get() : NULL; | 419 : nullptr; |
| 417 } | 420 } |
| 418 | 421 |
| 419 TemplateURL* TemplateURLService::GetTemplateURLForGUID( | 422 TemplateURL* TemplateURLService::GetTemplateURLForGUID( |
| 420 const std::string& sync_guid) { | 423 const std::string& sync_guid) { |
| 421 GUIDToTURL::const_iterator elem(guid_to_turl_.find(sync_guid)); | 424 GUIDToTURL::const_iterator elem(guid_to_turl_.find(sync_guid)); |
| 422 if (elem != guid_to_turl_.end()) | 425 if (elem != guid_to_turl_.end()) |
| 423 return elem->second; | 426 return elem->second; |
| 424 return (!loaded_ && | 427 return (!loaded_ && initial_default_search_provider_.get() && |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Can this .get() be removed?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 425 initial_default_search_provider_.get() && | 428 (initial_default_search_provider_->sync_guid() == sync_guid)) |
| 426 (initial_default_search_provider_->sync_guid() == sync_guid)) ? | 429 ? initial_default_search_provider_.get() |
| 427 initial_default_search_provider_.get() : NULL; | 430 : nullptr; |
| 428 } | 431 } |
| 429 | 432 |
| 430 TemplateURL* TemplateURLService::GetTemplateURLForHost( | 433 TemplateURL* TemplateURLService::GetTemplateURLForHost( |
| 431 const std::string& host) { | 434 const std::string& host) { |
| 432 if (loaded_) | 435 if (loaded_) |
| 433 return provider_map_->GetTemplateURLForHost(host); | 436 return provider_map_->GetTemplateURLForHost(host); |
| 434 TemplateURL* initial_dsp = initial_default_search_provider_.get(); | 437 TemplateURL* initial_dsp = initial_default_search_provider_.get(); |
| 435 if (!initial_dsp) | 438 if (!initial_dsp) |
| 436 return NULL; | 439 return nullptr; |
| 437 return (initial_dsp->GenerateSearchURL(search_terms_data()).host() == host) ? | 440 return (initial_dsp->GenerateSearchURL(search_terms_data()).host() == host) |
| 438 initial_dsp : NULL; | 441 ? initial_dsp |
| 442 : nullptr; | |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Simpler:
return (initial_dsp &&
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 439 } | 443 } |
| 440 | 444 |
| 441 bool TemplateURLService::Add(TemplateURL* template_url) { | 445 bool TemplateURLService::Add(std::unique_ptr<TemplateURL> template_url) { |
| 442 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 446 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 443 if (!AddNoNotify(template_url, true)) | 447 if (!AddNoNotify(std::move(template_url), true)) |
| 444 return false; | 448 return false; |
| 445 NotifyObservers(); | 449 NotifyObservers(); |
| 446 return true; | 450 return true; |
| 447 } | 451 } |
| 448 | 452 |
| 449 void TemplateURLService::AddWithOverrides(TemplateURL* template_url, | 453 void TemplateURLService::AddWithOverrides( |
| 450 const base::string16& short_name, | 454 std::unique_ptr<TemplateURL> template_url, |
| 451 const base::string16& keyword, | 455 const base::string16& short_name, |
| 452 const std::string& url) { | 456 const base::string16& keyword, |
| 457 const std::string& url) { | |
| 453 DCHECK(!short_name.empty()); | 458 DCHECK(!short_name.empty()); |
| 454 DCHECK(!keyword.empty()); | 459 DCHECK(!keyword.empty()); |
| 455 DCHECK(!url.empty()); | 460 DCHECK(!url.empty()); |
| 456 template_url->data_.SetShortName(short_name); | 461 template_url->data_.SetShortName(short_name); |
| 457 template_url->data_.SetKeyword(keyword); | 462 template_url->data_.SetKeyword(keyword); |
| 458 template_url->SetURL(url); | 463 template_url->SetURL(url); |
| 459 Add(template_url); | 464 Add(std::move(template_url)); |
| 460 } | 465 } |
| 461 | 466 |
| 462 void TemplateURLService::AddExtensionControlledTURL( | 467 void TemplateURLService::AddExtensionControlledTURL( |
| 463 TemplateURL* template_url, | 468 std::unique_ptr<TemplateURL> template_url, |
| 464 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info) { | 469 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info) { |
| 465 DCHECK(loaded_); | 470 DCHECK(loaded_); |
| 466 DCHECK(template_url); | 471 DCHECK(template_url.get()); |
|
Peter Kasting
2016/08/31 04:12:57
Nit: I'm surprised this is necessary.
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 467 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); | 472 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
| 468 DCHECK(info); | 473 DCHECK(info); |
| 469 DCHECK_NE(TemplateURL::NORMAL, info->type); | 474 DCHECK_NE(TemplateURL::NORMAL, info->type); |
| 470 DCHECK_EQ(info->wants_to_be_default_engine, | 475 DCHECK_EQ(info->wants_to_be_default_engine, |
| 471 template_url->show_in_default_list()); | 476 template_url->show_in_default_list()); |
| 472 DCHECK(!FindTemplateURLForExtension(info->extension_id, info->type)); | 477 DCHECK(!FindTemplateURLForExtension(info->extension_id, info->type)); |
| 473 template_url->extension_info_.swap(info); | 478 template_url->extension_info_.swap(info); |
| 474 | 479 |
| 475 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 480 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 476 if (AddNoNotify(template_url, true)) { | 481 bool wants_to_be_default_engine = |
| 477 if (template_url->extension_info_->wants_to_be_default_engine) | 482 template_url->extension_info_->wants_to_be_default_engine; |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Might make sense to modify AddNoNotify() to r
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 483 if (AddNoNotify(std::move(template_url), true)) { | |
| 484 if (wants_to_be_default_engine) | |
| 478 UpdateExtensionDefaultSearchEngine(); | 485 UpdateExtensionDefaultSearchEngine(); |
| 479 NotifyObservers(); | 486 NotifyObservers(); |
| 480 } | 487 } |
| 481 } | 488 } |
| 482 | 489 |
| 483 void TemplateURLService::Remove(TemplateURL* template_url) { | 490 void TemplateURLService::Remove(TemplateURL* template_url) { |
| 484 RemoveNoNotify(template_url); | 491 RemoveNoNotify(template_url); |
| 485 NotifyObservers(); | 492 NotifyObservers(); |
| 486 } | 493 } |
| 487 | 494 |
| 488 void TemplateURLService::RemoveExtensionControlledTURL( | 495 void TemplateURLService::RemoveExtensionControlledTURL( |
| 489 const std::string& extension_id, | 496 const std::string& extension_id, |
| 490 TemplateURL::Type type) { | 497 TemplateURL::Type type) { |
| 491 DCHECK(loaded_); | 498 DCHECK(loaded_); |
| 492 TemplateURL* url = FindTemplateURLForExtension(extension_id, type); | 499 TemplateURL* url = FindTemplateURLForExtension(extension_id, type); |
| 493 if (!url) | 500 if (!url) |
| 494 return; | 501 return; |
| 495 // NULL this out so that we can call RemoveNoNotify. | 502 // NULL this out so that we can call RemoveNoNotify. |
| 496 // UpdateExtensionDefaultSearchEngine will cause it to be reset. | 503 // UpdateExtensionDefaultSearchEngine will cause it to be reset. |
| 497 if (default_search_provider_ == url) | 504 if (default_search_provider_ == url) |
| 498 default_search_provider_ = NULL; | 505 default_search_provider_ = nullptr; |
| 499 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 506 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 500 RemoveNoNotify(url); | 507 RemoveNoNotify(url); |
| 501 UpdateExtensionDefaultSearchEngine(); | 508 UpdateExtensionDefaultSearchEngine(); |
| 502 NotifyObservers(); | 509 NotifyObservers(); |
| 503 } | 510 } |
| 504 | 511 |
| 505 void TemplateURLService::RemoveAutoGeneratedSince(base::Time created_after) { | 512 void TemplateURLService::RemoveAutoGeneratedSince(base::Time created_after) { |
| 506 RemoveAutoGeneratedBetween(created_after, base::Time()); | 513 RemoveAutoGeneratedBetween(created_after, base::Time()); |
| 507 } | 514 } |
| 508 | 515 |
| 509 void TemplateURLService::RemoveAutoGeneratedBetween(base::Time created_after, | 516 void TemplateURLService::RemoveAutoGeneratedBetween(base::Time created_after, |
| 510 base::Time created_before) { | 517 base::Time created_before) { |
| 511 RemoveAutoGeneratedForOriginBetween(GURL(), created_after, created_before); | 518 RemoveAutoGeneratedForOriginBetween(GURL(), created_after, created_before); |
| 512 } | 519 } |
| 513 | 520 |
| 514 void TemplateURLService::RemoveAutoGeneratedForOriginBetween( | 521 void TemplateURLService::RemoveAutoGeneratedForOriginBetween( |
| 515 const GURL& origin, | 522 const GURL& origin, |
| 516 base::Time created_after, | 523 base::Time created_after, |
| 517 base::Time created_before) { | 524 base::Time created_before) { |
| 518 GURL o(origin.GetOrigin()); | 525 GURL o(origin.GetOrigin()); |
| 519 bool should_notify = false; | 526 bool should_notify = false; |
| 520 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 527 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 521 for (size_t i = 0; i < template_urls_.size();) { | 528 for (size_t i = 0; i < template_urls_.size();) { |
| 522 if (template_urls_[i]->date_created() >= created_after && | 529 if (template_urls_[i]->date_created() >= created_after && |
| 523 (created_before.is_null() || | 530 (created_before.is_null() || |
| 524 template_urls_[i]->date_created() < created_before) && | 531 template_urls_[i]->date_created() < created_before) && |
| 525 CanReplace(template_urls_[i]) && | 532 CanReplace(template_urls_[i].get()) && |
| 526 (o.is_empty() || | 533 (o.is_empty() || |
| 527 template_urls_[i]->GenerateSearchURL( | 534 template_urls_[i] |
| 528 search_terms_data()).GetOrigin() == o)) { | 535 ->GenerateSearchURL(search_terms_data()) |
| 529 RemoveNoNotify(template_urls_[i]); | 536 .GetOrigin() == o)) { |
| 537 RemoveNoNotify(template_urls_[i].get()); | |
| 530 should_notify = true; | 538 should_notify = true; |
| 531 } else { | 539 } else { |
| 532 ++i; | 540 ++i; |
| 533 } | 541 } |
| 534 } | 542 } |
| 535 if (should_notify) | 543 if (should_notify) |
| 536 NotifyObservers(); | 544 NotifyObservers(); |
| 537 } | 545 } |
| 538 | 546 |
| 539 void TemplateURLService::RegisterOmniboxKeyword( | 547 void TemplateURLService::RegisterOmniboxKeyword( |
| 540 const std::string& extension_id, | 548 const std::string& extension_id, |
| 541 const std::string& extension_name, | 549 const std::string& extension_name, |
| 542 const std::string& keyword, | 550 const std::string& keyword, |
| 543 const std::string& template_url_string) { | 551 const std::string& template_url_string) { |
| 544 DCHECK(loaded_); | 552 DCHECK(loaded_); |
| 545 | 553 |
| 546 if (FindTemplateURLForExtension(extension_id, | 554 if (FindTemplateURLForExtension(extension_id, |
| 547 TemplateURL::OMNIBOX_API_EXTENSION)) | 555 TemplateURL::OMNIBOX_API_EXTENSION)) |
| 548 return; | 556 return; |
| 549 | 557 |
| 550 TemplateURLData data; | 558 TemplateURLData data; |
| 551 data.SetShortName(base::UTF8ToUTF16(extension_name)); | 559 data.SetShortName(base::UTF8ToUTF16(extension_name)); |
| 552 data.SetKeyword(base::UTF8ToUTF16(keyword)); | 560 data.SetKeyword(base::UTF8ToUTF16(keyword)); |
| 553 data.SetURL(template_url_string); | 561 data.SetURL(template_url_string); |
| 554 TemplateURL* url = new TemplateURL(data); | 562 std::unique_ptr<TemplateURL> turl = base::MakeUnique<TemplateURL>(data); |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Can just inline below.
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 555 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info( | 563 std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info( |
| 556 new TemplateURL::AssociatedExtensionInfo( | 564 new TemplateURL::AssociatedExtensionInfo( |
| 557 TemplateURL::OMNIBOX_API_EXTENSION, extension_id)); | 565 TemplateURL::OMNIBOX_API_EXTENSION, extension_id)); |
| 558 AddExtensionControlledTURL(url, std::move(info)); | 566 AddExtensionControlledTURL(std::move(turl), std::move(info)); |
| 559 } | 567 } |
| 560 | 568 |
| 561 TemplateURLService::TemplateURLVector TemplateURLService::GetTemplateURLs() { | 569 TemplateURLService::TemplateURLVector TemplateURLService::GetTemplateURLs() { |
| 562 return template_urls_; | 570 TemplateURLVector result; |
| 571 for (const auto& turl : template_urls_) | |
| 572 result.push_back(turl.get()); | |
| 573 return result; | |
| 563 } | 574 } |
| 564 | 575 |
| 565 void TemplateURLService::IncrementUsageCount(TemplateURL* url) { | 576 void TemplateURLService::IncrementUsageCount(TemplateURL* url) { |
| 566 DCHECK(url); | 577 DCHECK(url); |
| 567 // Extension-controlled search engines are not persisted. | 578 // Extension-controlled search engines are not persisted. |
| 568 if (url->GetType() != TemplateURL::NORMAL) | 579 if (url->GetType() != TemplateURL::NORMAL) |
| 569 return; | 580 return; |
| 570 if (std::find(template_urls_.begin(), template_urls_.end(), url) == | 581 if (!Contains(&template_urls_, url)) |
| 571 template_urls_.end()) | |
| 572 return; | 582 return; |
| 573 ++url->data_.usage_count; | 583 ++url->data_.usage_count; |
| 574 | 584 |
| 575 if (web_data_service_.get()) | 585 if (web_data_service_.get()) |
| 576 web_data_service_->UpdateKeyword(url->data()); | 586 web_data_service_->UpdateKeyword(url->data()); |
| 577 } | 587 } |
| 578 | 588 |
| 579 void TemplateURLService::ResetTemplateURL(TemplateURL* url, | 589 void TemplateURLService::ResetTemplateURL(TemplateURL* url, |
| 580 const base::string16& title, | 590 const base::string16& title, |
| 581 const base::string16& keyword, | 591 const base::string16& keyword, |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 598 TemplateURL* url) { | 608 TemplateURL* url) { |
| 599 // Omnibox keywords cannot be made default. Extension-controlled search | 609 // Omnibox keywords cannot be made default. Extension-controlled search |
| 600 // engines can be made default only by the extension itself because they | 610 // engines can be made default only by the extension itself because they |
| 601 // aren't persisted. | 611 // aren't persisted. |
| 602 DCHECK(!url || (url->GetType() == TemplateURL::NORMAL)); | 612 DCHECK(!url || (url->GetType() == TemplateURL::NORMAL)); |
| 603 if (load_failed_) { | 613 if (load_failed_) { |
| 604 // Skip the DefaultSearchManager, which will persist to user preferences. | 614 // Skip the DefaultSearchManager, which will persist to user preferences. |
| 605 if ((default_search_provider_source_ == DefaultSearchManager::FROM_USER) || | 615 if ((default_search_provider_source_ == DefaultSearchManager::FROM_USER) || |
| 606 (default_search_provider_source_ == | 616 (default_search_provider_source_ == |
| 607 DefaultSearchManager::FROM_FALLBACK)) { | 617 DefaultSearchManager::FROM_FALLBACK)) { |
| 608 ApplyDefaultSearchChange(url ? &url->data() : NULL, | 618 ApplyDefaultSearchChange(url ? &url->data() : nullptr, |
| 609 DefaultSearchManager::FROM_USER); | 619 DefaultSearchManager::FROM_USER); |
| 610 } | 620 } |
| 611 } else { | 621 } else { |
| 612 // We rely on the DefaultSearchManager to call OnDefaultSearchChange if, in | 622 // We rely on the DefaultSearchManager to call OnDefaultSearchChange if, in |
| 613 // fact, the effective DSE changes. | 623 // fact, the effective DSE changes. |
| 614 if (url) | 624 if (url) |
| 615 default_search_manager_.SetUserSelectedDefaultSearchEngine(url->data()); | 625 default_search_manager_.SetUserSelectedDefaultSearchEngine(url->data()); |
| 616 else | 626 else |
| 617 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); | 627 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); |
| 618 } | 628 } |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 642 | 652 |
| 643 void TemplateURLService::RepairPrepopulatedSearchEngines() { | 653 void TemplateURLService::RepairPrepopulatedSearchEngines() { |
| 644 // Can't clean DB if it hasn't been loaded. | 654 // Can't clean DB if it hasn't been loaded. |
| 645 DCHECK(loaded()); | 655 DCHECK(loaded()); |
| 646 | 656 |
| 647 if ((default_search_provider_source_ == DefaultSearchManager::FROM_USER) || | 657 if ((default_search_provider_source_ == DefaultSearchManager::FROM_USER) || |
| 648 (default_search_provider_source_ == | 658 (default_search_provider_source_ == |
| 649 DefaultSearchManager::FROM_FALLBACK)) { | 659 DefaultSearchManager::FROM_FALLBACK)) { |
| 650 // Clear |default_search_provider_| in case we want to remove the engine it | 660 // Clear |default_search_provider_| in case we want to remove the engine it |
| 651 // points to. This will get reset at the end of the function anyway. | 661 // points to. This will get reset at the end of the function anyway. |
| 652 default_search_provider_ = NULL; | 662 default_search_provider_ = nullptr; |
| 653 } | 663 } |
| 654 | 664 |
| 655 size_t default_search_provider_index = 0; | 665 size_t default_search_provider_index = 0; |
| 656 ScopedVector<TemplateURLData> prepopulated_urls = | 666 ScopedVector<TemplateURLData> prepopulated_urls = |
| 657 TemplateURLPrepopulateData::GetPrepopulatedEngines( | 667 TemplateURLPrepopulateData::GetPrepopulatedEngines( |
| 658 prefs_, &default_search_provider_index); | 668 prefs_, &default_search_provider_index); |
| 659 DCHECK(!prepopulated_urls.empty()); | 669 DCHECK(!prepopulated_urls.empty()); |
| 660 ActionsFromPrepopulateData actions(CreateActionsFromCurrentPrepopulateData( | 670 ActionsFromPrepopulateData actions(CreateActionsFromCurrentPrepopulateData( |
| 661 &prepopulated_urls, template_urls_, default_search_provider_)); | 671 &prepopulated_urls, template_urls_, default_search_provider_)); |
| 662 | 672 |
| 663 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 673 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 664 | 674 |
| 665 // Remove items. | 675 // Remove items. |
| 666 for (std::vector<TemplateURL*>::iterator i = actions.removed_engines.begin(); | 676 for (std::vector<TemplateURL*>::iterator i = actions.removed_engines.begin(); |
| 667 i < actions.removed_engines.end(); ++i) | 677 i < actions.removed_engines.end(); ++i) |
| 668 RemoveNoNotify(*i); | 678 RemoveNoNotify(*i); |
| 669 | 679 |
| 670 // Edit items. | 680 // Edit items. |
| 671 for (EditedEngines::iterator i(actions.edited_engines.begin()); | 681 for (EditedEngines::iterator i(actions.edited_engines.begin()); |
| 672 i < actions.edited_engines.end(); ++i) { | 682 i < actions.edited_engines.end(); ++i) { |
| 673 TemplateURL new_values(i->second); | 683 TemplateURL new_values(i->second); |
| 674 UpdateNoNotify(i->first, new_values); | 684 UpdateNoNotify(i->first, new_values); |
| 675 } | 685 } |
| 676 | 686 |
| 677 // Add items. | 687 // Add items. |
| 678 for (std::vector<TemplateURLData>::const_iterator i = | 688 for (std::vector<TemplateURLData>::const_iterator i = |
| 679 actions.added_engines.begin(); | 689 actions.added_engines.begin(); |
| 680 i < actions.added_engines.end(); | 690 i < actions.added_engines.end(); |
| 681 ++i) { | 691 ++i) { |
| 682 AddNoNotify(new TemplateURL(*i), true); | 692 AddNoNotify(base::MakeUnique<TemplateURL>(*i), true); |
| 683 } | 693 } |
| 684 | 694 |
| 685 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 695 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
| 686 &dsp_change_origin_, DSP_CHANGE_PROFILE_RESET); | 696 &dsp_change_origin_, DSP_CHANGE_PROFILE_RESET); |
| 687 | 697 |
| 688 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); | 698 default_search_manager_.ClearUserSelectedDefaultSearchEngine(); |
| 689 | 699 |
| 690 if (!default_search_provider_) { | 700 if (!default_search_provider_) { |
| 691 // If the default search provider came from a user pref we would have been | 701 // If the default search provider came from a user pref we would have been |
| 692 // notified of the new (fallback-provided) value in | 702 // notified of the new (fallback-provided) value in |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 743 if (!result) { | 753 if (!result) { |
| 744 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 754 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
| 745 // is fixed. | 755 // is fixed. |
| 746 tracked_objects::ScopedTracker tracking_profile1( | 756 tracked_objects::ScopedTracker tracking_profile1( |
| 747 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 757 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 748 "422460 TemplateURLService::OnWebDataServiceRequestDone 1")); | 758 "422460 TemplateURLService::OnWebDataServiceRequestDone 1")); |
| 749 | 759 |
| 750 // Results are null if the database went away or (most likely) wasn't | 760 // Results are null if the database went away or (most likely) wasn't |
| 751 // loaded. | 761 // loaded. |
| 752 load_failed_ = true; | 762 load_failed_ = true; |
| 753 web_data_service_ = NULL; | 763 web_data_service_ = nullptr; |
| 754 ChangeToLoadedState(); | 764 ChangeToLoadedState(); |
| 755 return; | 765 return; |
| 756 } | 766 } |
| 757 | 767 |
| 758 TemplateURLVector template_urls; | 768 std::unique_ptr<OwnedTemplateURLVector> template_urls = |
| 769 base::MakeUnique<OwnedTemplateURLVector>(); | |
| 759 int new_resource_keyword_version = 0; | 770 int new_resource_keyword_version = 0; |
| 760 { | 771 { |
| 761 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 772 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
| 762 // is fixed. | 773 // is fixed. |
| 763 tracked_objects::ScopedTracker tracking_profile2( | 774 tracked_objects::ScopedTracker tracking_profile2( |
| 764 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 775 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 765 "422460 TemplateURLService::OnWebDataServiceRequestDone 2")); | 776 "422460 TemplateURLService::OnWebDataServiceRequestDone 2")); |
| 766 | 777 |
| 767 GetSearchProvidersUsingKeywordResult( | 778 GetSearchProvidersUsingKeywordResult( |
| 768 *result, web_data_service_.get(), prefs_, &template_urls, | 779 *result, web_data_service_.get(), prefs_, template_urls.get(), |
| 769 (default_search_provider_source_ == DefaultSearchManager::FROM_USER) | 780 (default_search_provider_source_ == DefaultSearchManager::FROM_USER) |
| 770 ? initial_default_search_provider_.get() | 781 ? initial_default_search_provider_.get() |
| 771 : NULL, | 782 : nullptr, |
| 772 search_terms_data(), &new_resource_keyword_version, &pre_sync_deletes_); | 783 search_terms_data(), &new_resource_keyword_version, &pre_sync_deletes_); |
| 773 } | 784 } |
| 774 | 785 |
| 775 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 786 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 776 | 787 |
| 777 { | 788 { |
| 778 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 789 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
| 779 // is fixed. | 790 // is fixed. |
| 780 tracked_objects::ScopedTracker tracking_profile4( | 791 tracked_objects::ScopedTracker tracking_profile4( |
| 781 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 792 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 782 "422460 TemplateURLService::OnWebDataServiceRequestDone 4")); | 793 "422460 TemplateURLService::OnWebDataServiceRequestDone 4")); |
| 783 | 794 |
| 784 PatchMissingSyncGUIDs(&template_urls); | 795 PatchMissingSyncGUIDs(template_urls.get()); |
| 785 | 796 |
| 786 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 797 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
| 787 // is fixed. | 798 // is fixed. |
| 788 tracked_objects::ScopedTracker tracking_profile41( | 799 tracked_objects::ScopedTracker tracking_profile41( |
| 789 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 800 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 790 "422460 TemplateURLService::OnWebDataServiceRequestDone 41")); | 801 "422460 TemplateURLService::OnWebDataServiceRequestDone 41")); |
| 791 | 802 |
| 792 SetTemplateURLs(&template_urls); | 803 SetTemplateURLs(std::move(template_urls)); |
| 793 | 804 |
| 794 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 | 805 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
| 795 // is fixed. | 806 // is fixed. |
| 796 tracked_objects::ScopedTracker tracking_profile42( | 807 tracked_objects::ScopedTracker tracking_profile42( |
| 797 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 808 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 798 "422460 TemplateURLService::OnWebDataServiceRequestDone 42")); | 809 "422460 TemplateURLService::OnWebDataServiceRequestDone 42")); |
| 799 | 810 |
| 800 // This initializes provider_map_ which should be done before | 811 // This initializes provider_map_ which should be done before |
| 801 // calling UpdateKeywordSearchTermsForURL. | 812 // calling UpdateKeywordSearchTermsForURL. |
| 802 // This also calls NotifyObservers. | 813 // This also calls NotifyObservers. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 872 void TemplateURLService::Shutdown() { | 883 void TemplateURLService::Shutdown() { |
| 873 if (client_) | 884 if (client_) |
| 874 client_->Shutdown(); | 885 client_->Shutdown(); |
| 875 // This check has to be done at Shutdown() instead of in the dtor to ensure | 886 // This check has to be done at Shutdown() instead of in the dtor to ensure |
| 876 // that no clients of KeywordWebDataService are holding ptrs to it after the | 887 // that no clients of KeywordWebDataService are holding ptrs to it after the |
| 877 // first phase of the KeyedService Shutdown() process. | 888 // first phase of the KeyedService Shutdown() process. |
| 878 if (load_handle_) { | 889 if (load_handle_) { |
| 879 DCHECK(web_data_service_.get()); | 890 DCHECK(web_data_service_.get()); |
| 880 web_data_service_->CancelRequest(load_handle_); | 891 web_data_service_->CancelRequest(load_handle_); |
| 881 } | 892 } |
| 882 web_data_service_ = NULL; | 893 web_data_service_ = nullptr; |
| 883 } | 894 } |
| 884 | 895 |
| 885 syncer::SyncDataList TemplateURLService::GetAllSyncData( | 896 syncer::SyncDataList TemplateURLService::GetAllSyncData( |
| 886 syncer::ModelType type) const { | 897 syncer::ModelType type) const { |
| 887 DCHECK_EQ(syncer::SEARCH_ENGINES, type); | 898 DCHECK_EQ(syncer::SEARCH_ENGINES, type); |
| 888 | 899 |
| 889 syncer::SyncDataList current_data; | 900 syncer::SyncDataList current_data; |
| 890 for (TemplateURLVector::const_iterator iter = template_urls_.begin(); | 901 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 891 iter != template_urls_.end(); ++iter) { | |
| 892 // We don't sync keywords managed by policy. | 902 // We don't sync keywords managed by policy. |
| 893 if ((*iter)->created_by_policy()) | 903 if (turl->created_by_policy()) |
| 894 continue; | 904 continue; |
| 895 // We don't sync extension-controlled search engines. | 905 // We don't sync extension-controlled search engines. |
| 896 if ((*iter)->GetType() != TemplateURL::NORMAL) | 906 if (turl->GetType() != TemplateURL::NORMAL) |
| 897 continue; | 907 continue; |
| 898 current_data.push_back(CreateSyncDataFromTemplateURL(**iter)); | 908 current_data.push_back(CreateSyncDataFromTemplateURL(*turl)); |
| 899 } | 909 } |
| 900 | 910 |
| 901 return current_data; | 911 return current_data; |
| 902 } | 912 } |
| 903 | 913 |
| 904 syncer::SyncError TemplateURLService::ProcessSyncChanges( | 914 syncer::SyncError TemplateURLService::ProcessSyncChanges( |
| 905 const tracked_objects::Location& from_here, | 915 const tracked_objects::Location& from_here, |
| 906 const syncer::SyncChangeList& change_list) { | 916 const syncer::SyncChangeList& change_list) { |
| 907 if (!models_associated_) { | 917 if (!models_associated_) { |
| 908 syncer::SyncError error(FROM_HERE, | 918 syncer::SyncError error(FROM_HERE, |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 996 if (existing_keyword_turl) { | 1006 if (existing_keyword_turl) { |
| 997 // Resolve any conflicts so we can safely add the new entry. | 1007 // Resolve any conflicts so we can safely add the new entry. |
| 998 ResolveSyncKeywordConflict(turl.get(), existing_keyword_turl, | 1008 ResolveSyncKeywordConflict(turl.get(), existing_keyword_turl, |
| 999 &new_changes); | 1009 &new_changes); |
| 1000 } | 1010 } |
| 1001 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 1011 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
| 1002 &dsp_change_origin_, DSP_CHANGE_SYNC_ADD); | 1012 &dsp_change_origin_, DSP_CHANGE_SYNC_ADD); |
| 1003 // Force the local ID to kInvalidTemplateURLID so we can add it. | 1013 // Force the local ID to kInvalidTemplateURLID so we can add it. |
| 1004 TemplateURLData data(turl->data()); | 1014 TemplateURLData data(turl->data()); |
| 1005 data.id = kInvalidTemplateURLID; | 1015 data.id = kInvalidTemplateURLID; |
| 1006 TemplateURL* added = new TemplateURL(data); | 1016 std::unique_ptr<TemplateURL> added_ptr = |
| 1007 if (Add(added)) | 1017 base::MakeUnique<TemplateURL>(data); |
| 1018 TemplateURL* added = added_ptr.get(); | |
| 1019 if (Add(std::move(added_ptr))) | |
| 1008 MaybeUpdateDSEAfterSync(added); | 1020 MaybeUpdateDSEAfterSync(added); |
| 1009 } else if (iter->change_type() == syncer::SyncChange::ACTION_UPDATE) { | 1021 } else if (iter->change_type() == syncer::SyncChange::ACTION_UPDATE) { |
| 1010 if (!existing_turl) { | 1022 if (!existing_turl) { |
| 1011 error = sync_error_factory_->CreateAndUploadError( | 1023 error = sync_error_factory_->CreateAndUploadError( |
| 1012 FROM_HERE, | 1024 FROM_HERE, |
| 1013 "ProcessSyncChanges failed on ChangeType ACTION_UPDATE"); | 1025 "ProcessSyncChanges failed on ChangeType ACTION_UPDATE"); |
| 1014 continue; | 1026 continue; |
| 1015 } | 1027 } |
| 1016 if (existing_keyword_turl && (existing_keyword_turl != existing_turl)) { | 1028 if (existing_keyword_turl && (existing_keyword_turl != existing_turl)) { |
| 1017 // Resolve any conflicts with other entries so we can safely update the | 1029 // Resolve any conflicts with other entries so we can safely update the |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1270 | 1282 |
| 1271 // Past bugs might have caused either of these fields to be empty. Just | 1283 // Past bugs might have caused either of these fields to be empty. Just |
| 1272 // delete this data off the server. | 1284 // delete this data off the server. |
| 1273 if (specifics.url().empty() || specifics.sync_guid().empty()) { | 1285 if (specifics.url().empty() || specifics.sync_guid().empty()) { |
| 1274 change_list->push_back( | 1286 change_list->push_back( |
| 1275 syncer::SyncChange(FROM_HERE, | 1287 syncer::SyncChange(FROM_HERE, |
| 1276 syncer::SyncChange::ACTION_DELETE, | 1288 syncer::SyncChange::ACTION_DELETE, |
| 1277 sync_data)); | 1289 sync_data)); |
| 1278 UMA_HISTOGRAM_ENUMERATION(kDeleteSyncedEngineHistogramName, | 1290 UMA_HISTOGRAM_ENUMERATION(kDeleteSyncedEngineHistogramName, |
| 1279 DELETE_ENGINE_EMPTY_FIELD, DELETE_ENGINE_MAX); | 1291 DELETE_ENGINE_EMPTY_FIELD, DELETE_ENGINE_MAX); |
| 1280 return NULL; | 1292 return nullptr; |
| 1281 } | 1293 } |
| 1282 | 1294 |
| 1283 TemplateURLData data(existing_turl ? | 1295 TemplateURLData data(existing_turl ? |
| 1284 existing_turl->data() : TemplateURLData()); | 1296 existing_turl->data() : TemplateURLData()); |
| 1285 data.SetShortName(base::UTF8ToUTF16(specifics.short_name())); | 1297 data.SetShortName(base::UTF8ToUTF16(specifics.short_name())); |
| 1286 data.originating_url = GURL(specifics.originating_url()); | 1298 data.originating_url = GURL(specifics.originating_url()); |
| 1287 base::string16 keyword(base::UTF8ToUTF16(specifics.keyword())); | 1299 base::string16 keyword(base::UTF8ToUTF16(specifics.keyword())); |
| 1288 // NOTE: Once this code has shipped in a couple of stable releases, we can | 1300 // NOTE: Once this code has shipped in a couple of stable releases, we can |
| 1289 // probably remove the migration portion, comment out the | 1301 // probably remove the migration portion, comment out the |
| 1290 // "autogenerate_keyword" field entirely in the .proto file, and fold the | 1302 // "autogenerate_keyword" field entirely in the .proto file, and fold the |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1332 | 1344 |
| 1333 // We used to sync keywords associated with omnibox extensions, but no longer | 1345 // We used to sync keywords associated with omnibox extensions, but no longer |
| 1334 // want to. However, if we delete these keywords from sync, we'll break any | 1346 // want to. However, if we delete these keywords from sync, we'll break any |
| 1335 // synced old versions of Chrome which were relying on them. Instead, for now | 1347 // synced old versions of Chrome which were relying on them. Instead, for now |
| 1336 // we simply ignore these. | 1348 // we simply ignore these. |
| 1337 // TODO(vasilii): After a few Chrome versions, change this to go ahead and | 1349 // TODO(vasilii): After a few Chrome versions, change this to go ahead and |
| 1338 // delete these from sync. | 1350 // delete these from sync. |
| 1339 DCHECK(client); | 1351 DCHECK(client); |
| 1340 client->RestoreExtensionInfoIfNecessary(turl.get()); | 1352 client->RestoreExtensionInfoIfNecessary(turl.get()); |
| 1341 if (turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) | 1353 if (turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) |
| 1342 return NULL; | 1354 return nullptr; |
| 1343 | 1355 |
| 1344 DCHECK_EQ(TemplateURL::NORMAL, turl->GetType()); | 1356 DCHECK_EQ(TemplateURL::NORMAL, turl->GetType()); |
| 1345 if (reset_keyword || deduped) { | 1357 if (reset_keyword || deduped) { |
| 1346 if (reset_keyword) | 1358 if (reset_keyword) |
| 1347 turl->ResetKeywordIfNecessary(search_terms_data, true); | 1359 turl->ResetKeywordIfNecessary(search_terms_data, true); |
| 1348 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*turl); | 1360 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*turl); |
| 1349 change_list->push_back(syncer::SyncChange(FROM_HERE, | 1361 change_list->push_back(syncer::SyncChange(FROM_HERE, |
| 1350 syncer::SyncChange::ACTION_UPDATE, | 1362 syncer::SyncChange::ACTION_UPDATE, |
| 1351 sync_data)); | 1363 sync_data)); |
| 1352 } else if (turl->IsGoogleSearchURLWithReplaceableKeyword(search_terms_data)) { | 1364 } else if (turl->IsGoogleSearchURLWithReplaceableKeyword(search_terms_data)) { |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1416 DCHECK(initializers[i].keyword); | 1428 DCHECK(initializers[i].keyword); |
| 1417 DCHECK(initializers[i].url); | 1429 DCHECK(initializers[i].url); |
| 1418 DCHECK(initializers[i].content); | 1430 DCHECK(initializers[i].content); |
| 1419 | 1431 |
| 1420 // TemplateURLService ends up owning the TemplateURL, don't try and free | 1432 // TemplateURLService ends up owning the TemplateURL, don't try and free |
| 1421 // it. | 1433 // it. |
| 1422 TemplateURLData data; | 1434 TemplateURLData data; |
| 1423 data.SetShortName(base::UTF8ToUTF16(initializers[i].content)); | 1435 data.SetShortName(base::UTF8ToUTF16(initializers[i].content)); |
| 1424 data.SetKeyword(base::UTF8ToUTF16(initializers[i].keyword)); | 1436 data.SetKeyword(base::UTF8ToUTF16(initializers[i].keyword)); |
| 1425 data.SetURL(initializers[i].url); | 1437 data.SetURL(initializers[i].url); |
| 1426 TemplateURL* template_url = new TemplateURL(data); | 1438 AddNoNotify(base::MakeUnique<TemplateURL>(data), true); |
| 1427 AddNoNotify(template_url, true); | |
| 1428 | 1439 |
| 1429 // Set the first provided identifier to be the default. | 1440 // Set the first provided identifier to be the default. |
| 1430 if (i == 0) | 1441 if (i == 0) |
| 1431 default_search_manager_.SetUserSelectedDefaultSearchEngine(data); | 1442 default_search_manager_.SetUserSelectedDefaultSearchEngine(data); |
| 1432 } | 1443 } |
| 1433 } | 1444 } |
| 1434 | 1445 |
| 1435 // Request a server check for the correct Google URL if Google is the | 1446 // Request a server check for the correct Google URL if Google is the |
| 1436 // default search engine. | 1447 // default search engine. |
| 1437 RequestGoogleURLTrackerServerCheckIfNecessary(); | 1448 RequestGoogleURLTrackerServerCheckIfNecessary(); |
| 1438 } | 1449 } |
| 1439 | 1450 |
| 1440 void TemplateURLService::RemoveFromMaps(TemplateURL* template_url) { | 1451 void TemplateURLService::RemoveFromMaps(TemplateURL* template_url) { |
| 1441 const base::string16& keyword = template_url->keyword(); | 1452 const base::string16& keyword = template_url->keyword(); |
| 1442 DCHECK_NE(0U, keyword_to_turl_and_length_.count(keyword)); | 1453 DCHECK_NE(0U, keyword_to_turl_and_length_.count(keyword)); |
| 1443 if (keyword_to_turl_and_length_[keyword].first == template_url) { | 1454 if (keyword_to_turl_and_length_[keyword].first == template_url) { |
| 1444 // We need to check whether the keyword can now be provided by another | 1455 // We need to check whether the keyword can now be provided by another |
| 1445 // TemplateURL. See the comments in AddToMaps() for more information on | 1456 // TemplateURL. See the comments in AddToMaps() for more information on |
| 1446 // extension keywords and how they can coexist with non-extension keywords. | 1457 // extension keywords and how they can coexist with non-extension keywords. |
| 1447 // In the case of more than one extension, we use the most recently | 1458 // In the case of more than one extension, we use the most recently |
| 1448 // installed (which will be the most recently added, which will have the | 1459 // installed (which will be the most recently added, which will have the |
| 1449 // highest ID). | 1460 // highest ID). |
| 1450 TemplateURL* best_fallback = NULL; | 1461 TemplateURL* best_fallback = nullptr; |
| 1451 for (TemplateURLVector::const_iterator i(template_urls_.begin()); | 1462 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:56
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 1452 i != template_urls_.end(); ++i) { | |
| 1453 TemplateURL* turl = *i; | |
| 1454 // This next statement relies on the fact that there can only be one | 1463 // This next statement relies on the fact that there can only be one |
| 1455 // non-Omnibox API TemplateURL with a given keyword. | 1464 // non-Omnibox API TemplateURL with a given keyword. |
| 1456 if ((turl != template_url) && (turl->keyword() == keyword) && | 1465 if ((turl.get() != template_url) && (turl->keyword() == keyword) && |
| 1457 (!best_fallback || | 1466 (!best_fallback || |
| 1458 (best_fallback->GetType() != TemplateURL::OMNIBOX_API_EXTENSION) || | 1467 (best_fallback->GetType() != TemplateURL::OMNIBOX_API_EXTENSION) || |
| 1459 ((turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) && | 1468 ((turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) && |
| 1460 (turl->id() > best_fallback->id())))) | 1469 (turl->id() > best_fallback->id())))) |
| 1461 best_fallback = turl; | 1470 best_fallback = turl.get(); |
| 1462 } | 1471 } |
| 1463 RemoveFromDomainMap(template_url); | 1472 RemoveFromDomainMap(template_url); |
| 1464 if (best_fallback) { | 1473 if (best_fallback) { |
| 1465 AddToMap(best_fallback); | 1474 AddToMap(best_fallback); |
| 1466 AddToDomainMap(best_fallback); | 1475 AddToDomainMap(best_fallback); |
| 1467 } else { | 1476 } else { |
| 1468 keyword_to_turl_and_length_.erase(keyword); | 1477 keyword_to_turl_and_length_.erase(keyword); |
| 1469 } | 1478 } |
| 1470 } | 1479 } |
| 1471 | 1480 |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1544 } | 1553 } |
| 1545 | 1554 |
| 1546 void TemplateURLService::AddToMap(TemplateURL* template_url) { | 1555 void TemplateURLService::AddToMap(TemplateURL* template_url) { |
| 1547 const base::string16& keyword = template_url->keyword(); | 1556 const base::string16& keyword = template_url->keyword(); |
| 1548 keyword_to_turl_and_length_[keyword] = | 1557 keyword_to_turl_and_length_[keyword] = |
| 1549 TURLAndMeaningfulLength( | 1558 TURLAndMeaningfulLength( |
| 1550 template_url, GetMeaningfulKeywordLength(keyword, template_url)); | 1559 template_url, GetMeaningfulKeywordLength(keyword, template_url)); |
| 1551 } | 1560 } |
| 1552 | 1561 |
| 1553 // Helper for partition() call in next function. | 1562 // Helper for partition() call in next function. |
| 1554 bool HasValidID(TemplateURL* t_url) { | 1563 bool HasValidID(const std::unique_ptr<TemplateURL>& t_url) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Perhaps this should just be inlined below as
Avi (use Gerrit)
2016/09/01 00:34:27
C++11!
| |
| 1555 return t_url->id() != kInvalidTemplateURLID; | 1564 return t_url->id() != kInvalidTemplateURLID; |
| 1556 } | 1565 } |
| 1557 | 1566 |
| 1558 void TemplateURLService::SetTemplateURLs(TemplateURLVector* urls) { | 1567 void TemplateURLService::SetTemplateURLs( |
| 1568 std::unique_ptr<OwnedTemplateURLVector> urls) { | |
| 1559 // Partition the URLs first, instead of implementing the loops below by simply | 1569 // Partition the URLs first, instead of implementing the loops below by simply |
| 1560 // scanning the input twice. While it's not supposed to happen normally, it's | 1570 // scanning the input twice. While it's not supposed to happen normally, it's |
| 1561 // possible for corrupt databases to return multiple entries with the same | 1571 // possible for corrupt databases to return multiple entries with the same |
| 1562 // keyword. In this case, the first loop may delete the first entry when | 1572 // keyword. In this case, the first loop may delete the first entry when |
| 1563 // adding the second. If this happens, the second loop must not attempt to | 1573 // adding the second. If this happens, the second loop must not attempt to |
| 1564 // access the deleted entry. Partitioning ensures this constraint. | 1574 // access the deleted entry. Partitioning ensures this constraint. |
| 1565 TemplateURLVector::iterator first_invalid( | 1575 auto first_invalid(std::partition(urls->begin(), urls->end(), HasValidID)); |
| 1566 std::partition(urls->begin(), urls->end(), HasValidID)); | |
| 1567 | 1576 |
| 1568 // First, add the items that already have id's, so that the next_id_ gets | 1577 // First, add the items that already have id's, so that the next_id_ gets |
| 1569 // properly set. | 1578 // properly set. |
| 1570 for (TemplateURLVector::const_iterator i = urls->begin(); i != first_invalid; | 1579 for (auto i = urls->begin(); i != first_invalid; ++i) { |
| 1571 ++i) { | |
| 1572 next_id_ = std::max(next_id_, (*i)->id()); | 1580 next_id_ = std::max(next_id_, (*i)->id()); |
| 1573 AddNoNotify(*i, false); | 1581 AddNoNotify(std::move(*i), false); |
| 1574 } | 1582 } |
| 1575 | 1583 |
| 1576 // Next add the new items that don't have id's. | 1584 // Next add the new items that don't have id's. |
| 1577 for (TemplateURLVector::const_iterator i = first_invalid; i != urls->end(); | 1585 for (auto i = first_invalid; i != urls->end(); ++i) |
| 1578 ++i) | 1586 AddNoNotify(std::move(*i), true); |
| 1579 AddNoNotify(*i, true); | |
| 1580 | |
| 1581 // Clear the input vector to reduce the chance callers will try to use a | |
| 1582 // (possibly deleted) entry. | |
| 1583 urls->clear(); | |
| 1584 } | 1587 } |
| 1585 | 1588 |
| 1586 void TemplateURLService::ChangeToLoadedState() { | 1589 void TemplateURLService::ChangeToLoadedState() { |
| 1587 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 1590 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
| 1588 // fixed. | 1591 // fixed. |
| 1589 tracked_objects::ScopedTracker tracking_profile1( | 1592 tracked_objects::ScopedTracker tracking_profile1( |
| 1590 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1593 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1591 "422460 TemplateURLService::ChangeToLoadedState 1")); | 1594 "422460 TemplateURLService::ChangeToLoadedState 1")); |
| 1592 | 1595 |
| 1593 DCHECK(!loaded_); | 1596 DCHECK(!loaded_); |
| 1594 | 1597 |
| 1595 provider_map_->Init(template_urls_, search_terms_data()); | 1598 provider_map_->Init(template_urls_, search_terms_data()); |
| 1596 loaded_ = true; | 1599 loaded_ = true; |
| 1597 | 1600 |
| 1598 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 1601 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
| 1599 // fixed. | 1602 // fixed. |
| 1600 tracked_objects::ScopedTracker tracking_profile2( | 1603 tracked_objects::ScopedTracker tracking_profile2( |
| 1601 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1604 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1602 "422460 TemplateURLService::ChangeToLoadedState 2")); | 1605 "422460 TemplateURLService::ChangeToLoadedState 2")); |
| 1603 | 1606 |
| 1604 // This will cause a call to NotifyObservers(). | 1607 // This will cause a call to NotifyObservers(). |
| 1605 ApplyDefaultSearchChangeNoMetrics( | 1608 ApplyDefaultSearchChangeNoMetrics( |
| 1606 initial_default_search_provider_ ? | 1609 initial_default_search_provider_ |
| 1607 &initial_default_search_provider_->data() : NULL, | 1610 ? &initial_default_search_provider_->data() |
| 1611 : nullptr, | |
| 1608 default_search_provider_source_); | 1612 default_search_provider_source_); |
| 1609 initial_default_search_provider_.reset(); | 1613 initial_default_search_provider_.reset(); |
| 1610 | 1614 |
| 1611 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is | 1615 // TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 is |
| 1612 // fixed. | 1616 // fixed. |
| 1613 tracked_objects::ScopedTracker tracking_profile3( | 1617 tracked_objects::ScopedTracker tracking_profile3( |
| 1614 FROM_HERE_WITH_EXPLICIT_FUNCTION( | 1618 FROM_HERE_WITH_EXPLICIT_FUNCTION( |
| 1615 "422460 TemplateURLService::ChangeToLoadedState 3")); | 1619 "422460 TemplateURLService::ChangeToLoadedState 3")); |
| 1616 | 1620 |
| 1617 on_loaded_callbacks_.Notify(); | 1621 on_loaded_callbacks_.Notify(); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 1634 t_url->safe_for_autoreplace()); | 1638 t_url->safe_for_autoreplace()); |
| 1635 } | 1639 } |
| 1636 | 1640 |
| 1637 TemplateURL* TemplateURLService::FindNonExtensionTemplateURLForKeyword( | 1641 TemplateURL* TemplateURLService::FindNonExtensionTemplateURLForKeyword( |
| 1638 const base::string16& keyword) { | 1642 const base::string16& keyword) { |
| 1639 TemplateURL* keyword_turl = GetTemplateURLForKeyword(keyword); | 1643 TemplateURL* keyword_turl = GetTemplateURLForKeyword(keyword); |
| 1640 if (!keyword_turl || (keyword_turl->GetType() == TemplateURL::NORMAL)) | 1644 if (!keyword_turl || (keyword_turl->GetType() == TemplateURL::NORMAL)) |
| 1641 return keyword_turl; | 1645 return keyword_turl; |
| 1642 // The extension keyword in the model may be hiding a replaceable | 1646 // The extension keyword in the model may be hiding a replaceable |
| 1643 // non-extension keyword. Look for it. | 1647 // non-extension keyword. Look for it. |
| 1644 for (TemplateURLVector::const_iterator i(template_urls_.begin()); | 1648 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:56
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 1645 i != template_urls_.end(); ++i) { | 1649 if ((turl->GetType() == TemplateURL::NORMAL) && |
| 1646 if (((*i)->GetType() == TemplateURL::NORMAL) && | 1650 (turl->keyword() == keyword)) |
| 1647 ((*i)->keyword() == keyword)) | 1651 return turl.get(); |
| 1648 return *i; | |
| 1649 } | 1652 } |
| 1650 return NULL; | 1653 return nullptr; |
| 1651 } | 1654 } |
| 1652 | 1655 |
| 1653 bool TemplateURLService::UpdateNoNotify(TemplateURL* existing_turl, | 1656 bool TemplateURLService::UpdateNoNotify(TemplateURL* existing_turl, |
| 1654 const TemplateURL& new_values) { | 1657 const TemplateURL& new_values) { |
| 1655 DCHECK(existing_turl); | 1658 DCHECK(existing_turl); |
| 1656 if (std::find(template_urls_.begin(), template_urls_.end(), existing_turl) == | 1659 if (!Contains(&template_urls_, existing_turl)) |
| 1657 template_urls_.end()) | |
| 1658 return false; | 1660 return false; |
| 1659 | 1661 |
| 1660 DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, existing_turl->GetType()); | 1662 DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, existing_turl->GetType()); |
| 1661 | 1663 |
| 1662 base::string16 old_keyword(existing_turl->keyword()); | 1664 base::string16 old_keyword(existing_turl->keyword()); |
| 1663 keyword_to_turl_and_length_.erase(old_keyword); | 1665 keyword_to_turl_and_length_.erase(old_keyword); |
| 1664 RemoveFromDomainMap(existing_turl); | 1666 RemoveFromDomainMap(existing_turl); |
| 1665 if (!existing_turl->sync_guid().empty()) | 1667 if (!existing_turl->sync_guid().empty()) |
| 1666 guid_to_turl_.erase(existing_turl->sync_guid()); | 1668 guid_to_turl_.erase(existing_turl->sync_guid()); |
| 1667 | 1669 |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1820 initial_default_search_provider_->HasGoogleBaseURLs( | 1822 initial_default_search_provider_->HasGoogleBaseURLs( |
| 1821 search_terms_data())) | 1823 search_terms_data())) |
| 1822 initial_default_search_provider_->InvalidateCachedValues(); | 1824 initial_default_search_provider_->InvalidateCachedValues(); |
| 1823 initial_default_search_provider_->ResetKeywordIfNecessary( | 1825 initial_default_search_provider_->ResetKeywordIfNecessary( |
| 1824 search_terms_data(), false); | 1826 search_terms_data(), false); |
| 1825 return; | 1827 return; |
| 1826 } | 1828 } |
| 1827 | 1829 |
| 1828 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 1830 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 1829 bool something_changed = false; | 1831 bool something_changed = false; |
| 1830 for (TemplateURLVector::iterator i(template_urls_.begin()); | 1832 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:56
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 1831 i != template_urls_.end(); ++i) { | 1833 if (turl->HasGoogleBaseURLs(search_terms_data())) { |
| 1832 TemplateURL* t_url = *i; | 1834 TemplateURL updated_turl(turl->data()); |
| 1833 if (t_url->HasGoogleBaseURLs(search_terms_data())) { | |
| 1834 TemplateURL updated_turl(t_url->data()); | |
| 1835 updated_turl.ResetKeywordIfNecessary(search_terms_data(), false); | 1835 updated_turl.ResetKeywordIfNecessary(search_terms_data(), false); |
| 1836 KeywordToTURLAndMeaningfulLength::const_iterator existing_entry = | 1836 KeywordToTURLAndMeaningfulLength::const_iterator existing_entry = |
| 1837 keyword_to_turl_and_length_.find(updated_turl.keyword()); | 1837 keyword_to_turl_and_length_.find(updated_turl.keyword()); |
| 1838 if ((existing_entry != keyword_to_turl_and_length_.end()) && | 1838 if ((existing_entry != keyword_to_turl_and_length_.end()) && |
| 1839 (existing_entry->second.first != t_url)) { | 1839 (existing_entry->second.first != turl.get())) { |
| 1840 // The new autogenerated keyword conflicts with another TemplateURL. | 1840 // The new autogenerated keyword conflicts with another TemplateURL. |
| 1841 // Overwrite it if it's replaceable; otherwise, leave |t_url| using its | 1841 // Overwrite it if it's replaceable; otherwise, leave |turl| using its |
| 1842 // current keyword. (This will not prevent |t_url| from auto-updating | 1842 // current keyword. (This will not prevent |turl| from auto-updating |
| 1843 // the keyword in the future if the conflicting TemplateURL disappears.) | 1843 // the keyword in the future if the conflicting TemplateURL disappears.) |
| 1844 // Note that we must still update |t_url| in this case, or the | 1844 // Note that we must still update |turl| in this case, or the |
| 1845 // |provider_map_| will not be updated correctly. | 1845 // |provider_map_| will not be updated correctly. |
| 1846 if (CanReplace(existing_entry->second.first)) | 1846 if (CanReplace(existing_entry->second.first)) |
| 1847 RemoveNoNotify(existing_entry->second.first); | 1847 RemoveNoNotify(existing_entry->second.first); |
| 1848 else | 1848 else |
| 1849 updated_turl.data_.SetKeyword(t_url->keyword()); | 1849 updated_turl.data_.SetKeyword(turl->keyword()); |
| 1850 } | 1850 } |
| 1851 something_changed = true; | 1851 something_changed = true; |
| 1852 // This will send the keyword change to sync. Note that other clients | 1852 // This will send the keyword change to sync. Note that other clients |
| 1853 // need to reset the keyword to an appropriate local value when this | 1853 // need to reset the keyword to an appropriate local value when this |
| 1854 // change arrives; see CreateTemplateURLFromTemplateURLAndSyncData(). | 1854 // change arrives; see CreateTemplateURLFromTemplateURLAndSyncData(). |
| 1855 UpdateNoNotify(t_url, updated_turl); | 1855 UpdateNoNotify(turl.get(), updated_turl); |
| 1856 } | 1856 } |
| 1857 } | 1857 } |
| 1858 if (something_changed) | 1858 if (something_changed) |
| 1859 NotifyObservers(); | 1859 NotifyObservers(); |
| 1860 } | 1860 } |
| 1861 | 1861 |
| 1862 void TemplateURLService::OnDefaultSearchChange( | 1862 void TemplateURLService::OnDefaultSearchChange( |
| 1863 const TemplateURLData* data, | 1863 const TemplateURLData* data, |
| 1864 DefaultSearchManager::Source source) { | 1864 DefaultSearchManager::Source source) { |
| 1865 if (prefs_ && (source == DefaultSearchManager::FROM_USER) && | 1865 if (prefs_ && (source == DefaultSearchManager::FROM_USER) && |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 1888 bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( | 1888 bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
| 1889 const TemplateURLData* data, | 1889 const TemplateURLData* data, |
| 1890 DefaultSearchManager::Source source) { | 1890 DefaultSearchManager::Source source) { |
| 1891 if (!loaded_) { | 1891 if (!loaded_) { |
| 1892 // Set |initial_default_search_provider_| from the preferences. This is | 1892 // Set |initial_default_search_provider_| from the preferences. This is |
| 1893 // mainly so we can hold ownership until we get to the point where the list | 1893 // mainly so we can hold ownership until we get to the point where the list |
| 1894 // of keywords from Web Data is the owner of everything including the | 1894 // of keywords from Web Data is the owner of everything including the |
| 1895 // default. | 1895 // default. |
| 1896 bool changed = TemplateURL::MatchesData( | 1896 bool changed = TemplateURL::MatchesData( |
| 1897 initial_default_search_provider_.get(), data, search_terms_data()); | 1897 initial_default_search_provider_.get(), data, search_terms_data()); |
| 1898 initial_default_search_provider_.reset( | 1898 initial_default_search_provider_.reset(data ? new TemplateURL(*data) |
| 1899 data ? new TemplateURL(*data) : NULL); | 1899 : nullptr); |
|
Peter Kasting
2016/08/31 04:12:56
Nit: Maybe
initial_default_search_provider_ =
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 1900 default_search_provider_source_ = source; | 1900 default_search_provider_source_ = source; |
| 1901 return changed; | 1901 return changed; |
| 1902 } | 1902 } |
| 1903 | 1903 |
| 1904 // Prevent recursion if we update the value stored in default_search_manager_. | 1904 // Prevent recursion if we update the value stored in default_search_manager_. |
| 1905 // Note that we exclude the case of data == NULL because that could cause a | 1905 // Note that we exclude the case of data == NULL because that could cause a |
| 1906 // false positive for recursion when the initial_default_search_provider_ is | 1906 // false positive for recursion when the initial_default_search_provider_ is |
| 1907 // NULL due to policy. We'll never actually get recursion with data == NULL. | 1907 // NULL due to policy. We'll never actually get recursion with data == NULL. |
| 1908 if (source == default_search_provider_source_ && data != NULL && | 1908 if (source == default_search_provider_source_ && data != nullptr && |
| 1909 TemplateURL::MatchesData(default_search_provider_, data, | 1909 TemplateURL::MatchesData(default_search_provider_, data, |
| 1910 search_terms_data())) | 1910 search_terms_data())) |
| 1911 return false; | 1911 return false; |
| 1912 | 1912 |
| 1913 // This may be deleted later. Use exclusively for pointer comparison to detect | 1913 // This may be deleted later. Use exclusively for pointer comparison to detect |
| 1914 // a change. | 1914 // a change. |
| 1915 TemplateURL* previous_default_search_engine = default_search_provider_; | 1915 TemplateURL* previous_default_search_engine = default_search_provider_; |
| 1916 | 1916 |
| 1917 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); | 1917 KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
| 1918 if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || | 1918 if (default_search_provider_source_ == DefaultSearchManager::FROM_POLICY || |
| 1919 source == DefaultSearchManager::FROM_POLICY) { | 1919 source == DefaultSearchManager::FROM_POLICY) { |
| 1920 // We do this both to remove any no-longer-applicable policy-defined DSE as | 1920 // We do this both to remove any no-longer-applicable policy-defined DSE as |
| 1921 // well as to add the new one, if appropriate. | 1921 // well as to add the new one, if appropriate. |
| 1922 UpdateProvidersCreatedByPolicy( | 1922 UpdateProvidersCreatedByPolicy( |
| 1923 &template_urls_, | 1923 &template_urls_, |
| 1924 source == DefaultSearchManager::FROM_POLICY ? data : NULL); | 1924 source == DefaultSearchManager::FROM_POLICY ? data : nullptr); |
| 1925 } | 1925 } |
| 1926 | 1926 |
| 1927 if (!data) { | 1927 if (!data) { |
| 1928 default_search_provider_ = NULL; | 1928 default_search_provider_ = nullptr; |
| 1929 } else if (source == DefaultSearchManager::FROM_EXTENSION) { | 1929 } else if (source == DefaultSearchManager::FROM_EXTENSION) { |
| 1930 default_search_provider_ = FindMatchingExtensionTemplateURL( | 1930 default_search_provider_ = FindMatchingExtensionTemplateURL( |
| 1931 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); | 1931 *data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
| 1932 } else if (source == DefaultSearchManager::FROM_FALLBACK) { | 1932 } else if (source == DefaultSearchManager::FROM_FALLBACK) { |
| 1933 default_search_provider_ = | 1933 default_search_provider_ = |
| 1934 FindPrepopulatedTemplateURL(data->prepopulate_id); | 1934 FindPrepopulatedTemplateURL(data->prepopulate_id); |
| 1935 if (default_search_provider_) { | 1935 if (default_search_provider_) { |
| 1936 TemplateURLData update_data(*data); | 1936 TemplateURLData update_data(*data); |
| 1937 update_data.sync_guid = default_search_provider_->sync_guid(); | 1937 update_data.sync_guid = default_search_provider_->sync_guid(); |
| 1938 if (!default_search_provider_->safe_for_autoreplace()) { | 1938 if (!default_search_provider_->safe_for_autoreplace()) { |
| 1939 update_data.safe_for_autoreplace = false; | 1939 update_data.safe_for_autoreplace = false; |
| 1940 update_data.SetKeyword(default_search_provider_->keyword()); | 1940 update_data.SetKeyword(default_search_provider_->keyword()); |
| 1941 update_data.SetShortName(default_search_provider_->short_name()); | 1941 update_data.SetShortName(default_search_provider_->short_name()); |
| 1942 } | 1942 } |
| 1943 UpdateNoNotify(default_search_provider_, TemplateURL(update_data)); | 1943 UpdateNoNotify(default_search_provider_, TemplateURL(update_data)); |
| 1944 } else { | 1944 } else { |
| 1945 // Normally the prepopulated fallback should be present in | 1945 // Normally the prepopulated fallback should be present in |
| 1946 // |template_urls_|, but in a few cases it might not be: | 1946 // |template_urls_|, but in a few cases it might not be: |
| 1947 // (1) Tests that initialize the TemplateURLService in peculiar ways. | 1947 // (1) Tests that initialize the TemplateURLService in peculiar ways. |
| 1948 // (2) If the user deleted the pre-populated default and we subsequently | 1948 // (2) If the user deleted the pre-populated default and we subsequently |
| 1949 // lost their user-selected value. | 1949 // lost their user-selected value. |
| 1950 TemplateURL* new_dse = new TemplateURL(*data); | 1950 std::unique_ptr<TemplateURL> new_dse_ptr = |
| 1951 if (AddNoNotify(new_dse, true)) | 1951 base::MakeUnique<TemplateURL>(*data); |
| 1952 TemplateURL* new_dse = new_dse_ptr.get(); | |
| 1953 if (AddNoNotify(std::move(new_dse_ptr), true)) | |
| 1952 default_search_provider_ = new_dse; | 1954 default_search_provider_ = new_dse; |
| 1953 } | 1955 } |
| 1954 } else if (source == DefaultSearchManager::FROM_USER) { | 1956 } else if (source == DefaultSearchManager::FROM_USER) { |
| 1955 default_search_provider_ = GetTemplateURLForGUID(data->sync_guid); | 1957 default_search_provider_ = GetTemplateURLForGUID(data->sync_guid); |
| 1956 if (!default_search_provider_ && data->prepopulate_id) { | 1958 if (!default_search_provider_ && data->prepopulate_id) { |
| 1957 default_search_provider_ = | 1959 default_search_provider_ = |
| 1958 FindPrepopulatedTemplateURL(data->prepopulate_id); | 1960 FindPrepopulatedTemplateURL(data->prepopulate_id); |
| 1959 } | 1961 } |
| 1960 TemplateURLData new_data(*data); | 1962 TemplateURLData new_data(*data); |
| 1961 new_data.show_in_default_list = true; | 1963 new_data.show_in_default_list = true; |
| 1962 if (default_search_provider_) { | 1964 if (default_search_provider_) { |
| 1963 UpdateNoNotify(default_search_provider_, TemplateURL(new_data)); | 1965 UpdateNoNotify(default_search_provider_, TemplateURL(new_data)); |
| 1964 } else { | 1966 } else { |
| 1965 new_data.id = kInvalidTemplateURLID; | 1967 new_data.id = kInvalidTemplateURLID; |
| 1966 TemplateURL* new_dse = new TemplateURL(new_data); | 1968 std::unique_ptr<TemplateURL> new_dse_ptr = |
| 1967 if (AddNoNotify(new_dse, true)) | 1969 base::MakeUnique<TemplateURL>(new_data); |
| 1970 TemplateURL* new_dse = new_dse_ptr.get(); | |
| 1971 if (AddNoNotify(std::move(new_dse_ptr), true)) | |
| 1968 default_search_provider_ = new_dse; | 1972 default_search_provider_ = new_dse; |
| 1969 } | 1973 } |
| 1970 if (default_search_provider_ && prefs_) { | 1974 if (default_search_provider_ && prefs_) { |
| 1971 prefs_->SetString(prefs::kSyncedDefaultSearchProviderGUID, | 1975 prefs_->SetString(prefs::kSyncedDefaultSearchProviderGUID, |
| 1972 default_search_provider_->sync_guid()); | 1976 default_search_provider_->sync_guid()); |
| 1973 } | 1977 } |
| 1974 | 1978 |
| 1975 } | 1979 } |
| 1976 | 1980 |
| 1977 default_search_provider_source_ = source; | 1981 default_search_provider_source_ = source; |
| 1978 | 1982 |
| 1979 bool changed = default_search_provider_ != previous_default_search_engine; | 1983 bool changed = default_search_provider_ != previous_default_search_engine; |
| 1980 if (changed) | 1984 if (changed) |
| 1981 RequestGoogleURLTrackerServerCheckIfNecessary(); | 1985 RequestGoogleURLTrackerServerCheckIfNecessary(); |
| 1982 | 1986 |
| 1983 NotifyObservers(); | 1987 NotifyObservers(); |
| 1984 | 1988 |
| 1985 return changed; | 1989 return changed; |
| 1986 } | 1990 } |
| 1987 | 1991 |
| 1988 bool TemplateURLService::AddNoNotify(TemplateURL* template_url, | 1992 bool TemplateURLService::AddNoNotify(std::unique_ptr<TemplateURL> template_url, |
| 1989 bool newly_adding) { | 1993 bool newly_adding) { |
| 1990 DCHECK(template_url); | 1994 DCHECK(template_url); |
| 1991 | 1995 |
| 1992 if (newly_adding) { | 1996 if (newly_adding) { |
| 1993 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); | 1997 DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
| 1994 DCHECK(std::find(template_urls_.begin(), template_urls_.end(), | 1998 DCHECK(!Contains(&template_urls_, template_url.get())); |
| 1995 template_url) == template_urls_.end()); | |
| 1996 template_url->data_.id = ++next_id_; | 1999 template_url->data_.id = ++next_id_; |
| 1997 } | 2000 } |
| 1998 | 2001 |
| 1999 template_url->ResetKeywordIfNecessary(search_terms_data(), false); | 2002 template_url->ResetKeywordIfNecessary(search_terms_data(), false); |
| 2000 // Check whether |template_url|'s keyword conflicts with any already in the | 2003 // Check whether |template_url|'s keyword conflicts with any already in the |
| 2001 // model. | 2004 // model. |
| 2002 TemplateURL* existing_keyword_turl = | 2005 TemplateURL* existing_keyword_turl = |
| 2003 GetTemplateURLForKeyword(template_url->keyword()); | 2006 GetTemplateURLForKeyword(template_url->keyword()); |
| 2004 | 2007 |
| 2005 // Check whether |template_url|'s keyword conflicts with any already in the | 2008 // Check whether |template_url|'s keyword conflicts with any already in the |
| 2006 // model. Note that we can reach here during the loading phase while | 2009 // model. Note that we can reach here during the loading phase while |
| 2007 // processing the template URLs from the web data service. In this case, | 2010 // processing the template URLs from the web data service. In this case, |
| 2008 // GetTemplateURLForKeyword() will look not only at what's already in the | 2011 // GetTemplateURLForKeyword() will look not only at what's already in the |
| 2009 // model, but at the |initial_default_search_provider_|. Since this engine | 2012 // model, but at the |initial_default_search_provider_|. Since this engine |
| 2010 // will presumably also be present in the web data, we need to double-check | 2013 // will presumably also be present in the web data, we need to double-check |
| 2011 // that any "pre-existing" entries we find are actually coming from | 2014 // that any "pre-existing" entries we find are actually coming from |
| 2012 // |template_urls_|, lest we detect a "conflict" between the | 2015 // |template_urls_|, lest we detect a "conflict" between the |
| 2013 // |initial_default_search_provider_| and the web data version of itself. | 2016 // |initial_default_search_provider_| and the web data version of itself. |
| 2014 if (template_url->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && | 2017 if (template_url->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && |
| 2015 existing_keyword_turl && | 2018 existing_keyword_turl && |
| 2016 existing_keyword_turl->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && | 2019 existing_keyword_turl->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && |
| 2017 (std::find(template_urls_.begin(), template_urls_.end(), | 2020 (Contains(&template_urls_, existing_keyword_turl))) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: Remove extra parens
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2018 existing_keyword_turl) != template_urls_.end())) { | 2021 DCHECK_NE(existing_keyword_turl, template_url.get()); |
| 2019 DCHECK_NE(existing_keyword_turl, template_url); | |
| 2020 // Only replace one of the TemplateURLs if they are either both extensions, | 2022 // Only replace one of the TemplateURLs if they are either both extensions, |
| 2021 // or both not extensions. | 2023 // or both not extensions. |
| 2022 bool are_same_type = existing_keyword_turl->GetType() == | 2024 bool are_same_type = existing_keyword_turl->GetType() == |
| 2023 template_url->GetType(); | 2025 template_url->GetType(); |
| 2024 if (CanReplace(existing_keyword_turl) && are_same_type) { | 2026 if (CanReplace(existing_keyword_turl) && are_same_type) { |
| 2025 RemoveNoNotify(existing_keyword_turl); | 2027 RemoveNoNotify(existing_keyword_turl); |
| 2026 } else if (CanReplace(template_url) && are_same_type) { | 2028 } else if (CanReplace(template_url.get()) && are_same_type) { |
| 2027 delete template_url; | |
| 2028 return false; | 2029 return false; |
| 2029 } else { | 2030 } else { |
| 2030 base::string16 new_keyword = | 2031 base::string16 new_keyword = |
| 2031 UniquifyKeyword(*existing_keyword_turl, false); | 2032 UniquifyKeyword(*existing_keyword_turl, false); |
| 2032 ResetTemplateURLNoNotify(existing_keyword_turl, | 2033 ResetTemplateURLNoNotify(existing_keyword_turl, |
| 2033 existing_keyword_turl->short_name(), new_keyword, | 2034 existing_keyword_turl->short_name(), new_keyword, |
| 2034 existing_keyword_turl->url()); | 2035 existing_keyword_turl->url()); |
| 2035 } | 2036 } |
| 2036 } | 2037 } |
| 2037 template_urls_.push_back(template_url); | 2038 TemplateURL* template_url_ptr = template_url.get(); |
| 2038 AddToMaps(template_url); | 2039 template_urls_.push_back(std::move(template_url)); |
| 2040 AddToMaps(template_url_ptr); | |
| 2039 | 2041 |
| 2040 if (newly_adding && | 2042 if (newly_adding && (template_url_ptr->GetType() == TemplateURL::NORMAL)) { |
| 2041 (template_url->GetType() == TemplateURL::NORMAL)) { | |
| 2042 if (web_data_service_.get()) | 2043 if (web_data_service_.get()) |
| 2043 web_data_service_->AddKeyword(template_url->data()); | 2044 web_data_service_->AddKeyword(template_url_ptr->data()); |
| 2044 | 2045 |
| 2045 // Inform sync of the addition. Note that this will assign a GUID to | 2046 // Inform sync of the addition. Note that this will assign a GUID to |
| 2046 // template_url and add it to the guid_to_turl_. | 2047 // template_url and add it to the guid_to_turl_. |
| 2047 ProcessTemplateURLChange(FROM_HERE, | 2048 ProcessTemplateURLChange(FROM_HERE, template_url_ptr, |
| 2048 template_url, | |
| 2049 syncer::SyncChange::ACTION_ADD); | 2049 syncer::SyncChange::ACTION_ADD); |
| 2050 } | 2050 } |
| 2051 | 2051 |
| 2052 return true; | 2052 return true; |
| 2053 } | 2053 } |
| 2054 | 2054 |
| 2055 void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) { | 2055 void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) { |
| 2056 DCHECK(template_url != default_search_provider_); | 2056 DCHECK(template_url != default_search_provider_); |
| 2057 | 2057 |
| 2058 TemplateURLVector::iterator i = | 2058 auto i = FindTemplateURL(&template_urls_, template_url); |
| 2059 std::find(template_urls_.begin(), template_urls_.end(), template_url); | |
| 2060 if (i == template_urls_.end()) | 2059 if (i == template_urls_.end()) |
| 2061 return; | 2060 return; |
| 2062 | 2061 |
| 2063 RemoveFromMaps(template_url); | 2062 RemoveFromMaps(template_url); |
| 2064 | 2063 |
| 2065 // Remove it from the vector containing all TemplateURLs. | 2064 // Remove it from the vector containing all TemplateURLs. |
| 2065 std::unique_ptr<TemplateURL> scoped_turl = std::move(*i); | |
| 2066 template_urls_.erase(i); | 2066 template_urls_.erase(i); |
| 2067 | 2067 |
| 2068 if (template_url->GetType() == TemplateURL::NORMAL) { | 2068 if (template_url->GetType() == TemplateURL::NORMAL) { |
| 2069 if (web_data_service_.get()) | 2069 if (web_data_service_.get()) |
| 2070 web_data_service_->RemoveKeyword(template_url->id()); | 2070 web_data_service_->RemoveKeyword(template_url->id()); |
| 2071 | 2071 |
| 2072 // Inform sync of the deletion. | 2072 // Inform sync of the deletion. |
| 2073 ProcessTemplateURLChange(FROM_HERE, | 2073 ProcessTemplateURLChange(FROM_HERE, |
| 2074 template_url, | 2074 template_url, |
| 2075 syncer::SyncChange::ACTION_DELETE); | 2075 syncer::SyncChange::ACTION_DELETE); |
| 2076 | 2076 |
| 2077 UMA_HISTOGRAM_ENUMERATION(kDeleteSyncedEngineHistogramName, | 2077 UMA_HISTOGRAM_ENUMERATION(kDeleteSyncedEngineHistogramName, |
| 2078 DELETE_ENGINE_USER_ACTION, DELETE_ENGINE_MAX); | 2078 DELETE_ENGINE_USER_ACTION, DELETE_ENGINE_MAX); |
| 2079 } | 2079 } |
| 2080 | 2080 |
| 2081 if (loaded_ && client_) | 2081 if (loaded_ && client_) |
| 2082 client_->DeleteAllSearchTermsForKeyword(template_url->id()); | 2082 client_->DeleteAllSearchTermsForKeyword(template_url->id()); |
| 2083 | |
| 2084 // We own the TemplateURL and need to delete it. | |
| 2085 delete template_url; | |
| 2086 } | 2083 } |
| 2087 | 2084 |
| 2088 bool TemplateURLService::ResetTemplateURLNoNotify( | 2085 bool TemplateURLService::ResetTemplateURLNoNotify( |
| 2089 TemplateURL* url, | 2086 TemplateURL* url, |
| 2090 const base::string16& title, | 2087 const base::string16& title, |
| 2091 const base::string16& keyword, | 2088 const base::string16& keyword, |
| 2092 const std::string& search_url) { | 2089 const std::string& search_url) { |
| 2093 DCHECK(!keyword.empty()); | 2090 DCHECK(!keyword.empty()); |
| 2094 DCHECK(!search_url.empty()); | 2091 DCHECK(!search_url.empty()); |
| 2095 TemplateURLData data(url->data()); | 2092 TemplateURLData data(url->data()); |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 2114 } | 2111 } |
| 2115 | 2112 |
| 2116 // |template_urls| are the TemplateURLs loaded from the database. | 2113 // |template_urls| are the TemplateURLs loaded from the database. |
| 2117 // |default_from_prefs| is the default search provider from the preferences, or | 2114 // |default_from_prefs| is the default search provider from the preferences, or |
| 2118 // NULL if the DSE is not policy-defined. | 2115 // NULL if the DSE is not policy-defined. |
| 2119 // | 2116 // |
| 2120 // This function removes from the vector and the database all the TemplateURLs | 2117 // This function removes from the vector and the database all the TemplateURLs |
| 2121 // that were set by policy, unless it is the current default search provider, in | 2118 // that were set by policy, unless it is the current default search provider, in |
| 2122 // which case it is updated with the data from prefs. | 2119 // which case it is updated with the data from prefs. |
| 2123 void TemplateURLService::UpdateProvidersCreatedByPolicy( | 2120 void TemplateURLService::UpdateProvidersCreatedByPolicy( |
| 2124 TemplateURLVector* template_urls, | 2121 OwnedTemplateURLVector* template_urls, |
| 2125 const TemplateURLData* default_from_prefs) { | 2122 const TemplateURLData* default_from_prefs) { |
| 2126 DCHECK(template_urls); | 2123 DCHECK(template_urls); |
| 2127 | 2124 |
| 2128 for (TemplateURLVector::iterator i = template_urls->begin(); | 2125 for (auto i = template_urls->begin(); i != template_urls->end();) { |
| 2129 i != template_urls->end(); ) { | 2126 TemplateURL* template_url = (*i).get(); |
|
Peter Kasting
2016/08/31 04:12:57
Nit: i->get()
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2130 TemplateURL* template_url = *i; | |
| 2131 if (template_url->created_by_policy()) { | 2127 if (template_url->created_by_policy()) { |
| 2132 if (default_from_prefs && | 2128 if (default_from_prefs && |
| 2133 TemplateURL::MatchesData(template_url, default_from_prefs, | 2129 TemplateURL::MatchesData(template_url, default_from_prefs, |
| 2134 search_terms_data())) { | 2130 search_terms_data())) { |
| 2135 // If the database specified a default search provider that was set | 2131 // If the database specified a default search provider that was set |
| 2136 // by policy, and the default search provider from the preferences | 2132 // by policy, and the default search provider from the preferences |
| 2137 // is also set by policy and they are the same, keep the entry in the | 2133 // is also set by policy and they are the same, keep the entry in the |
| 2138 // database and the |default_search_provider|. | 2134 // database and the |default_search_provider|. |
| 2139 default_search_provider_ = template_url; | 2135 default_search_provider_ = template_url; |
| 2140 // Prevent us from saving any other entries, or creating a new one. | 2136 // Prevent us from saving any other entries, or creating a new one. |
| 2141 default_from_prefs = NULL; | 2137 default_from_prefs = nullptr; |
| 2142 ++i; | 2138 ++i; |
| 2143 continue; | 2139 continue; |
| 2144 } | 2140 } |
| 2145 | 2141 |
| 2142 TemplateURLID id = template_url->id(); | |
| 2146 RemoveFromMaps(template_url); | 2143 RemoveFromMaps(template_url); |
| 2147 i = template_urls->erase(i); | 2144 i = template_urls->erase(i); |
| 2148 if (web_data_service_.get()) | 2145 if (web_data_service_.get()) |
| 2149 web_data_service_->RemoveKeyword(template_url->id()); | 2146 web_data_service_->RemoveKeyword(id); |
| 2150 delete template_url; | |
| 2151 } else { | 2147 } else { |
| 2152 ++i; | 2148 ++i; |
| 2153 } | 2149 } |
| 2154 } | 2150 } |
| 2155 | 2151 |
| 2156 if (default_from_prefs) { | 2152 if (default_from_prefs) { |
| 2157 default_search_provider_ = NULL; | 2153 default_search_provider_ = nullptr; |
| 2158 default_search_provider_source_ = DefaultSearchManager::FROM_POLICY; | 2154 default_search_provider_source_ = DefaultSearchManager::FROM_POLICY; |
| 2159 TemplateURLData new_data(*default_from_prefs); | 2155 TemplateURLData new_data(*default_from_prefs); |
| 2160 if (new_data.sync_guid.empty()) | 2156 if (new_data.sync_guid.empty()) |
| 2161 new_data.sync_guid = base::GenerateGUID(); | 2157 new_data.sync_guid = base::GenerateGUID(); |
| 2162 new_data.created_by_policy = true; | 2158 new_data.created_by_policy = true; |
| 2163 TemplateURL* new_dse = new TemplateURL(new_data); | 2159 std::unique_ptr<TemplateURL> new_dse_ptr = |
| 2164 if (AddNoNotify(new_dse, true)) | 2160 base::MakeUnique<TemplateURL>(new_data); |
| 2161 TemplateURL* new_dse = new_dse_ptr.get(); | |
| 2162 if (AddNoNotify(std::move(new_dse_ptr), true)) | |
| 2165 default_search_provider_ = new_dse; | 2163 default_search_provider_ = new_dse; |
| 2166 } | 2164 } |
| 2167 } | 2165 } |
| 2168 | 2166 |
| 2169 void TemplateURLService::ResetTemplateURLGUID(TemplateURL* url, | 2167 void TemplateURLService::ResetTemplateURLGUID(TemplateURL* url, |
| 2170 const std::string& guid) { | 2168 const std::string& guid) { |
| 2171 DCHECK(loaded_); | 2169 DCHECK(loaded_); |
| 2172 DCHECK(!guid.empty()); | 2170 DCHECK(!guid.empty()); |
| 2173 | 2171 |
| 2174 TemplateURLData data(url->data()); | 2172 TemplateURLData data(url->data()); |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2344 } | 2342 } |
| 2345 // Remove the local data so it isn't written to sync. | 2343 // Remove the local data so it isn't written to sync. |
| 2346 local_data->erase(guid); | 2344 local_data->erase(guid); |
| 2347 } | 2345 } |
| 2348 } | 2346 } |
| 2349 | 2347 |
| 2350 if (should_add_sync_turl) { | 2348 if (should_add_sync_turl) { |
| 2351 // Force the local ID to kInvalidTemplateURLID so we can add it. | 2349 // Force the local ID to kInvalidTemplateURLID so we can add it. |
| 2352 TemplateURLData data(sync_turl->data()); | 2350 TemplateURLData data(sync_turl->data()); |
| 2353 data.id = kInvalidTemplateURLID; | 2351 data.id = kInvalidTemplateURLID; |
| 2354 TemplateURL* added = new TemplateURL(data); | 2352 std::unique_ptr<TemplateURL> added_ptr = |
| 2353 base::MakeUnique<TemplateURL>(data); | |
| 2354 TemplateURL* added = added_ptr.get(); | |
| 2355 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 2355 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
| 2356 &dsp_change_origin_, DSP_CHANGE_SYNC_ADD); | 2356 &dsp_change_origin_, DSP_CHANGE_SYNC_ADD); |
| 2357 if (Add(added)) | 2357 if (Add(std::move(added_ptr))) |
| 2358 MaybeUpdateDSEAfterSync(added); | 2358 MaybeUpdateDSEAfterSync(added); |
| 2359 merge_result->set_num_items_added( | 2359 merge_result->set_num_items_added(merge_result->num_items_added() + 1); |
| 2360 merge_result->num_items_added() + 1); | |
| 2361 } | 2360 } |
| 2362 } | 2361 } |
| 2363 | 2362 |
| 2364 void TemplateURLService::PatchMissingSyncGUIDs( | 2363 void TemplateURLService::PatchMissingSyncGUIDs( |
| 2365 TemplateURLVector* template_urls) { | 2364 OwnedTemplateURLVector* template_urls) { |
| 2366 DCHECK(template_urls); | 2365 DCHECK(template_urls); |
| 2367 for (TemplateURLVector::iterator i = template_urls->begin(); | 2366 for (auto& template_url : *template_urls) { |
| 2368 i != template_urls->end(); ++i) { | |
| 2369 TemplateURL* template_url = *i; | |
| 2370 DCHECK(template_url); | 2367 DCHECK(template_url); |
| 2371 if (template_url->sync_guid().empty() && | 2368 if (template_url->sync_guid().empty() && |
| 2372 (template_url->GetType() == TemplateURL::NORMAL)) { | 2369 (template_url->GetType() == TemplateURL::NORMAL)) { |
| 2373 template_url->data_.sync_guid = base::GenerateGUID(); | 2370 template_url->data_.sync_guid = base::GenerateGUID(); |
| 2374 if (web_data_service_.get()) | 2371 if (web_data_service_.get()) |
| 2375 web_data_service_->UpdateKeyword(template_url->data()); | 2372 web_data_service_->UpdateKeyword(template_url->data()); |
| 2376 } | 2373 } |
| 2377 } | 2374 } |
| 2378 } | 2375 } |
| 2379 | 2376 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2417 for (typename Container::const_iterator i(match_range.first); | 2414 for (typename Container::const_iterator i(match_range.first); |
| 2418 i != match_range.second; ++i) { | 2415 i != match_range.second; ++i) { |
| 2419 if (!supports_replacement_only || | 2416 if (!supports_replacement_only || |
| 2420 i->second.first->url_ref().SupportsReplacement(search_terms_data())) | 2417 i->second.first->url_ref().SupportsReplacement(search_terms_data())) |
| 2421 matches->push_back(i->second); | 2418 matches->push_back(i->second); |
| 2422 } | 2419 } |
| 2423 } | 2420 } |
| 2424 | 2421 |
| 2425 TemplateURL* TemplateURLService::FindPrepopulatedTemplateURL( | 2422 TemplateURL* TemplateURLService::FindPrepopulatedTemplateURL( |
| 2426 int prepopulated_id) { | 2423 int prepopulated_id) { |
| 2427 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 2424 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2428 i != template_urls_.end(); ++i) { | 2425 if (turl->prepopulate_id() == prepopulated_id) |
| 2429 if ((*i)->prepopulate_id() == prepopulated_id) | 2426 return turl.get(); |
| 2430 return *i; | |
| 2431 } | 2427 } |
| 2432 return NULL; | 2428 return nullptr; |
| 2433 } | 2429 } |
| 2434 | 2430 |
| 2435 TemplateURL* TemplateURLService::FindTemplateURLForExtension( | 2431 TemplateURL* TemplateURLService::FindTemplateURLForExtension( |
| 2436 const std::string& extension_id, | 2432 const std::string& extension_id, |
| 2437 TemplateURL::Type type) { | 2433 TemplateURL::Type type) { |
| 2438 DCHECK_NE(TemplateURL::NORMAL, type); | 2434 DCHECK_NE(TemplateURL::NORMAL, type); |
| 2439 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 2435 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2440 i != template_urls_.end(); ++i) { | 2436 if (turl->GetType() == type && turl->GetExtensionId() == extension_id) |
| 2441 if ((*i)->GetType() == type && | 2437 return turl.get(); |
| 2442 (*i)->GetExtensionId() == extension_id) | |
| 2443 return *i; | |
| 2444 } | 2438 } |
| 2445 return NULL; | 2439 return nullptr; |
| 2446 } | 2440 } |
| 2447 | 2441 |
| 2448 TemplateURL* TemplateURLService::FindMatchingExtensionTemplateURL( | 2442 TemplateURL* TemplateURLService::FindMatchingExtensionTemplateURL( |
| 2449 const TemplateURLData& data, | 2443 const TemplateURLData& data, |
| 2450 TemplateURL::Type type) { | 2444 TemplateURL::Type type) { |
| 2451 DCHECK_NE(TemplateURL::NORMAL, type); | 2445 DCHECK_NE(TemplateURL::NORMAL, type); |
| 2452 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 2446 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2453 i != template_urls_.end(); ++i) { | 2447 if (turl->GetType() == type && |
| 2454 if ((*i)->GetType() == type && | 2448 TemplateURL::MatchesData(turl.get(), &data, search_terms_data())) |
| 2455 TemplateURL::MatchesData(*i, &data, search_terms_data())) | 2449 return turl.get(); |
| 2456 return *i; | |
| 2457 } | 2450 } |
| 2458 return NULL; | 2451 return nullptr; |
| 2459 } | 2452 } |
| 2460 | 2453 |
| 2461 void TemplateURLService::UpdateExtensionDefaultSearchEngine() { | 2454 void TemplateURLService::UpdateExtensionDefaultSearchEngine() { |
| 2462 TemplateURL* most_recently_intalled_default = NULL; | 2455 TemplateURL* most_recently_intalled_default = nullptr; |
| 2463 for (TemplateURLVector::const_iterator i = template_urls_.begin(); | 2456 for (auto& turl : template_urls_) { |
|
Peter Kasting
2016/08/31 04:12:57
Nit: const auto&?
Avi (use Gerrit)
2016/09/01 00:34:27
Done.
| |
| 2464 i != template_urls_.end(); ++i) { | 2457 if ((turl->GetType() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && |
| 2465 if (((*i)->GetType() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && | 2458 turl->extension_info_->wants_to_be_default_engine && |
| 2466 (*i)->extension_info_->wants_to_be_default_engine && | 2459 turl->SupportsReplacement(search_terms_data()) && |
| 2467 (*i)->SupportsReplacement(search_terms_data()) && | |
| 2468 (!most_recently_intalled_default || | 2460 (!most_recently_intalled_default || |
| 2469 (most_recently_intalled_default->extension_info_->install_time < | 2461 (most_recently_intalled_default->extension_info_->install_time < |
| 2470 (*i)->extension_info_->install_time))) | 2462 turl->extension_info_->install_time))) |
| 2471 most_recently_intalled_default = *i; | 2463 most_recently_intalled_default = turl.get(); |
| 2472 } | 2464 } |
| 2473 | 2465 |
| 2474 if (most_recently_intalled_default) { | 2466 if (most_recently_intalled_default) { |
| 2475 base::AutoReset<DefaultSearchChangeOrigin> change_origin( | 2467 base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
| 2476 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); | 2468 &dsp_change_origin_, DSP_CHANGE_OVERRIDE_SETTINGS_EXTENSION); |
| 2477 default_search_manager_.SetExtensionControlledDefaultSearchEngine( | 2469 default_search_manager_.SetExtensionControlledDefaultSearchEngine( |
| 2478 most_recently_intalled_default->data()); | 2470 most_recently_intalled_default->data()); |
| 2479 } else { | 2471 } else { |
| 2480 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); | 2472 default_search_manager_.ClearExtensionControlledDefaultSearchEngine(); |
| 2481 } | 2473 } |
| 2482 } | 2474 } |
| OLD | NEW |