Index: chrome/browser/autocomplete/zero_suggest_provider.cc |
diff --git a/chrome/browser/autocomplete/zero_suggest_provider.cc b/chrome/browser/autocomplete/zero_suggest_provider.cc |
index ba7a8cc648abdf9fe5ae0b4af30fa61d54804023..7cc12e8a8f8a6fbbb230e2ab3e473b43b1247039 100644 |
--- a/chrome/browser/autocomplete/zero_suggest_provider.cc |
+++ b/chrome/browser/autocomplete/zero_suggest_provider.cc |
@@ -166,8 +166,9 @@ ZeroSuggestProvider::ZeroSuggestProvider( |
AutocompleteProviderListener* listener, |
TemplateURLService* template_url_service, |
Profile* profile) |
- : BaseSearchProvider(listener, template_url_service, profile, |
+ : BaseSearchProvider(template_url_service, profile, |
AutocompleteProvider::TYPE_ZERO_SUGGEST), |
+ listener_(listener), |
results_from_cache_(false), |
weak_ptr_factory_(this) { |
} |
@@ -175,30 +176,6 @@ ZeroSuggestProvider::ZeroSuggestProvider( |
ZeroSuggestProvider::~ZeroSuggestProvider() { |
} |
-bool ZeroSuggestProvider::StoreSuggestionResponse( |
- const std::string& json_data, |
- const base::Value& parsed_data) { |
- if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial() || |
- json_data.empty()) |
- return false; |
- profile_->GetPrefs()->SetString(prefs::kZeroSuggestCachedResults, json_data); |
- |
- // If we received an empty result list, we should update the display, as it |
- // may be showing cached results that should not be shown. |
- const base::ListValue* root_list = NULL; |
- const base::ListValue* results_list = NULL; |
- if (parsed_data.GetAsList(&root_list) && |
- root_list->GetList(1, &results_list) && |
- results_list->empty()) |
- return false; |
- |
- // We are finished with the request and want to bail early. |
- if (results_from_cache_) |
- done_ = true; |
- |
- return results_from_cache_; |
-} |
- |
const TemplateURL* ZeroSuggestProvider::GetTemplateURL(bool is_keyword) const { |
// Zero suggest provider should not receive keyword results. |
DCHECK(!is_keyword); |
@@ -212,12 +189,6 @@ const AutocompleteInput ZeroSuggestProvider::GetInput(bool is_keyword) const { |
true, ChromeAutocompleteSchemeClassifier(profile_)); |
} |
-SearchSuggestionParser::Results* ZeroSuggestProvider::GetResultsToFill( |
- bool is_keyword) { |
- DCHECK(!is_keyword); |
- return &results_; |
-} |
- |
bool ZeroSuggestProvider::ShouldAppendExtraParams( |
const SearchSuggestionParser::SuggestResult& result) const { |
// We always use the default provider for search, so append the params. |
@@ -225,9 +196,8 @@ bool ZeroSuggestProvider::ShouldAppendExtraParams( |
} |
void ZeroSuggestProvider::StopSuggest() { |
- if (suggest_results_pending_ > 0) |
+ if (fetcher_) |
LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_INVALIDATED); |
- suggest_results_pending_ = 0; |
fetcher_.reset(); |
} |
@@ -241,10 +211,6 @@ void ZeroSuggestProvider::ClearAllResults() { |
current_query_.clear(); |
} |
-int ZeroSuggestProvider::GetDefaultResultRelevance() const { |
- return kDefaultZeroSuggestRelevance; |
-} |
- |
void ZeroSuggestProvider::RecordDeletionResult(bool success) { |
if (success) { |
base::RecordAction( |
@@ -255,20 +221,52 @@ void ZeroSuggestProvider::RecordDeletionResult(bool success) { |
} |
} |
-void ZeroSuggestProvider::LogFetchComplete(bool success, bool is_keyword) { |
- LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REPLY_RECEIVED); |
-} |
+void ZeroSuggestProvider::OnURLFetchComplete(const net::URLFetcher* source) { |
+ DCHECK(!done_); |
+ DCHECK_EQ(fetcher_.get(), source); |
-bool ZeroSuggestProvider::IsKeywordFetcher( |
- const net::URLFetcher* fetcher) const { |
- // ZeroSuggestProvider does not have a keyword provider. |
- DCHECK_EQ(fetcher, fetcher_.get()); |
- return false; |
-} |
+ LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REPLY_RECEIVED); |
-void ZeroSuggestProvider::UpdateMatches() { |
+ bool results_updated = false; |
+ if (source->GetStatus().is_success() && source->GetResponseCode() == 200) { |
+ std::string json_data = SearchSuggestionParser::ExtractJsonData(source); |
+ scoped_ptr<base::Value> data( |
+ SearchSuggestionParser::DeserializeJsonData(json_data)); |
+ if (data) { |
+ if (StoreSuggestionResponse(json_data, *data)) |
+ return; |
+ results_updated = ParseSuggestResults( |
+ *data, kDefaultZeroSuggestRelevance, false, &results_); |
+ } |
+ } |
+ fetcher_.reset(); |
done_ = true; |
ConvertResultsToAutocompleteMatches(); |
+ listener_->OnProviderUpdate(results_updated); |
+} |
+ |
+bool ZeroSuggestProvider::StoreSuggestionResponse( |
+ const std::string& json_data, |
+ const base::Value& parsed_data) { |
+ if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial() || |
+ json_data.empty()) |
+ return false; |
+ profile_->GetPrefs()->SetString(prefs::kZeroSuggestCachedResults, json_data); |
+ |
+ // If we received an empty result list, we should update the display, as it |
+ // may be showing cached results that should not be shown. |
+ const base::ListValue* root_list = NULL; |
+ const base::ListValue* results_list = NULL; |
+ if (parsed_data.GetAsList(&root_list) && |
+ root_list->GetList(1, &results_list) && |
+ results_list->empty()) |
+ return false; |
+ |
+ // We are finished with the request and want to bail early. |
+ if (results_from_cache_) |
+ done_ = true; |
+ |
+ return results_from_cache_; |
} |
void ZeroSuggestProvider::AddSuggestResultsToMap( |
@@ -306,7 +304,6 @@ AutocompleteMatch ZeroSuggestProvider::NavigationToMatch( |
} |
void ZeroSuggestProvider::Run(const GURL& suggest_url) { |
- suggest_results_pending_ = 0; |
const int kFetcherID = 1; |
fetcher_.reset( |
net::URLFetcher::Create(kFetcherID, |
@@ -330,7 +327,6 @@ void ZeroSuggestProvider::Run(const GURL& suggest_url) { |
weak_ptr_factory_.GetWeakPtr()), false); |
} |
} |
- suggest_results_pending_ = 1; |
LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_SENT); |
} |
@@ -459,7 +455,8 @@ void ZeroSuggestProvider::MaybeUseCachedSuggestions() { |
if (!json_data.empty()) { |
scoped_ptr<base::Value> data( |
SearchSuggestionParser::DeserializeJsonData(json_data)); |
- if (data && ParseSuggestResults(*data.get(), false, &results_)) { |
+ if (data && ParseSuggestResults( |
+ *data, kDefaultZeroSuggestRelevance, false, &results_)) { |
ConvertResultsToAutocompleteMatches(); |
results_from_cache_ = !matches_.empty(); |
} |