Index: components/search_engines/template_url_service.cc |
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc |
index 772db1a9c04bfbb3c1c2174f3b193e0bd6943d3e..02f4b9a18f5cdce17428815b954dc269780cb185 100644 |
--- a/components/search_engines/template_url_service.cc |
+++ b/components/search_engines/template_url_service.cc |
@@ -13,10 +13,10 @@ |
#include "base/compiler_specific.h" |
#include "base/guid.h" |
#include "base/i18n/case_conversion.h" |
+#include "base/memory/ptr_util.h" |
#include "base/memory/scoped_vector.h" |
#include "base/metrics/histogram_macros.h" |
#include "base/profiler/scoped_tracker.h" |
-#include "base/stl_util.h" |
#include "base/strings/string_split.h" |
#include "base/strings/string_util.h" |
#include "base/strings/utf_string_conversions.h" |
@@ -183,7 +183,11 @@ size_t GetMeaningfulKeywordLength(const base::string16& keyword, |
// The meaningful keyword length is the length of any portion before the |
// registry ("co.uk") and its preceding dot. |
return keyword.length() - (registry_length ? (registry_length + 1) : 0); |
+} |
+bool Contains(TemplateURLService::OwnedTemplateURLVector* template_urls, |
+ TemplateURL* turl) { |
+ return FindTemplateURL(template_urls, turl) != template_urls->end(); |
} |
} // namespace |
@@ -207,9 +211,9 @@ class TemplateURLService::LessWithPrefix { |
bool operator()( |
const KeywordToTURLAndMeaningfulLength::value_type& elem1, |
const KeywordToTURLAndMeaningfulLength::value_type& elem2) const { |
- return (elem1.second.first == NULL) ? |
- (elem2.first.compare(0, elem1.first.length(), elem1.first) > 0) : |
- (elem1.first < elem2.first); |
+ return (elem1.second.first == nullptr) |
+ ? (elem2.first.compare(0, elem1.first.length(), elem1.first) > 0) |
+ : (elem1.first < elem2.first); |
} |
}; |
@@ -236,7 +240,7 @@ TemplateURLService::TemplateURLService( |
load_failed_(false), |
disable_load_(false), |
load_handle_(0), |
- default_search_provider_(NULL), |
+ default_search_provider_(nullptr), |
next_id_(kInvalidTemplateURLID + 1), |
clock_(new base::DefaultClock), |
models_associated_(false), |
@@ -247,22 +251,22 @@ TemplateURLService::TemplateURLService( |
base::Bind(&TemplateURLService::OnDefaultSearchChange, |
base::Unretained(this))) { |
DCHECK(search_terms_data_); |
- Init(NULL, 0); |
+ Init(nullptr, 0); |
} |
TemplateURLService::TemplateURLService(const Initializer* initializers, |
const int count) |
- : prefs_(NULL), |
+ : prefs_(nullptr), |
search_terms_data_(new SearchTermsData), |
- web_data_service_(NULL), |
- google_url_tracker_(NULL), |
- rappor_service_(NULL), |
+ web_data_service_(nullptr), |
+ google_url_tracker_(nullptr), |
+ rappor_service_(nullptr), |
provider_map_(new SearchHostToURLsMap), |
loaded_(false), |
load_failed_(false), |
disable_load_(false), |
load_handle_(0), |
- default_search_provider_(NULL), |
+ default_search_provider_(nullptr), |
next_id_(kInvalidTemplateURLID + 1), |
clock_(new base::DefaultClock), |
models_associated_(false), |
@@ -278,7 +282,6 @@ TemplateURLService::TemplateURLService(const Initializer* initializers, |
TemplateURLService::~TemplateURLService() { |
// |web_data_service_| should be deleted during Shutdown(). |
DCHECK(!web_data_service_.get()); |
- base::STLDeleteElements(&template_urls_); |
} |
// static |
@@ -411,10 +414,10 @@ TemplateURL* TemplateURLService::GetTemplateURLForKeyword( |
keyword_to_turl_and_length_.find(keyword)); |
if (elem != keyword_to_turl_and_length_.end()) |
return elem->second.first; |
- return (!loaded_ && |
- initial_default_search_provider_.get() && |
- (initial_default_search_provider_->keyword() == keyword)) ? |
- initial_default_search_provider_.get() : NULL; |
+ return (!loaded_ && initial_default_search_provider_ && |
+ (initial_default_search_provider_->keyword() == keyword)) |
+ ? initial_default_search_provider_.get() |
+ : nullptr; |
} |
TemplateURL* TemplateURLService::GetTemplateURLForGUID( |
@@ -422,10 +425,10 @@ TemplateURL* TemplateURLService::GetTemplateURLForGUID( |
GUIDToTURL::const_iterator elem(guid_to_turl_.find(sync_guid)); |
if (elem != guid_to_turl_.end()) |
return elem->second; |
- return (!loaded_ && |
- initial_default_search_provider_.get() && |
- (initial_default_search_provider_->sync_guid() == sync_guid)) ? |
- initial_default_search_provider_.get() : NULL; |
+ return (!loaded_ && initial_default_search_provider_ && |
+ (initial_default_search_provider_->sync_guid() == sync_guid)) |
+ ? initial_default_search_provider_.get() |
+ : nullptr; |
} |
TemplateURL* TemplateURLService::GetTemplateURLForHost( |
@@ -433,35 +436,37 @@ TemplateURL* TemplateURLService::GetTemplateURLForHost( |
if (loaded_) |
return provider_map_->GetTemplateURLForHost(host); |
TemplateURL* initial_dsp = initial_default_search_provider_.get(); |
- if (!initial_dsp) |
- return NULL; |
- return (initial_dsp->GenerateSearchURL(search_terms_data()).host() == host) ? |
- initial_dsp : NULL; |
+ return (initial_dsp && |
+ (initial_dsp->GenerateSearchURL(search_terms_data()).host() == host)) |
+ ? initial_dsp |
+ : nullptr; |
} |
-bool TemplateURLService::Add(TemplateURL* template_url) { |
+TemplateURL* TemplateURLService::Add( |
+ std::unique_ptr<TemplateURL> template_url) { |
KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
- if (!AddNoNotify(template_url, true)) |
- return false; |
- NotifyObservers(); |
- return true; |
+ TemplateURL* template_url_ptr = AddNoNotify(std::move(template_url), true); |
+ if (template_url_ptr) |
+ NotifyObservers(); |
+ return template_url_ptr; |
} |
-void TemplateURLService::AddWithOverrides(TemplateURL* template_url, |
- const base::string16& short_name, |
- const base::string16& keyword, |
- const std::string& url) { |
+TemplateURL* TemplateURLService::AddWithOverrides( |
+ std::unique_ptr<TemplateURL> template_url, |
+ const base::string16& short_name, |
+ const base::string16& keyword, |
+ const std::string& url) { |
DCHECK(!short_name.empty()); |
DCHECK(!keyword.empty()); |
DCHECK(!url.empty()); |
template_url->data_.SetShortName(short_name); |
template_url->data_.SetKeyword(keyword); |
template_url->SetURL(url); |
- Add(template_url); |
+ return Add(std::move(template_url)); |
} |
-void TemplateURLService::AddExtensionControlledTURL( |
- TemplateURL* template_url, |
+TemplateURL* TemplateURLService::AddExtensionControlledTURL( |
+ std::unique_ptr<TemplateURL> template_url, |
std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info) { |
DCHECK(loaded_); |
DCHECK(template_url); |
@@ -474,11 +479,15 @@ void TemplateURLService::AddExtensionControlledTURL( |
template_url->extension_info_.swap(info); |
KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
- if (AddNoNotify(template_url, true)) { |
- if (template_url->extension_info_->wants_to_be_default_engine) |
+ TemplateURL* template_url_ptr = AddNoNotify(std::move(template_url), true); |
+ if (template_url_ptr) { |
+ if (template_url_ptr->extension_info_->wants_to_be_default_engine) { |
UpdateExtensionDefaultSearchEngine(); |
+ } |
NotifyObservers(); |
} |
+ |
+ return template_url_ptr; |
} |
void TemplateURLService::Remove(TemplateURL* template_url) { |
@@ -496,7 +505,7 @@ void TemplateURLService::RemoveExtensionControlledTURL( |
// NULL this out so that we can call RemoveNoNotify. |
// UpdateExtensionDefaultSearchEngine will cause it to be reset. |
if (default_search_provider_ == url) |
- default_search_provider_ = NULL; |
+ default_search_provider_ = nullptr; |
KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
RemoveNoNotify(url); |
UpdateExtensionDefaultSearchEngine(); |
@@ -523,11 +532,11 @@ void TemplateURLService::RemoveAutoGeneratedForUrlsBetween( |
if (template_urls_[i]->date_created() >= created_after && |
(created_before.is_null() || |
template_urls_[i]->date_created() < created_before) && |
- CanReplace(template_urls_[i]) && |
+ CanReplace(template_urls_[i].get()) && |
(url_filter.is_null() || |
url_filter.Run( |
template_urls_[i]->GenerateSearchURL(search_terms_data())))) { |
- RemoveNoNotify(template_urls_[i]); |
+ RemoveNoNotify(template_urls_[i].get()); |
should_notify = true; |
} else { |
++i; |
@@ -552,15 +561,18 @@ void TemplateURLService::RegisterOmniboxKeyword( |
data.SetShortName(base::UTF8ToUTF16(extension_name)); |
data.SetKeyword(base::UTF8ToUTF16(keyword)); |
data.SetURL(template_url_string); |
- TemplateURL* url = new TemplateURL(data); |
std::unique_ptr<TemplateURL::AssociatedExtensionInfo> info( |
new TemplateURL::AssociatedExtensionInfo( |
TemplateURL::OMNIBOX_API_EXTENSION, extension_id)); |
- AddExtensionControlledTURL(url, std::move(info)); |
+ AddExtensionControlledTURL(base::MakeUnique<TemplateURL>(data), |
+ std::move(info)); |
} |
TemplateURLService::TemplateURLVector TemplateURLService::GetTemplateURLs() { |
- return template_urls_; |
+ TemplateURLVector result; |
+ for (const auto& turl : template_urls_) |
+ result.push_back(turl.get()); |
+ return result; |
} |
void TemplateURLService::IncrementUsageCount(TemplateURL* url) { |
@@ -568,8 +580,7 @@ void TemplateURLService::IncrementUsageCount(TemplateURL* url) { |
// Extension-controlled search engines are not persisted. |
if (url->GetType() != TemplateURL::NORMAL) |
return; |
- if (std::find(template_urls_.begin(), template_urls_.end(), url) == |
- template_urls_.end()) |
+ if (!Contains(&template_urls_, url)) |
return; |
++url->data_.usage_count; |
@@ -606,7 +617,7 @@ void TemplateURLService::SetUserSelectedDefaultSearchProvider( |
if ((default_search_provider_source_ == DefaultSearchManager::FROM_USER) || |
(default_search_provider_source_ == |
DefaultSearchManager::FROM_FALLBACK)) { |
- ApplyDefaultSearchChange(url ? &url->data() : NULL, |
+ ApplyDefaultSearchChange(url ? &url->data() : nullptr, |
DefaultSearchManager::FROM_USER); |
} |
} else { |
@@ -650,7 +661,7 @@ void TemplateURLService::RepairPrepopulatedSearchEngines() { |
DefaultSearchManager::FROM_FALLBACK)) { |
// Clear |default_search_provider_| in case we want to remove the engine it |
// points to. This will get reset at the end of the function anyway. |
- default_search_provider_ = NULL; |
+ default_search_provider_ = nullptr; |
} |
size_t default_search_provider_index = 0; |
@@ -680,7 +691,7 @@ void TemplateURLService::RepairPrepopulatedSearchEngines() { |
actions.added_engines.begin(); |
i < actions.added_engines.end(); |
++i) { |
- AddNoNotify(new TemplateURL(*i), true); |
+ AddNoNotify(base::MakeUnique<TemplateURL>(*i), true); |
} |
base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
@@ -751,12 +762,13 @@ void TemplateURLService::OnWebDataServiceRequestDone( |
// Results are null if the database went away or (most likely) wasn't |
// loaded. |
load_failed_ = true; |
- web_data_service_ = NULL; |
+ web_data_service_ = nullptr; |
ChangeToLoadedState(); |
return; |
} |
- TemplateURLVector template_urls; |
+ std::unique_ptr<OwnedTemplateURLVector> template_urls = |
+ base::MakeUnique<OwnedTemplateURLVector>(); |
int new_resource_keyword_version = 0; |
{ |
// TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
@@ -766,10 +778,10 @@ void TemplateURLService::OnWebDataServiceRequestDone( |
"422460 TemplateURLService::OnWebDataServiceRequestDone 2")); |
GetSearchProvidersUsingKeywordResult( |
- *result, web_data_service_.get(), prefs_, &template_urls, |
+ *result, web_data_service_.get(), prefs_, template_urls.get(), |
(default_search_provider_source_ == DefaultSearchManager::FROM_USER) |
? initial_default_search_provider_.get() |
- : NULL, |
+ : nullptr, |
search_terms_data(), &new_resource_keyword_version, &pre_sync_deletes_); |
} |
@@ -782,7 +794,7 @@ void TemplateURLService::OnWebDataServiceRequestDone( |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"422460 TemplateURLService::OnWebDataServiceRequestDone 4")); |
- PatchMissingSyncGUIDs(&template_urls); |
+ PatchMissingSyncGUIDs(template_urls.get()); |
// TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
// is fixed. |
@@ -790,7 +802,7 @@ void TemplateURLService::OnWebDataServiceRequestDone( |
FROM_HERE_WITH_EXPLICIT_FUNCTION( |
"422460 TemplateURLService::OnWebDataServiceRequestDone 41")); |
- SetTemplateURLs(&template_urls); |
+ SetTemplateURLs(std::move(template_urls)); |
// TODO(robliao): Remove ScopedTracker below once https://crbug.com/422460 |
// is fixed. |
@@ -880,7 +892,7 @@ void TemplateURLService::Shutdown() { |
DCHECK(web_data_service_.get()); |
web_data_service_->CancelRequest(load_handle_); |
} |
- web_data_service_ = NULL; |
+ web_data_service_ = nullptr; |
} |
syncer::SyncDataList TemplateURLService::GetAllSyncData( |
@@ -888,15 +900,14 @@ syncer::SyncDataList TemplateURLService::GetAllSyncData( |
DCHECK_EQ(syncer::SEARCH_ENGINES, type); |
syncer::SyncDataList current_data; |
- for (TemplateURLVector::const_iterator iter = template_urls_.begin(); |
- iter != template_urls_.end(); ++iter) { |
+ for (const auto& turl : template_urls_) { |
// We don't sync keywords managed by policy. |
- if ((*iter)->created_by_policy()) |
+ if (turl->created_by_policy()) |
continue; |
// We don't sync extension-controlled search engines. |
- if ((*iter)->GetType() != TemplateURL::NORMAL) |
+ if (turl->GetType() != TemplateURL::NORMAL) |
continue; |
- current_data.push_back(CreateSyncDataFromTemplateURL(**iter)); |
+ current_data.push_back(CreateSyncDataFromTemplateURL(*turl)); |
} |
return current_data; |
@@ -1004,8 +1015,10 @@ syncer::SyncError TemplateURLService::ProcessSyncChanges( |
// Force the local ID to kInvalidTemplateURLID so we can add it. |
TemplateURLData data(turl->data()); |
data.id = kInvalidTemplateURLID; |
- TemplateURL* added = new TemplateURL(data); |
- if (Add(added)) |
+ std::unique_ptr<TemplateURL> added_ptr = |
+ base::MakeUnique<TemplateURL>(data); |
+ TemplateURL* added = added_ptr.get(); |
+ if (Add(std::move(added_ptr))) |
MaybeUpdateDSEAfterSync(added); |
} else if (iter->change_type() == syncer::SyncChange::ACTION_UPDATE) { |
if (!existing_turl) { |
@@ -1278,7 +1291,7 @@ TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData( |
sync_data)); |
UMA_HISTOGRAM_ENUMERATION(kDeleteSyncedEngineHistogramName, |
DELETE_ENGINE_EMPTY_FIELD, DELETE_ENGINE_MAX); |
- return NULL; |
+ return nullptr; |
} |
TemplateURLData data(existing_turl ? |
@@ -1340,7 +1353,7 @@ TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData( |
DCHECK(client); |
client->RestoreExtensionInfoIfNecessary(turl.get()); |
if (turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) |
- return NULL; |
+ return nullptr; |
DCHECK_EQ(TemplateURL::NORMAL, turl->GetType()); |
if (reset_keyword || deduped) { |
@@ -1424,8 +1437,7 @@ void TemplateURLService::Init(const Initializer* initializers, |
data.SetShortName(base::UTF8ToUTF16(initializers[i].content)); |
data.SetKeyword(base::UTF8ToUTF16(initializers[i].keyword)); |
data.SetURL(initializers[i].url); |
- TemplateURL* template_url = new TemplateURL(data); |
- AddNoNotify(template_url, true); |
+ AddNoNotify(base::MakeUnique<TemplateURL>(data), true); |
// Set the first provided identifier to be the default. |
if (i == 0) |
@@ -1448,18 +1460,16 @@ void TemplateURLService::RemoveFromMaps(TemplateURL* template_url) { |
// In the case of more than one extension, we use the most recently |
// installed (which will be the most recently added, which will have the |
// highest ID). |
- TemplateURL* best_fallback = NULL; |
- for (TemplateURLVector::const_iterator i(template_urls_.begin()); |
- i != template_urls_.end(); ++i) { |
- TemplateURL* turl = *i; |
+ TemplateURL* best_fallback = nullptr; |
+ for (const auto& turl : template_urls_) { |
// This next statement relies on the fact that there can only be one |
// non-Omnibox API TemplateURL with a given keyword. |
- if ((turl != template_url) && (turl->keyword() == keyword) && |
+ if ((turl.get() != template_url) && (turl->keyword() == keyword) && |
(!best_fallback || |
(best_fallback->GetType() != TemplateURL::OMNIBOX_API_EXTENSION) || |
((turl->GetType() == TemplateURL::OMNIBOX_API_EXTENSION) && |
(turl->id() > best_fallback->id())))) |
- best_fallback = turl; |
+ best_fallback = turl.get(); |
} |
RemoveFromDomainMap(template_url); |
if (best_fallback) { |
@@ -1551,37 +1561,29 @@ void TemplateURLService::AddToMap(TemplateURL* template_url) { |
template_url, GetMeaningfulKeywordLength(keyword, template_url)); |
} |
-// Helper for partition() call in next function. |
-bool HasValidID(TemplateURL* t_url) { |
- return t_url->id() != kInvalidTemplateURLID; |
-} |
- |
-void TemplateURLService::SetTemplateURLs(TemplateURLVector* urls) { |
+void TemplateURLService::SetTemplateURLs( |
+ std::unique_ptr<OwnedTemplateURLVector> urls) { |
// Partition the URLs first, instead of implementing the loops below by simply |
// scanning the input twice. While it's not supposed to happen normally, it's |
// possible for corrupt databases to return multiple entries with the same |
// keyword. In this case, the first loop may delete the first entry when |
// adding the second. If this happens, the second loop must not attempt to |
// access the deleted entry. Partitioning ensures this constraint. |
- TemplateURLVector::iterator first_invalid( |
- std::partition(urls->begin(), urls->end(), HasValidID)); |
+ auto first_invalid = std::partition( |
+ urls->begin(), urls->end(), [](const std::unique_ptr<TemplateURL>& turl) { |
+ return turl->id() != kInvalidTemplateURLID; |
+ }); |
// First, add the items that already have id's, so that the next_id_ gets |
// properly set. |
- for (TemplateURLVector::const_iterator i = urls->begin(); i != first_invalid; |
- ++i) { |
+ for (auto i = urls->begin(); i != first_invalid; ++i) { |
next_id_ = std::max(next_id_, (*i)->id()); |
- AddNoNotify(*i, false); |
+ AddNoNotify(std::move(*i), false); |
} |
// Next add the new items that don't have id's. |
- for (TemplateURLVector::const_iterator i = first_invalid; i != urls->end(); |
- ++i) |
- AddNoNotify(*i, true); |
- |
- // Clear the input vector to reduce the chance callers will try to use a |
- // (possibly deleted) entry. |
- urls->clear(); |
+ for (auto i = first_invalid; i != urls->end(); ++i) |
+ AddNoNotify(std::move(*i), true); |
} |
void TemplateURLService::ChangeToLoadedState() { |
@@ -1604,8 +1606,9 @@ void TemplateURLService::ChangeToLoadedState() { |
// This will cause a call to NotifyObservers(). |
ApplyDefaultSearchChangeNoMetrics( |
- initial_default_search_provider_ ? |
- &initial_default_search_provider_->data() : NULL, |
+ initial_default_search_provider_ |
+ ? &initial_default_search_provider_->data() |
+ : nullptr, |
default_search_provider_source_); |
initial_default_search_provider_.reset(); |
@@ -1642,20 +1645,18 @@ TemplateURL* TemplateURLService::FindNonExtensionTemplateURLForKeyword( |
return keyword_turl; |
// The extension keyword in the model may be hiding a replaceable |
// non-extension keyword. Look for it. |
- for (TemplateURLVector::const_iterator i(template_urls_.begin()); |
- i != template_urls_.end(); ++i) { |
- if (((*i)->GetType() == TemplateURL::NORMAL) && |
- ((*i)->keyword() == keyword)) |
- return *i; |
+ for (const auto& turl : template_urls_) { |
+ if ((turl->GetType() == TemplateURL::NORMAL) && |
+ (turl->keyword() == keyword)) |
+ return turl.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
bool TemplateURLService::UpdateNoNotify(TemplateURL* existing_turl, |
const TemplateURL& new_values) { |
DCHECK(existing_turl); |
- if (std::find(template_urls_.begin(), template_urls_.end(), existing_turl) == |
- template_urls_.end()) |
+ if (!Contains(&template_urls_, existing_turl)) |
return false; |
DCHECK_NE(TemplateURL::OMNIBOX_API_EXTENSION, existing_turl->GetType()); |
@@ -1828,32 +1829,30 @@ void TemplateURLService::GoogleBaseURLChanged() { |
KeywordWebDataService::BatchModeScoper scoper(web_data_service_.get()); |
bool something_changed = false; |
- for (TemplateURLVector::iterator i(template_urls_.begin()); |
- i != template_urls_.end(); ++i) { |
- TemplateURL* t_url = *i; |
- if (t_url->HasGoogleBaseURLs(search_terms_data())) { |
- TemplateURL updated_turl(t_url->data()); |
+ for (const auto& turl : template_urls_) { |
+ if (turl->HasGoogleBaseURLs(search_terms_data())) { |
+ TemplateURL updated_turl(turl->data()); |
updated_turl.ResetKeywordIfNecessary(search_terms_data(), false); |
KeywordToTURLAndMeaningfulLength::const_iterator existing_entry = |
keyword_to_turl_and_length_.find(updated_turl.keyword()); |
if ((existing_entry != keyword_to_turl_and_length_.end()) && |
- (existing_entry->second.first != t_url)) { |
+ (existing_entry->second.first != turl.get())) { |
// The new autogenerated keyword conflicts with another TemplateURL. |
- // Overwrite it if it's replaceable; otherwise, leave |t_url| using its |
- // current keyword. (This will not prevent |t_url| from auto-updating |
+ // Overwrite it if it's replaceable; otherwise, leave |turl| using its |
+ // current keyword. (This will not prevent |turl| from auto-updating |
// the keyword in the future if the conflicting TemplateURL disappears.) |
- // Note that we must still update |t_url| in this case, or the |
+ // Note that we must still update |turl| in this case, or the |
// |provider_map_| will not be updated correctly. |
if (CanReplace(existing_entry->second.first)) |
RemoveNoNotify(existing_entry->second.first); |
else |
- updated_turl.data_.SetKeyword(t_url->keyword()); |
+ updated_turl.data_.SetKeyword(turl->keyword()); |
} |
something_changed = true; |
// This will send the keyword change to sync. Note that other clients |
// need to reset the keyword to an appropriate local value when this |
// change arrives; see CreateTemplateURLFromTemplateURLAndSyncData(). |
- UpdateNoNotify(t_url, updated_turl); |
+ UpdateNoNotify(turl.get(), updated_turl); |
} |
} |
if (something_changed) |
@@ -1896,8 +1895,8 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
// default. |
bool changed = TemplateURL::MatchesData( |
initial_default_search_provider_.get(), data, search_terms_data()); |
- initial_default_search_provider_.reset( |
- data ? new TemplateURL(*data) : NULL); |
+ initial_default_search_provider_ = |
+ data ? base::MakeUnique<TemplateURL>(*data) : nullptr; |
default_search_provider_source_ = source; |
return changed; |
} |
@@ -1906,7 +1905,7 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
// Note that we exclude the case of data == NULL because that could cause a |
// false positive for recursion when the initial_default_search_provider_ is |
// NULL due to policy. We'll never actually get recursion with data == NULL. |
- if (source == default_search_provider_source_ && data != NULL && |
+ if (source == default_search_provider_source_ && data != nullptr && |
TemplateURL::MatchesData(default_search_provider_, data, |
search_terms_data())) |
return false; |
@@ -1922,11 +1921,11 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
// well as to add the new one, if appropriate. |
UpdateProvidersCreatedByPolicy( |
&template_urls_, |
- source == DefaultSearchManager::FROM_POLICY ? data : NULL); |
+ source == DefaultSearchManager::FROM_POLICY ? data : nullptr); |
} |
if (!data) { |
- default_search_provider_ = NULL; |
+ default_search_provider_ = nullptr; |
} else if (source == DefaultSearchManager::FROM_EXTENSION) { |
default_search_provider_ = FindMatchingExtensionTemplateURL( |
*data, TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION); |
@@ -1948,8 +1947,10 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
// (1) Tests that initialize the TemplateURLService in peculiar ways. |
// (2) If the user deleted the pre-populated default and we subsequently |
// lost their user-selected value. |
- TemplateURL* new_dse = new TemplateURL(*data); |
- if (AddNoNotify(new_dse, true)) |
+ std::unique_ptr<TemplateURL> new_dse_ptr = |
+ base::MakeUnique<TemplateURL>(*data); |
+ TemplateURL* new_dse = new_dse_ptr.get(); |
+ if (AddNoNotify(std::move(new_dse_ptr), true)) |
default_search_provider_ = new_dse; |
} |
} else if (source == DefaultSearchManager::FROM_USER) { |
@@ -1964,8 +1965,10 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
UpdateNoNotify(default_search_provider_, TemplateURL(new_data)); |
} else { |
new_data.id = kInvalidTemplateURLID; |
- TemplateURL* new_dse = new TemplateURL(new_data); |
- if (AddNoNotify(new_dse, true)) |
+ std::unique_ptr<TemplateURL> new_dse_ptr = |
+ base::MakeUnique<TemplateURL>(new_data); |
+ TemplateURL* new_dse = new_dse_ptr.get(); |
+ if (AddNoNotify(std::move(new_dse_ptr), true)) |
default_search_provider_ = new_dse; |
} |
if (default_search_provider_ && prefs_) { |
@@ -1986,14 +1989,14 @@ bool TemplateURLService::ApplyDefaultSearchChangeNoMetrics( |
return changed; |
} |
-bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |
- bool newly_adding) { |
+TemplateURL* TemplateURLService::AddNoNotify( |
+ std::unique_ptr<TemplateURL> template_url, |
+ bool newly_adding) { |
DCHECK(template_url); |
if (newly_adding) { |
DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
- DCHECK(std::find(template_urls_.begin(), template_urls_.end(), |
- template_url) == template_urls_.end()); |
+ DCHECK(!Contains(&template_urls_, template_url.get())); |
template_url->data_.id = ++next_id_; |
} |
@@ -2015,18 +2018,16 @@ bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |
if (template_url->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && |
existing_keyword_turl && |
existing_keyword_turl->GetType() != TemplateURL::OMNIBOX_API_EXTENSION && |
- (std::find(template_urls_.begin(), template_urls_.end(), |
- existing_keyword_turl) != template_urls_.end())) { |
- DCHECK_NE(existing_keyword_turl, template_url); |
+ Contains(&template_urls_, existing_keyword_turl)) { |
+ DCHECK_NE(existing_keyword_turl, template_url.get()); |
// Only replace one of the TemplateURLs if they are either both extensions, |
// or both not extensions. |
bool are_same_type = existing_keyword_turl->GetType() == |
template_url->GetType(); |
if (CanReplace(existing_keyword_turl) && are_same_type) { |
RemoveNoNotify(existing_keyword_turl); |
- } else if (CanReplace(template_url) && are_same_type) { |
- delete template_url; |
- return false; |
+ } else if (CanReplace(template_url.get()) && are_same_type) { |
+ return nullptr; |
} else { |
base::string16 new_keyword = |
UniquifyKeyword(*existing_keyword_turl, false); |
@@ -2035,35 +2036,34 @@ bool TemplateURLService::AddNoNotify(TemplateURL* template_url, |
existing_keyword_turl->url()); |
} |
} |
- template_urls_.push_back(template_url); |
- AddToMaps(template_url); |
+ TemplateURL* template_url_ptr = template_url.get(); |
+ template_urls_.push_back(std::move(template_url)); |
+ AddToMaps(template_url_ptr); |
- if (newly_adding && |
- (template_url->GetType() == TemplateURL::NORMAL)) { |
+ if (newly_adding && (template_url_ptr->GetType() == TemplateURL::NORMAL)) { |
if (web_data_service_.get()) |
- web_data_service_->AddKeyword(template_url->data()); |
+ web_data_service_->AddKeyword(template_url_ptr->data()); |
// Inform sync of the addition. Note that this will assign a GUID to |
// template_url and add it to the guid_to_turl_. |
- ProcessTemplateURLChange(FROM_HERE, |
- template_url, |
+ ProcessTemplateURLChange(FROM_HERE, template_url_ptr, |
syncer::SyncChange::ACTION_ADD); |
} |
- return true; |
+ return template_url_ptr; |
} |
void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) { |
DCHECK(template_url != default_search_provider_); |
- TemplateURLVector::iterator i = |
- std::find(template_urls_.begin(), template_urls_.end(), template_url); |
+ auto i = FindTemplateURL(&template_urls_, template_url); |
if (i == template_urls_.end()) |
return; |
RemoveFromMaps(template_url); |
// Remove it from the vector containing all TemplateURLs. |
+ std::unique_ptr<TemplateURL> scoped_turl = std::move(*i); |
template_urls_.erase(i); |
if (template_url->GetType() == TemplateURL::NORMAL) { |
@@ -2081,9 +2081,6 @@ void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) { |
if (loaded_ && client_) |
client_->DeleteAllSearchTermsForKeyword(template_url->id()); |
- |
- // We own the TemplateURL and need to delete it. |
- delete template_url; |
} |
bool TemplateURLService::ResetTemplateURLNoNotify( |
@@ -2122,13 +2119,12 @@ void TemplateURLService::NotifyObservers() { |
// that were set by policy, unless it is the current default search provider, in |
// which case it is updated with the data from prefs. |
void TemplateURLService::UpdateProvidersCreatedByPolicy( |
- TemplateURLVector* template_urls, |
+ OwnedTemplateURLVector* template_urls, |
const TemplateURLData* default_from_prefs) { |
DCHECK(template_urls); |
- for (TemplateURLVector::iterator i = template_urls->begin(); |
- i != template_urls->end(); ) { |
- TemplateURL* template_url = *i; |
+ for (auto i = template_urls->begin(); i != template_urls->end();) { |
+ TemplateURL* template_url = i->get(); |
if (template_url->created_by_policy()) { |
if (default_from_prefs && |
TemplateURL::MatchesData(template_url, default_from_prefs, |
@@ -2139,30 +2135,32 @@ void TemplateURLService::UpdateProvidersCreatedByPolicy( |
// database and the |default_search_provider|. |
default_search_provider_ = template_url; |
// Prevent us from saving any other entries, or creating a new one. |
- default_from_prefs = NULL; |
+ default_from_prefs = nullptr; |
++i; |
continue; |
} |
+ TemplateURLID id = template_url->id(); |
RemoveFromMaps(template_url); |
i = template_urls->erase(i); |
if (web_data_service_.get()) |
- web_data_service_->RemoveKeyword(template_url->id()); |
- delete template_url; |
+ web_data_service_->RemoveKeyword(id); |
} else { |
++i; |
} |
} |
if (default_from_prefs) { |
- default_search_provider_ = NULL; |
+ default_search_provider_ = nullptr; |
default_search_provider_source_ = DefaultSearchManager::FROM_POLICY; |
TemplateURLData new_data(*default_from_prefs); |
if (new_data.sync_guid.empty()) |
new_data.sync_guid = base::GenerateGUID(); |
new_data.created_by_policy = true; |
- TemplateURL* new_dse = new TemplateURL(new_data); |
- if (AddNoNotify(new_dse, true)) |
+ std::unique_ptr<TemplateURL> new_dse_ptr = |
+ base::MakeUnique<TemplateURL>(new_data); |
+ TemplateURL* new_dse = new_dse_ptr.get(); |
+ if (AddNoNotify(std::move(new_dse_ptr), true)) |
default_search_provider_ = new_dse; |
} |
} |
@@ -2352,22 +2350,21 @@ void TemplateURLService::MergeInSyncTemplateURL( |
// Force the local ID to kInvalidTemplateURLID so we can add it. |
TemplateURLData data(sync_turl->data()); |
data.id = kInvalidTemplateURLID; |
- TemplateURL* added = new TemplateURL(data); |
+ std::unique_ptr<TemplateURL> added_ptr = |
+ base::MakeUnique<TemplateURL>(data); |
+ TemplateURL* added = added_ptr.get(); |
base::AutoReset<DefaultSearchChangeOrigin> change_origin( |
&dsp_change_origin_, DSP_CHANGE_SYNC_ADD); |
- if (Add(added)) |
+ if (Add(std::move(added_ptr))) |
MaybeUpdateDSEAfterSync(added); |
- merge_result->set_num_items_added( |
- merge_result->num_items_added() + 1); |
+ merge_result->set_num_items_added(merge_result->num_items_added() + 1); |
} |
} |
void TemplateURLService::PatchMissingSyncGUIDs( |
- TemplateURLVector* template_urls) { |
+ OwnedTemplateURLVector* template_urls) { |
DCHECK(template_urls); |
- for (TemplateURLVector::iterator i = template_urls->begin(); |
- i != template_urls->end(); ++i) { |
- TemplateURL* template_url = *i; |
+ for (auto& template_url : *template_urls) { |
DCHECK(template_url); |
if (template_url->sync_guid().empty() && |
(template_url->GetType() == TemplateURL::NORMAL)) { |
@@ -2425,51 +2422,46 @@ void TemplateURLService::AddMatchingKeywordsHelper( |
TemplateURL* TemplateURLService::FindPrepopulatedTemplateURL( |
int prepopulated_id) { |
- for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
- i != template_urls_.end(); ++i) { |
- if ((*i)->prepopulate_id() == prepopulated_id) |
- return *i; |
+ for (const auto& turl : template_urls_) { |
+ if (turl->prepopulate_id() == prepopulated_id) |
+ return turl.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
TemplateURL* TemplateURLService::FindTemplateURLForExtension( |
const std::string& extension_id, |
TemplateURL::Type type) { |
DCHECK_NE(TemplateURL::NORMAL, type); |
- for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
- i != template_urls_.end(); ++i) { |
- if ((*i)->GetType() == type && |
- (*i)->GetExtensionId() == extension_id) |
- return *i; |
+ for (const auto& turl : template_urls_) { |
+ if (turl->GetType() == type && turl->GetExtensionId() == extension_id) |
+ return turl.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
TemplateURL* TemplateURLService::FindMatchingExtensionTemplateURL( |
const TemplateURLData& data, |
TemplateURL::Type type) { |
DCHECK_NE(TemplateURL::NORMAL, type); |
- for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
- i != template_urls_.end(); ++i) { |
- if ((*i)->GetType() == type && |
- TemplateURL::MatchesData(*i, &data, search_terms_data())) |
- return *i; |
+ for (const auto& turl : template_urls_) { |
+ if (turl->GetType() == type && |
+ TemplateURL::MatchesData(turl.get(), &data, search_terms_data())) |
+ return turl.get(); |
} |
- return NULL; |
+ return nullptr; |
} |
void TemplateURLService::UpdateExtensionDefaultSearchEngine() { |
- TemplateURL* most_recently_intalled_default = NULL; |
- for (TemplateURLVector::const_iterator i = template_urls_.begin(); |
- i != template_urls_.end(); ++i) { |
- if (((*i)->GetType() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && |
- (*i)->extension_info_->wants_to_be_default_engine && |
- (*i)->SupportsReplacement(search_terms_data()) && |
+ TemplateURL* most_recently_intalled_default = nullptr; |
+ for (const auto& turl : template_urls_) { |
+ if ((turl->GetType() == TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) && |
+ turl->extension_info_->wants_to_be_default_engine && |
+ turl->SupportsReplacement(search_terms_data()) && |
(!most_recently_intalled_default || |
(most_recently_intalled_default->extension_info_->install_time < |
- (*i)->extension_info_->install_time))) |
- most_recently_intalled_default = *i; |
+ turl->extension_info_->install_time))) |
+ most_recently_intalled_default = turl.get(); |
} |
if (most_recently_intalled_default) { |