Chromium Code Reviews| 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 817756c296f27528bf9760a94e42b36057b6b35d..bbb4af4e01378c818346a2eb878b5597bcd4b4bd 100644 |
| --- a/chrome/browser/search_engines/template_url_service.cc |
| +++ b/chrome/browser/search_engines/template_url_service.cc |
| @@ -418,79 +418,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 |
| @@ -568,6 +495,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, |
| @@ -630,8 +630,7 @@ TemplateURL* TemplateURLService::GetTemplateURLForKeyword( |
| keyword_to_template_map_.find(keyword)); |
| if (elem != keyword_to_template_map_.end()) |
| return elem->second; |
| - return ((!loaded_ || load_failed_) && |
| - initial_default_search_provider_.get() && |
| + return (!loaded_ && initial_default_search_provider_.get() && |
| (initial_default_search_provider_->keyword() == keyword)) ? |
| initial_default_search_provider_.get() : NULL; |
| } |
| @@ -641,8 +640,7 @@ TemplateURL* TemplateURLService::GetTemplateURLForGUID( |
| GUIDToTemplateMap::const_iterator elem(guid_to_template_map_.find(sync_guid)); |
| if (elem != guid_to_template_map_.end()) |
| return elem->second; |
| - return ((!loaded_ || load_failed_) && |
| - initial_default_search_provider_.get() && |
| + return (!loaded_ && initial_default_search_provider_.get() && |
| (initial_default_search_provider_->sync_guid() == sync_guid)) ? |
| initial_default_search_provider_.get() : NULL; |
| } |
| @@ -654,8 +652,7 @@ TemplateURL* TemplateURLService::GetTemplateURLForHost( |
| if (t_url) |
| return t_url; |
| } |
| - return ((!loaded_ || load_failed_) && |
| - initial_default_search_provider_.get() && |
| + return (!loaded_ && initial_default_search_provider_.get() && |
| (GenerateSearchURL(initial_default_search_provider_.get()).host() == |
| host)) ? initial_default_search_provider_.get() : NULL; |
| } |
| @@ -810,8 +807,8 @@ 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, |
| @@ -858,10 +855,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_ ? |
| + default_search_provider_ : initial_default_search_provider_.get(); |
| } |
| bool TemplateURLService::IsSearchResultsPageFromDefaultSearchProvider( |
| @@ -972,16 +967,13 @@ 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(); |
| - on_loaded_callbacks_.Notify(); |
| - } |
| + else |
| + OnFailedLoad(); |
| } |
| scoped_ptr<TemplateURLService::Subscription> |
| @@ -1002,9 +994,7 @@ void TemplateURLService::OnWebDataServiceRequestDone( |
| if (!result) { |
| // Results are null if the database went away or (most likely) wasn't |
| // loaded. |
| - load_failed_ = true; |
| - ChangeToLoadedState(); |
| - on_loaded_callbacks_.Notify(); |
| + OnFailedLoad(); |
| return; |
| } |
| @@ -1280,6 +1270,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_) { |
|
Nicolas Zea
2014/05/05 21:23:59
Under what conditions is the load expected to fail
Peter Kasting
2014/05/05 21:33:32
(1) Various tests
(2) Disk corruption preventing u
|
| + 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(); |
| @@ -1785,6 +1784,24 @@ void TemplateURLService::ChangeToLoadedState() { |
| loaded_ = true; |
| } |
| +void TemplateURLService::OnFailedLoad() { |
| + load_failed_ = true; |
| + service_ = NULL; |
| + // Have to call this before GetDefaultSearchProvider(), or that function will |
| + // just return |initial_default_search_provider_|. |
| + ChangeToLoadedState(); |
| + if (GetDefaultSearchProvider()) { |
| + initial_default_search_provider_.reset(); |
| + } else if (initial_default_search_provider_) { |
| + TemplateURL* default_search_provider = |
| + initial_default_search_provider_.release(); |
| + AddNoNotify(default_search_provider, |
| + default_search_provider->id() == kInvalidTemplateURLID); |
| + SetDefaultSearchProviderNoNotify(default_search_provider); |
| + } |
| + on_loaded_callbacks_.Notify(); |
| +} |
| + |
| void TemplateURLService::ClearDefaultProviderFromPrefs() { |
| // We overwrite user preferences. If the default search engine is managed, |
| // there is no effect. |
| @@ -1885,7 +1902,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. |
| @@ -2174,7 +2191,7 @@ 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()) { |
| @@ -2209,7 +2226,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. |
| @@ -2261,7 +2278,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 |
| @@ -2288,7 +2305,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. |
| @@ -2358,7 +2375,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 { |
| @@ -2582,7 +2599,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()); |
| } |
| } |