Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6755)

Unified Diff: chrome/browser/search_engines/template_url_service.cc

Issue 272573004: Handle TemplateURLService load failure better, and make some test correctness fixes that will be ne… (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase after revert / presubmit fixes. Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/search_engines/template_url_service.cc
diff --git a/chrome/browser/search_engines/template_url_service.cc b/chrome/browser/search_engines/template_url_service.cc
index 1042ddb7da7e13fe03d5ef7bfdde7bac21fd9378..c25979103c0fb3f9f502aed65ffd433d2ba48b9f 100644
--- a/chrome/browser/search_engines/template_url_service.cc
+++ b/chrome/browser/search_engines/template_url_service.cc
@@ -57,32 +57,6 @@ typedef TemplateURLService::SyncDataMap SyncDataMap;
namespace {
-bool TemplateURLMatchesData(const TemplateURL* url1,
- const TemplateURLData* url2) {
- if (!url1 || !url2)
- return !url1 && !url2;
-
- return (url1->short_name() == url2->short_name) &&
- url1->HasSameKeywordAs(*url2) &&
- (url1->url() == url2->url()) &&
- (url1->suggestions_url() == url2->suggestions_url) &&
- (url1->instant_url() == url2->instant_url) &&
- (url1->image_url() == url2->image_url) &&
- (url1->new_tab_url() == url2->new_tab_url) &&
- (url1->search_url_post_params() == url2->search_url_post_params) &&
- (url1->suggestions_url_post_params() ==
- url2->suggestions_url_post_params) &&
- (url1->instant_url_post_params() == url2->instant_url_post_params) &&
- (url1->image_url_post_params() == url2->image_url_post_params) &&
- (url1->favicon_url() == url2->favicon_url) &&
- (url1->safe_for_autoreplace() == url2->safe_for_autoreplace) &&
- (url1->show_in_default_list() == url2->show_in_default_list) &&
- (url1->input_encodings() == url2->input_encodings) &&
- (url1->alternate_urls() == url2->alternate_urls) &&
- (url1->search_terms_replacement_key() ==
- url2->search_terms_replacement_key);
-}
-
const char kFirstPotentialEngineHistogramName[] =
"Search.FirstPotentialEngineCalled";
@@ -420,79 +394,6 @@ bool TemplateURLService::LoadDefaultSearchProviderFromPrefs(
}
// static
-void TemplateURLService::SaveDefaultSearchProviderToPrefs(
- const TemplateURL* t_url, PrefService* prefs) {
- if (!prefs)
- return;
-
- bool enabled = false;
- std::string search_url;
- std::string suggest_url;
- std::string instant_url;
- std::string image_url;
- std::string new_tab_url;
- std::string search_url_post_params;
- std::string suggest_url_post_params;
- std::string instant_url_post_params;
- std::string image_url_post_params;
- std::string icon_url;
- std::string encodings;
- std::string short_name;
- std::string keyword;
- std::string id_string;
- std::string prepopulate_id;
- base::ListValue alternate_urls;
- std::string search_terms_replacement_key;
- if (t_url) {
- DCHECK_EQ(TemplateURL::NORMAL, t_url->GetType());
- enabled = true;
- search_url = t_url->url();
- suggest_url = t_url->suggestions_url();
- instant_url = t_url->instant_url();
- image_url = t_url->image_url();
- new_tab_url = t_url->new_tab_url();
- search_url_post_params = t_url->search_url_post_params();
- suggest_url_post_params = t_url->suggestions_url_post_params();
- instant_url_post_params = t_url->instant_url_post_params();
- image_url_post_params = t_url->image_url_post_params();
- GURL icon_gurl = t_url->favicon_url();
- if (!icon_gurl.is_empty())
- icon_url = icon_gurl.spec();
- encodings = JoinString(t_url->input_encodings(), ';');
- short_name = base::UTF16ToUTF8(t_url->short_name());
- keyword = base::UTF16ToUTF8(t_url->keyword());
- id_string = base::Int64ToString(t_url->id());
- prepopulate_id = base::Int64ToString(t_url->prepopulate_id());
- for (size_t i = 0; i < t_url->alternate_urls().size(); ++i)
- alternate_urls.AppendString(t_url->alternate_urls()[i]);
- search_terms_replacement_key = t_url->search_terms_replacement_key();
- }
- prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, enabled);
- prefs->SetString(prefs::kDefaultSearchProviderSearchURL, search_url);
- prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, suggest_url);
- prefs->SetString(prefs::kDefaultSearchProviderInstantURL, instant_url);
- prefs->SetString(prefs::kDefaultSearchProviderImageURL, image_url);
- prefs->SetString(prefs::kDefaultSearchProviderNewTabURL, new_tab_url);
- prefs->SetString(prefs::kDefaultSearchProviderSearchURLPostParams,
- search_url_post_params);
- prefs->SetString(prefs::kDefaultSearchProviderSuggestURLPostParams,
- suggest_url_post_params);
- prefs->SetString(prefs::kDefaultSearchProviderInstantURLPostParams,
- instant_url_post_params);
- prefs->SetString(prefs::kDefaultSearchProviderImageURLPostParams,
- image_url_post_params);
- prefs->SetString(prefs::kDefaultSearchProviderIconURL, icon_url);
- prefs->SetString(prefs::kDefaultSearchProviderEncodings, encodings);
- prefs->SetString(prefs::kDefaultSearchProviderName, short_name);
- prefs->SetString(prefs::kDefaultSearchProviderKeyword, keyword);
- prefs->SetString(prefs::kDefaultSearchProviderID, id_string);
- prefs->SetString(prefs::kDefaultSearchProviderPrepopulateID, prepopulate_id);
- prefs->Set(prefs::kDefaultSearchProviderAlternateURLs, alternate_urls);
- prefs->SetString(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
- search_terms_replacement_key);
-}
-
-// static
base::string16 TemplateURLService::GenerateKeyword(const GURL& url) {
DCHECK(url.is_valid());
// Strip "www." off the front of the keyword; otherwise the keyword won't work
@@ -570,6 +471,79 @@ GURL TemplateURLService::GenerateSearchURLUsingTermsData(
search_terms_data, NULL));
}
+void TemplateURLService::SaveDefaultSearchProviderToPrefs(
+ const TemplateURL* t_url,
+ PrefService* prefs) const {
+ if (!prefs || load_failed_)
+ return;
+
+ bool enabled = false;
+ std::string search_url;
+ std::string suggest_url;
+ std::string instant_url;
+ std::string image_url;
+ std::string new_tab_url;
+ std::string search_url_post_params;
+ std::string suggest_url_post_params;
+ std::string instant_url_post_params;
+ std::string image_url_post_params;
+ std::string icon_url;
+ std::string encodings;
+ std::string short_name;
+ std::string keyword;
+ std::string id_string;
+ std::string prepopulate_id;
+ base::ListValue alternate_urls;
+ std::string search_terms_replacement_key;
+ if (t_url) {
+ DCHECK_EQ(TemplateURL::NORMAL, t_url->GetType());
+ enabled = true;
+ search_url = t_url->url();
+ suggest_url = t_url->suggestions_url();
+ instant_url = t_url->instant_url();
+ image_url = t_url->image_url();
+ new_tab_url = t_url->new_tab_url();
+ search_url_post_params = t_url->search_url_post_params();
+ suggest_url_post_params = t_url->suggestions_url_post_params();
+ instant_url_post_params = t_url->instant_url_post_params();
+ image_url_post_params = t_url->image_url_post_params();
+ GURL icon_gurl = t_url->favicon_url();
+ if (!icon_gurl.is_empty())
+ icon_url = icon_gurl.spec();
+ encodings = JoinString(t_url->input_encodings(), ';');
+ short_name = base::UTF16ToUTF8(t_url->short_name());
+ keyword = base::UTF16ToUTF8(t_url->keyword());
+ id_string = base::Int64ToString(t_url->id());
+ prepopulate_id = base::Int64ToString(t_url->prepopulate_id());
+ for (size_t i = 0; i < t_url->alternate_urls().size(); ++i)
+ alternate_urls.AppendString(t_url->alternate_urls()[i]);
+ search_terms_replacement_key = t_url->search_terms_replacement_key();
+ }
+ prefs->SetBoolean(prefs::kDefaultSearchProviderEnabled, enabled);
+ prefs->SetString(prefs::kDefaultSearchProviderSearchURL, search_url);
+ prefs->SetString(prefs::kDefaultSearchProviderSuggestURL, suggest_url);
+ prefs->SetString(prefs::kDefaultSearchProviderInstantURL, instant_url);
+ prefs->SetString(prefs::kDefaultSearchProviderImageURL, image_url);
+ prefs->SetString(prefs::kDefaultSearchProviderNewTabURL, new_tab_url);
+ prefs->SetString(prefs::kDefaultSearchProviderSearchURLPostParams,
+ search_url_post_params);
+ prefs->SetString(prefs::kDefaultSearchProviderSuggestURLPostParams,
+ suggest_url_post_params);
+ prefs->SetString(prefs::kDefaultSearchProviderInstantURLPostParams,
+ instant_url_post_params);
+ prefs->SetString(prefs::kDefaultSearchProviderImageURLPostParams,
+ image_url_post_params);
+ prefs->SetString(prefs::kDefaultSearchProviderIconURL, icon_url);
+ prefs->SetString(prefs::kDefaultSearchProviderEncodings, encodings);
+ prefs->SetString(prefs::kDefaultSearchProviderName, short_name);
+ prefs->SetString(prefs::kDefaultSearchProviderKeyword, keyword);
+ prefs->SetString(prefs::kDefaultSearchProviderID, id_string);
+ prefs->SetString(prefs::kDefaultSearchProviderPrepopulateID, prepopulate_id);
+ prefs->Set(prefs::kDefaultSearchProviderAlternateURLs, alternate_urls);
+ prefs->SetString(prefs::kDefaultSearchProviderSearchTermsReplacementKey,
+ search_terms_replacement_key);
+}
+
bool TemplateURLService::CanReplaceKeyword(
const base::string16& keyword,
const GURL& url,
@@ -812,31 +786,15 @@ void TemplateURLService::IncrementUsageCount(TemplateURL* url) {
return;
++url->data_.usage_count;
- if (service_.get())
- service_.get()->UpdateKeyword(url->data());
+ if (service_)
+ service_->UpdateKeyword(url->data());
}
void TemplateURLService::ResetTemplateURL(TemplateURL* url,
const base::string16& title,
const base::string16& keyword,
const std::string& search_url) {
- if (!loaded_)
- return;
- DCHECK(!keyword.empty());
- DCHECK(!search_url.empty());
- 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.
- data.favicon_url = GURL();
- }
- data.safe_for_autoreplace = false;
- data.last_modified = time_provider_();
- TemplateURL new_url(url->profile(), data);
- UIThreadSearchTermsData search_terms_data(url->profile());
- if (UpdateNoNotify(url, new_url, search_terms_data))
+ if (ResetTemplateURLNoNotify(url, title, keyword, search_url))
NotifyObservers();
}
@@ -860,10 +818,8 @@ void TemplateURLService::SetUserSelectedDefaultSearchProvider(
}
TemplateURL* TemplateURLService::GetDefaultSearchProvider() {
- if (loaded_ && !load_failed_)
- return default_search_provider_;
- // We're not loaded, rely on the default search provider stored in prefs.
- return initial_default_search_provider_.get();
+ return (loaded_ && !load_failed_) ?
+ default_search_provider_ : initial_default_search_provider_.get();
}
bool TemplateURLService::IsSearchResultsPageFromDefaultSearchProvider(
@@ -974,11 +930,10 @@ void TemplateURLService::Load() {
if (loaded_ || load_handle_)
return;
- if (!service_.get()) {
+ if (!service_)
service_ = WebDataService::FromBrowserContext(profile_);
- }
- if (service_.get()) {
+ if (service_) {
load_handle_ = service_->GetKeywords(this);
} else {
ChangeToLoadedState();
@@ -1005,6 +960,7 @@ void TemplateURLService::OnWebDataServiceRequestDone(
// Results are null if the database went away or (most likely) wasn't
// loaded.
load_failed_ = true;
+ service_ = NULL;
ChangeToLoadedState();
on_loaded_callbacks_.Notify();
return;
@@ -1282,6 +1238,15 @@ syncer::SyncMergeResult TemplateURLService::MergeDataAndStartSyncing(
DCHECK(sync_processor.get());
DCHECK(sync_error_factory.get());
syncer::SyncMergeResult merge_result(type);
+
+ // Disable sync if we failed to load.
+ if (load_failed_) {
+ merge_result.set_error(syncer::SyncError(
+ FROM_HERE, syncer::SyncError::DATATYPE_ERROR,
+ "Local database load failed.", syncer::SEARCH_ENGINES));
+ return merge_result;
+ }
+
sync_processor_ = sync_processor.Pass();
sync_error_factory_ = sync_error_factory.Pass();
@@ -1671,8 +1636,8 @@ void TemplateURLService::Init(const Initializer* initializers,
// Request a server check for the correct Google URL if Google is the
// default search engine and not in headless mode.
- if (profile_ && initial_default_search_provider_.get() &&
- initial_default_search_provider_->url_ref().HasGoogleBaseURLs()) {
+ if (profile_ && initial_default_search_provider_ &&
+ initial_default_search_provider_->HasGoogleBaseURLs()) {
scoped_ptr<base::Environment> env(base::Environment::Create());
if (!env->HasVar(env_vars::kHeadless))
GoogleURLTracker::RequestServerCheck(profile_, false);
@@ -1887,7 +1852,7 @@ bool TemplateURLService::UpdateNoNotify(
if (!existing_turl->sync_guid().empty())
guid_to_template_map_[existing_turl->sync_guid()] = existing_turl;
- if (service_.get())
+ if (service_)
service_->UpdateKeyword(existing_turl->data());
// Inform sync of the update.
@@ -1990,8 +1955,7 @@ void TemplateURLService::GoogleBaseURLChanged(const GURL& old_base_url) {
for (TemplateURLVector::iterator i(template_urls_.begin());
i != template_urls_.end(); ++i) {
TemplateURL* t_url = *i;
- if (t_url->url_ref().HasGoogleBaseURLs() ||
- t_url->suggestions_url_ref().HasGoogleBaseURLs()) {
+ if (t_url->HasGoogleBaseURLs()) {
TemplateURL updated_turl(t_url->profile(), t_url->data());
updated_turl.ResetKeywordIfNecessary(false);
KeywordToTemplateMap::const_iterator existing_entry =
@@ -2060,13 +2024,12 @@ void TemplateURLService::UpdateDefaultSearch() {
// The default was managed and remains managed. Update the default only
// if it has changed; we don't want to respond to changes triggered by
// SaveDefaultSearchProviderToPrefs.
- if (TemplateURLMatchesData(default_search_provider_,
- new_default_from_prefs.get()))
+ if (TemplateURL::MatchesData(default_search_provider_,
+ new_default_from_prefs.get()))
return;
if (!new_default_from_prefs) {
- // default_search_provider_ can't be NULL otherwise
- // TemplateURLMatchesData would have returned true. Remove this now
- // invalid value.
+ // |default_search_provider_| can't be NULL or MatchesData() would have
+ // returned true. Remove this now invalid value.
TemplateURL* old_default = default_search_provider_;
bool success = SetDefaultSearchProviderNoNotify(NULL);
DCHECK(success);
@@ -2176,10 +2139,10 @@ bool TemplateURLService::SetDefaultSearchProviderNoNotify(TemplateURL* url) {
// Don't mark the url as edited, otherwise we won't be able to rev the
// template urls we ship with.
url->data_.show_in_default_list = true;
- if (service_.get() && (url->GetType() == TemplateURL::NORMAL))
+ if (service_ && (url->GetType() == TemplateURL::NORMAL))
service_->UpdateKeyword(url->data());
- if (url->url_ref().HasGoogleBaseURLs()) {
+ if (url->HasGoogleBaseURLs()) {
GoogleURLTracker::RequestServerCheck(profile_, false);
#if defined(ENABLE_RLZ)
RLZTracker::RecordProductEvent(rlz_lib::CHROME,
@@ -2211,7 +2174,7 @@ bool TemplateURLService::SetDefaultSearchProviderNoNotify(TemplateURL* url) {
}
}
- if (service_.get())
+ if (service_)
service_->SetDefaultSearchProviderID(url ? url->id() : 0);
// Inform sync the change to the show_in_default_list flag.
@@ -2252,9 +2215,9 @@ bool TemplateURLService::AddNoNotify(TemplateURL* template_url,
} else {
base::string16 new_keyword =
UniquifyKeyword(*existing_keyword_turl, false);
- ResetTemplateURL(existing_keyword_turl,
- existing_keyword_turl->short_name(), new_keyword,
- existing_keyword_turl->url());
+ ResetTemplateURLNoNotify(existing_keyword_turl,
+ existing_keyword_turl->short_name(), new_keyword,
+ existing_keyword_turl->url());
}
}
template_urls_.push_back(template_url);
@@ -2263,7 +2226,7 @@ bool TemplateURLService::AddNoNotify(TemplateURL* template_url,
if (newly_adding &&
(template_url->GetType() !=
TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION)) {
- if (service_.get())
+ if (service_)
service_->AddKeyword(template_url->data());
// Inform sync of the addition. Note that this will assign a GUID to
@@ -2290,7 +2253,7 @@ void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) {
template_urls_.erase(i);
if (template_url->GetType() != TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION) {
- if (service_.get())
+ if (service_)
service_->RemoveKeyword(template_url->id());
// Inform sync of the deletion.
@@ -2315,6 +2278,30 @@ void TemplateURLService::RemoveNoNotify(TemplateURL* template_url) {
delete template_url;
}
+bool TemplateURLService::ResetTemplateURLNoNotify(
+ TemplateURL* url,
+ const base::string16& title,
+ const base::string16& keyword,
+ const std::string& search_url) {
+ if (!loaded_)
+ return false;
+ DCHECK(!keyword.empty());
+ DCHECK(!search_url.empty());
+ 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.
+ data.favicon_url = GURL();
+ }
+ data.safe_for_autoreplace = false;
+ data.last_modified = time_provider_();
+ TemplateURL new_url(url->profile(), data);
+ UIThreadSearchTermsData search_terms_data(url->profile());
+ return UpdateNoNotify(url, new_url, search_terms_data);
+}
+
void TemplateURLService::NotifyObservers() {
if (!loaded_)
return;
@@ -2343,7 +2330,7 @@ void TemplateURLService::RemoveProvidersCreatedByPolicy(
if (template_url->created_by_policy()) {
if (template_url == *default_search_provider &&
is_default_search_managed_ &&
- TemplateURLMatchesData(template_url, default_from_prefs)) {
+ TemplateURL::MatchesData(template_url, default_from_prefs)) {
// If the database specified a default search provider that was set
// by policy, and the default search provider from the preferences
// is also set by policy and they are the same, keep the entry in the
@@ -2360,7 +2347,7 @@ void TemplateURLService::RemoveProvidersCreatedByPolicy(
*default_search_provider = NULL;
i = template_urls->erase(i);
- if (service_.get())
+ if (service_)
service_->RemoveKeyword(template_url->id());
delete template_url;
} else {
@@ -2584,7 +2571,7 @@ void TemplateURLService::PatchMissingSyncGUIDs(
(template_url->GetType() !=
TemplateURL::NORMAL_CONTROLLED_BY_EXTENSION)) {
template_url->data_.sync_guid = base::GenerateGUID();
- if (service_.get())
+ if (service_)
service_->UpdateKeyword(template_url->data());
}
}
@@ -2613,8 +2600,8 @@ void TemplateURLService::AddTemplateURLsAndSetupDefaultEngine(
if (is_default_search_managed_) {
SetTemplateURLs(template_urls);
- if (TemplateURLMatchesData(default_search_provider,
- default_from_prefs.get())) {
+ if (TemplateURL::MatchesData(default_search_provider,
+ default_from_prefs.get())) {
// The value from the preferences was previously stored in the database.
// Reuse it.
} else {
« no previous file with comments | « chrome/browser/search_engines/template_url_service.h ('k') | chrome/browser/search_engines/template_url_service_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698