Index: chrome/browser/search_engines/template_url_service.cc |
=================================================================== |
--- chrome/browser/search_engines/template_url_service.cc (revision 130759) |
+++ chrome/browser/search_engines/template_url_service.cc (working copy) |
@@ -315,6 +315,17 @@ |
NotifyObservers(); |
} |
+void TemplateURLService::AddWithOverrides(const TemplateURL* template_url, |
+ const string16& short_name, |
+ const string16& keyword, |
+ const std::string& url) { |
+ TemplateURL* modifiable_url = const_cast<TemplateURL*>(template_url); |
+ modifiable_url->data_.short_name = short_name; |
+ modifiable_url->data_.SetKeyword(keyword); |
+ modifiable_url->SetURL(url); |
+ Add(modifiable_url); |
+} |
+ |
void TemplateURLService::Remove(const TemplateURL* template_url) { |
RemoveNoNotify(template_url); |
NotifyObservers(); |
@@ -367,15 +378,14 @@ |
const TemplateURL* existing_url = GetTemplateURLForExtension(extension); |
string16 keyword = UTF8ToUTF16(extension->omnibox_keyword()); |
- scoped_ptr<TemplateURL> template_url(new TemplateURL); |
- template_url->set_short_name(UTF8ToUTF16(extension->name())); |
- template_url->set_keyword(keyword); |
+ TemplateURLData data; |
+ data.short_name = UTF8ToUTF16(extension->name()); |
+ data.SetKeyword(UTF8ToUTF16(extension->omnibox_keyword())); |
// This URL is not actually used for navigation. It holds the extension's |
// ID, as well as forcing the TemplateURL to be treated as a search keyword. |
- template_url->SetURL( |
- std::string(chrome::kExtensionScheme) + "://" + |
- extension->id() + "/?q={searchTerms}"); |
- template_url->set_safe_for_autoreplace(false); |
+ data.SetURL(std::string(chrome::kExtensionScheme) + "://" + extension->id() + |
+ "/?q={searchTerms}"); |
+ scoped_ptr<TemplateURL> template_url(new TemplateURL(data)); |
if (existing_url) { |
// TODO(mpcomplete): only replace if the user hasn't changed the keyword. |
@@ -413,25 +423,26 @@ |
void TemplateURLService::IncrementUsageCount(const TemplateURL* url) { |
DCHECK(url && std::find(template_urls_.begin(), template_urls_.end(), url) != |
template_urls_.end()); |
- const_cast<TemplateURL*>(url)->set_usage_count(url->usage_count() + 1); |
+ ++const_cast<TemplateURL*>(url)->data_.usage_count; |
if (service_.get()) |
- service_.get()->UpdateKeyword(*url); |
+ service_->UpdateKeyword(*url); |
} |
void TemplateURLService::ResetTemplateURL(const TemplateURL* url, |
const string16& title, |
const string16& keyword, |
const std::string& search_url) { |
- TemplateURL new_url(*url); |
- new_url.set_short_name(title); |
- new_url.set_keyword(keyword); |
- if (new_url.url() != search_url) { |
- new_url.SetURL(search_url); |
+ TemplateURLData data(url->data()); |
+ data.short_name = title; |
+ data.SetKeyword(keyword); |
+ if (search_url != data.url()) { |
+ data.SetURL(search_url); |
// The urls have changed, reset the favicon url. |
- new_url.set_favicon_url(GURL()); |
+ data.favicon_url = GURL(); |
} |
- new_url.set_safe_for_autoreplace(false); |
- new_url.set_last_modified(time_provider_()); |
+ data.safe_for_autoreplace = false; |
+ data.last_modified = time_provider_(); |
+ TemplateURL new_url(data); |
UpdateNoNotify(url, new_url); |
NotifyObservers(); |
} |
@@ -567,16 +578,15 @@ |
// Reuse it. |
} else { |
// The value from the preferences takes over. |
- // |
- // AddNoNotify will take ownership of default_from_prefs so it is safe to |
- // release. If it's null, there's no ownership to worry about :-) |
- TemplateURL* managed_default = default_from_prefs.release(); |
- if (managed_default) { |
- managed_default->set_created_by_policy(true); |
- managed_default->set_id(kInvalidTemplateURLID); |
+ default_search_provider = NULL; |
+ if (default_from_prefs.get()) { |
+ TemplateURLData data(default_from_prefs->data()); |
+ data.created_by_policy = true; |
+ data.id = kInvalidTemplateURLID; |
+ TemplateURL* managed_default = new TemplateURL(data); |
AddNoNotify(managed_default); |
+ default_search_provider = managed_default; |
} |
- default_search_provider = managed_default; |
} |
// Note that this saves the default search provider to prefs. |
SetDefaultSearchProviderNoNotify(default_search_provider); |
@@ -588,7 +598,7 @@ |
default_search_provider = synced_default; |
pending_synced_default_search_ = false; |
} else if (database_specified_a_default && |
- NULL == default_search_provider && |
+ default_search_provider == NULL && |
!template_urls.empty()) { |
default_search_provider = template_urls[0]; |
} |
@@ -750,14 +760,12 @@ |
iter != change_list.end(); ++iter) { |
DCHECK_EQ(syncable::SEARCH_ENGINES, iter->sync_data().GetDataType()); |
- scoped_ptr<TemplateURL> turl( |
- CreateTemplateURLFromSyncData(iter->sync_data())); |
- if (!turl.get()) { |
- NOTREACHED() << "Failed to read search engine."; |
- continue; |
- } |
+ std::string guid = |
+ iter->sync_data().GetSpecifics().search_engine().sync_guid(); |
+ const TemplateURL* existing_turl = GetTemplateURLForGUID(guid); |
+ scoped_ptr<TemplateURL> turl(CreateTemplateURLFromTemplateURLAndSyncData( |
+ existing_turl, iter->sync_data())); |
- const TemplateURL* existing_turl = GetTemplateURLForGUID(turl->sync_guid()); |
const TemplateURL* existing_keyword_turl = |
GetTemplateURLForKeyword(turl->keyword()); |
@@ -781,8 +789,9 @@ |
if (existing_keyword_turl) |
ResolveSyncKeywordConflict(turl.get(), &new_changes); |
// Force the local ID to kInvalidTemplateURLID so we can add it. |
- turl->set_id(kInvalidTemplateURLID); |
- Add(turl.release()); |
+ TemplateURLData data(turl->data()); |
+ data.id = kInvalidTemplateURLID; |
+ Add(new TemplateURL(data)); |
// Possibly set the newly added |turl| as the default search provider. |
SetDefaultSearchProviderIfNewlySynced(guid); |
@@ -790,11 +799,9 @@ |
existing_turl) { |
// Possibly resolve a keyword conflict if they have the same keywords but |
// are not the same entry. |
- TemplateURL updated_turl(*existing_turl); |
- UpdateTemplateURLWithSyncData(&updated_turl, iter->sync_data()); |
if (existing_keyword_turl && existing_keyword_turl != existing_turl) |
- ResolveSyncKeywordConflict(&updated_turl, &new_changes); |
- UpdateNoNotify(existing_turl, updated_turl); |
+ ResolveSyncKeywordConflict(turl.get(), &new_changes); |
+ UpdateNoNotify(existing_turl, *turl); |
NotifyObservers(); |
} else { |
// Something really unexpected happened. Either we received an |
@@ -853,10 +860,9 @@ |
for (SyncDataMap::const_iterator iter = sync_data_map.begin(); |
iter != sync_data_map.end(); ++iter) { |
+ const TemplateURL* local_turl = GetTemplateURLForGUID(iter->first); |
scoped_ptr<TemplateURL> sync_turl( |
- CreateTemplateURLFromSyncData(iter->second)); |
- DCHECK(sync_turl.get()); |
- const TemplateURL* local_turl = GetTemplateURLForGUID(iter->first); |
+ CreateTemplateURLFromTemplateURLAndSyncData(local_turl, iter->second)); |
if (sync_turl->sync_guid().empty()) { |
// Due to a bug, older search engine entries with no sync GUID |
@@ -874,9 +880,7 @@ |
// TemplateURLID and the TemplateURL may have to be reparsed. This |
// also makes the local data's last_modified timestamp equal to Sync's, |
// avoiding an Update on the next MergeData call. |
- TemplateURL updated_turl(*local_turl); |
- UpdateTemplateURLWithSyncData(&updated_turl, iter->second); |
- UpdateNoNotify(local_turl, updated_turl); |
+ UpdateNoNotify(local_turl, *sync_turl); |
NotifyObservers(); |
} else if (sync_turl->last_modified() < local_turl->last_modified()) { |
// Otherwise, we know we have newer data, so update Sync with our |
@@ -907,8 +911,9 @@ |
// the cloud. |
ResolveSyncKeywordConflict(sync_turl.get(), &new_changes); |
// Force the local ID to kInvalidTemplateURLID so we can add it. |
- sync_turl->set_id(kInvalidTemplateURLID); |
- Add(sync_turl.release()); |
+ TemplateURLData data(sync_turl->data()); |
+ data.id = kInvalidTemplateURLID; |
+ Add(new TemplateURL(data)); |
// Possibly set the newly added |turl| as the default search provider. |
SetDefaultSearchProviderIfNewlySynced(guid); |
@@ -992,11 +997,34 @@ |
} |
// static |
-TemplateURL* TemplateURLService::CreateTemplateURLFromSyncData( |
+TemplateURL* TemplateURLService::CreateTemplateURLFromTemplateURLAndSyncData( |
+ const TemplateURL* existing_turl, |
const SyncData& sync_data) { |
- TemplateURL* turl = new TemplateURL(); |
- UpdateTemplateURLWithSyncData(turl, sync_data); |
- return turl; |
+ sync_pb::SearchEngineSpecifics specifics = |
+ sync_data.GetSpecifics().search_engine(); |
+ |
+ TemplateURLData data; |
+ data.short_name = UTF8ToUTF16(specifics.short_name()); |
+ data.originating_url = GURL(specifics.originating_url()); |
+ data.SetKeyword(UTF8ToUTF16(specifics.keyword())); |
+ data.SetAutogenerateKeyword(specifics.autogenerate_keyword()); |
+ data.SetURL(specifics.url()); |
+ data.suggestions_url = specifics.suggestions_url(); |
+ data.instant_url = specifics.instant_url(); |
+ data.favicon_url = GURL(specifics.favicon_url()); |
+ data.show_in_default_list = specifics.show_in_default_list(); |
+ data.safe_for_autoreplace = specifics.safe_for_autoreplace(); |
+ base::SplitString(specifics.input_encodings(), ';', &data.input_encodings); |
+ data.date_created = base::Time::FromInternalValue(specifics.date_created()); |
+ data.last_modified = base::Time::FromInternalValue(specifics.last_modified()); |
+ data.prepopulate_id = specifics.prepopulate_id(); |
+ data.sync_guid = specifics.sync_guid(); |
+ if (existing_turl) { |
+ data.id = existing_turl->id(); |
+ data.created_by_policy = existing_turl->created_by_policy(); |
+ data.usage_count = existing_turl->usage_count(); |
+ } |
+ return new TemplateURL(data); |
} |
// static |
@@ -1057,11 +1085,11 @@ |
// TemplateURLService ends up owning the TemplateURL, don't try and free |
// it. |
- TemplateURL* template_url = new TemplateURL(); |
- template_url->set_keyword(UTF8ToUTF16(initializers[i].keyword)); |
- template_url->set_short_name(UTF8ToUTF16(initializers[i].content)); |
- template_url->SetURL(osd_url); |
- AddNoNotify(template_url); |
+ TemplateURLData data; |
+ data.short_name = UTF8ToUTF16(initializers[i].content); |
+ data.SetKeyword(UTF8ToUTF16(initializers[i].keyword)); |
+ data.SetURL(osd_url); |
+ AddNoNotify(new TemplateURL(data)); |
} |
} |
@@ -1242,27 +1270,26 @@ |
std::string prepopulate_id = |
prefs->GetString(prefs::kDefaultSearchProviderPrepopulateID); |
- default_provider->reset(new TemplateURL()); |
- (*default_provider)->set_short_name(name); |
- (*default_provider)->SetURL(search_url); |
- (*default_provider)->SetSuggestionsURL(suggest_url); |
- (*default_provider)->SetInstantURL(instant_url); |
- (*default_provider)->set_keyword(keyword); |
- (*default_provider)->set_favicon_url(GURL(icon_url)); |
- std::vector<std::string> encodings_vector; |
- base::SplitString(encodings, ';', &encodings_vector); |
- (*default_provider)->set_input_encodings(encodings_vector); |
+ TemplateURLData data; |
+ data.short_name = name; |
+ data.SetKeyword(keyword); |
+ data.SetURL(search_url); |
+ data.suggestions_url = suggest_url; |
+ data.instant_url = instant_url; |
+ data.favicon_url = GURL(icon_url); |
+ data.show_in_default_list = true; |
+ base::SplitString(encodings, ';', &data.input_encodings); |
if (!id_string.empty() && !*is_managed) { |
int64 value; |
base::StringToInt64(id_string, &value); |
- (*default_provider)->set_id(value); |
+ data.id = value; |
} |
if (!prepopulate_id.empty() && !*is_managed) { |
int value; |
base::StringToInt(prepopulate_id, &value); |
- (*default_provider)->SetPrepopulateId(value); |
+ data.prepopulate_id = value; |
} |
- (*default_provider)->set_show_in_default_list(true); |
+ default_provider->reset(new TemplateURL(data)); |
return true; |
} |
@@ -1304,9 +1331,13 @@ |
if (!existing_turl->sync_guid().empty()) |
guid_to_template_map_.erase(existing_turl->sync_guid()); |
- // This call handles copying over the values (while retaining the id). |
+ provider_map_.Remove(existing_turl); |
+ TemplateURLID previous_id = existing_turl->id(); |
+ TemplateURL* modifiable_turl = const_cast<TemplateURL*>(existing_turl); |
+ *modifiable_turl = new_values; |
+ modifiable_turl->data_.id = previous_id; |
UIThreadSearchTermsData search_terms_data; |
- provider_map_.Update(existing_turl, new_values, search_terms_data); |
+ provider_map_.Add(existing_turl, search_terms_data); |
if (!existing_turl->keyword().empty()) |
keyword_to_template_map_[existing_turl->keyword()] = existing_turl; |
@@ -1511,14 +1542,18 @@ |
SetDefaultSearchProviderNoNotify(NULL); |
RemoveNoNotify(old_default); |
} else if (default_search_provider_) { |
- new_default_from_prefs->set_created_by_policy(true); |
- UpdateNoNotify(default_search_provider_, *new_default_from_prefs.get()); |
+ TemplateURLData data(new_default_from_prefs->data()); |
+ data.created_by_policy = true; |
+ TemplateURL new_values(data); |
+ UpdateNoNotify(default_search_provider_, new_values); |
} else { |
// AddNoNotify will take ownership of new_template, so it's safe to |
// release. |
- TemplateURL* new_template = new_default_from_prefs.release(); |
- if (new_template) { |
- new_template->set_created_by_policy(true); |
+ TemplateURL* new_template = NULL; |
+ if (new_default_from_prefs.get()) { |
+ TemplateURLData data(new_default_from_prefs->data()); |
+ data.created_by_policy = true; |
+ new_template = new TemplateURL(data); |
AddNoNotify(new_template); |
} |
SetDefaultSearchProviderNoNotify(new_template); |
@@ -1529,9 +1564,11 @@ |
is_default_search_managed_ = new_is_default_managed; |
// AddNoNotify will take ownership of new_template, so it's safe to |
// release. |
- TemplateURL* new_template = new_default_from_prefs.release(); |
- if (new_template) { |
- new_template->set_created_by_policy(true); |
+ TemplateURL* new_template = NULL; |
+ if (new_default_from_prefs.get()) { |
+ TemplateURLData data(new_default_from_prefs->data()); |
+ data.created_by_policy = true; |
+ new_template = new TemplateURL(data); |
AddNoNotify(new_template); |
} |
SetDefaultSearchProviderNoNotify(new_template); |
@@ -1561,17 +1598,17 @@ |
void TemplateURLService::SetDefaultSearchProviderNoNotify( |
const TemplateURL* url) { |
- DCHECK(!url || std::find(template_urls_.begin(), template_urls_.end(), url) |
- != template_urls_.end()); |
+ DCHECK(!url || std::find(template_urls_.begin(), template_urls_.end(), url) != |
+ template_urls_.end()); |
default_search_provider_ = url; |
if (url) { |
TemplateURL* modifiable_url = const_cast<TemplateURL*>(url); |
// Don't mark the url as edited, otherwise we won't be able to rev the |
// template urls we ship with. |
- modifiable_url->set_show_in_default_list(true); |
+ modifiable_url->data_.show_in_default_list = true; |
if (service_.get()) |
- service_.get()->UpdateKeyword(*url); |
+ service_->UpdateKeyword(*url); |
if (url->url_ref().HasGoogleBaseURLs()) { |
GoogleURLTracker::RequestServerCheck(); |
@@ -1610,7 +1647,7 @@ |
DCHECK_EQ(kInvalidTemplateURLID, template_url->id()); |
DCHECK(std::find(template_urls_.begin(), template_urls_.end(), template_url) |
== template_urls_.end()); |
- template_url->set_id(++next_id_); |
+ template_url->data_.id = ++next_id_; |
template_urls_.push_back(template_url); |
AddToMaps(template_url); |
@@ -1641,7 +1678,7 @@ |
template_urls_.erase(i); |
if (service_.get()) |
- service_->RemoveKeyword(*template_url); |
+ service_->RemoveKeyword(template_url->id()); |
// Inform sync of the deletion. |
ProcessTemplateURLChange(template_url, SyncChange::ACTION_DELETE); |
@@ -1706,7 +1743,7 @@ |
i = template_urls->erase(i); |
if (service_.get()) |
- service_->RemoveKeyword(*template_url); |
+ service_->RemoveKeyword(template_url->id()); |
delete template_url; |
} else { |
++i; |
@@ -1718,8 +1755,9 @@ |
const std::string& guid) { |
DCHECK(!guid.empty()); |
- TemplateURL new_url(*url); |
- new_url.set_sync_guid(guid); |
+ TemplateURLData data(url->data()); |
+ data.sync_guid = guid; |
+ TemplateURL new_url(data); |
UpdateNoNotify(url, new_url); |
} |
@@ -1763,15 +1801,16 @@ |
existing_turl->created_by_policy()) { |
string16 new_keyword = UniquifyKeyword(*sync_turl); |
DCHECK(!GetTemplateURLForKeyword(new_keyword)); |
- sync_turl->set_keyword(new_keyword); |
+ sync_turl->data_.SetKeyword(new_keyword); |
// If we update the cloud TURL, we need to push an update back to sync |
// informing it that something has changed. |
SyncData sync_data = CreateSyncDataFromTemplateURL(*sync_turl); |
change_list->push_back(SyncChange(SyncChange::ACTION_UPDATE, sync_data)); |
} else { |
string16 new_keyword = UniquifyKeyword(*existing_turl); |
- TemplateURL new_turl(*existing_turl); |
- new_turl.set_keyword(new_keyword); |
+ TemplateURLData data(existing_turl->data()); |
+ data.SetKeyword(new_keyword); |
+ TemplateURL new_turl(data); |
UpdateNoNotify(existing_turl, new_turl); |
NotifyObservers(); |
} |
@@ -1799,10 +1838,7 @@ |
DCHECK(sync_turl); |
DCHECK(local_turl); |
DCHECK(change_list); |
- |
- scoped_ptr<TemplateURL> scoped_sync_turl(sync_turl); |
- |
- if (scoped_sync_turl->last_modified() > local_turl->last_modified()) { |
+ if (sync_turl->last_modified() > local_turl->last_modified()) { |
// Fully replace local_url with Sync's copy. Note that because use Add |
// rather than ResetTemplateURL, |sync_url| is added with a fresh |
// TemplateURLID. We don't need to sync the new ID back to the server since |
@@ -1817,11 +1853,10 @@ |
Remove(local_turl); |
// Force the local ID to kInvalidTemplateURLID so we can add it. |
- scoped_sync_turl->set_id(kInvalidTemplateURLID); |
- TemplateURL* temp = scoped_sync_turl.release(); |
- Add(temp); |
+ sync_turl->data_.id = kInvalidTemplateURLID; |
+ Add(sync_turl); |
if (delete_default) |
- SetDefaultSearchProvider(temp); |
+ SetDefaultSearchProvider(sync_turl); |
} |
} else { |
// Change the local TURL's GUID to the server's GUID and push an update to |
@@ -1831,6 +1866,7 @@ |
ResetTemplateURLGUID(local_turl, sync_turl->sync_guid()); |
SyncData sync_data = CreateSyncDataFromTemplateURL(*local_turl); |
change_list->push_back(SyncChange(SyncChange::ACTION_UPDATE, sync_data)); |
+ delete sync_turl; |
} |
} |
@@ -1870,36 +1906,9 @@ |
TemplateURL* template_url = *i; |
DCHECK(template_url); |
if (template_url->sync_guid().empty()) { |
- template_url->set_sync_guid(guid::GenerateGUID()); |
+ template_url->data_.sync_guid = guid::GenerateGUID(); |
if (service_.get()) |
service_->UpdateKeyword(*template_url); |
} |
} |
} |
- |
-// static |
-void TemplateURLService::UpdateTemplateURLWithSyncData( |
- TemplateURL* dst, |
- const SyncData& sync_data) { |
- sync_pb::SearchEngineSpecifics specifics = |
- sync_data.GetSpecifics().search_engine(); |
- dst->set_short_name(UTF8ToUTF16(specifics.short_name())); |
- dst->set_keyword(UTF8ToUTF16(specifics.keyword())); |
- dst->set_favicon_url(GURL(specifics.favicon_url())); |
- dst->SetURL(specifics.url()); |
- dst->set_safe_for_autoreplace(specifics.safe_for_autoreplace()); |
- dst->set_originating_url(GURL(specifics.originating_url())); |
- dst->set_date_created( |
- base::Time::FromInternalValue(specifics.date_created())); |
- std::vector<std::string> input_encodings; |
- base::SplitString(specifics.input_encodings(), ';', &input_encodings); |
- dst->set_input_encodings(input_encodings); |
- dst->set_show_in_default_list(specifics.show_in_default_list()); |
- dst->SetSuggestionsURL(specifics.suggestions_url()); |
- dst->SetPrepopulateId(specifics.prepopulate_id()); |
- dst->set_autogenerate_keyword(specifics.autogenerate_keyword()); |
- dst->SetInstantURL(specifics.instant_url()); |
- dst->set_last_modified( |
- base::Time::FromInternalValue(specifics.last_modified())); |
- dst->set_sync_guid(specifics.sync_guid()); |
-} |