zero_suggest_provider.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang// Use of this source code is governed by a BSD-style license that can be 32da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang// found in the LICENSE file. 437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang 537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/autocomplete/zero_suggest_provider.h" 637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang 72da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "base/callback.h" 82da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "base/i18n/case_conversion.h" 937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/json/json_string_value_serializer.h" 1037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/metrics/histogram.h" 1137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/prefs/pref_service.h" 1237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/strings/string16.h" 1337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/strings/string_util.h" 1437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/strings/utf_string_conversions.h" 1537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "base/time/time.h" 162da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "chrome/browser/autocomplete/autocomplete_classifier.h" 172da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "chrome/browser/autocomplete/autocomplete_classifier_factory.h" 182da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "chrome/browser/autocomplete/autocomplete_input.h" 192da723a953a18e3c7fec194cec1216cf31130c86Gloria Wang#include "chrome/browser/autocomplete/autocomplete_match.h" 2037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/autocomplete/autocomplete_provider_listener.h" 2137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/autocomplete/history_url_provider.h" 2237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/autocomplete/search_provider.h" 2337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/autocomplete/url_prefix.h" 2437fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/history/history_types.h" 2537fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/history/top_sites.h" 2637fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/metrics/variations/variations_http_header_provider.h" 2737fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/omnibox/omnibox_field_trial.h" 2837fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/profiles/profile.h" 2937fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/search/search.h" 3037fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/search_engines/template_url_service.h" 3137fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/browser/search_engines/template_url_service_factory.h" 3237fe158a8611dd11ec0253ab1552399b780988dcGloria Wang#include "chrome/common/net/url_fixer_upper.h" 337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "chrome/common/pref_names.h" 347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "chrome/common/url_constants.h" 357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "components/pref_registry/pref_registry_syncable.h" 367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "content/public/browser/user_metrics.h" 377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/base/escape.h" 387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/base/load_flags.h" 397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/base/net_util.h" 407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/http/http_request_headers.h" 417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/url_request/url_fetcher.h" 427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "net/url_request/url_request_status.h" 437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang#include "url/gurl.h" 447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangnamespace { 467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// TODO(hfung): The histogram code was copied and modified from 487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// search_provider.cc. Refactor and consolidate the code. 497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// We keep track in a histogram how many suggest requests we send, how 507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// many suggest requests we invalidate (e.g., due to a user typing 517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// another character), and how many replies we receive. 527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// *** ADD NEW ENUMS AFTER ALL PREVIOUSLY DEFINED ONES! *** 5337fe158a8611dd11ec0253ab1552399b780988dcGloria Wang// (excluding the end-of-list enum value) 547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// We do not want values of existing enums to change or else it screws 557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// up the statistics. 567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangenum ZeroSuggestRequestsHistogramValue { 577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZERO_SUGGEST_REQUEST_SENT = 1, 587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZERO_SUGGEST_REQUEST_INVALIDATED, 597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZERO_SUGGEST_REPLY_RECEIVED, 607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZERO_SUGGEST_MAX_REQUEST_HISTOGRAM_VALUE 617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang}; 627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid LogOmniboxZeroSuggestRequest( 647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZeroSuggestRequestsHistogramValue request_value) { 657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang UMA_HISTOGRAM_ENUMERATION("Omnibox.ZeroSuggestRequests", request_value, 667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ZERO_SUGGEST_MAX_REQUEST_HISTOGRAM_VALUE); 677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// The maximum relevance of the top match from this provider. 707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangconst int kDefaultVerbatimZeroSuggestRelevance = 1300; 717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// Relevance value to use if it was not set explicitly by the server. 737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangconst int kDefaultZeroSuggestRelevance = 100; 747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} // namespace 767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// static 787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangZeroSuggestProvider* ZeroSuggestProvider::Create( 797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteProviderListener* listener, 807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang Profile* profile) { 817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return new ZeroSuggestProvider(listener, profile); 827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang// static 857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::RegisterProfilePrefs( 867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang user_prefs::PrefRegistrySyncable* registry) { 877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang registry->RegisterStringPref( 887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang prefs::kZeroSuggestCachedResults, 897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang std::string(), 907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang user_prefs::PrefRegistrySyncable::UNSYNCABLE_PREF); 917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::Start(const AutocompleteInput& input, 947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bool minimal_changes) { 957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.clear(); 967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (input.type() == AutocompleteInput::INVALID) 977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang Stop(true); 1007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang field_trial_triggered_ = false; 1017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang field_trial_triggered_in_session_ = false; 1027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_from_cache_ = false; 1037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang permanent_text_ = input.text(); 1047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_query_ = input.current_url().spec(); 1057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_page_classification_ = input.current_page_classification(); 1067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_url_match_ = MatchForCurrentURL(); 1077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const TemplateURL* default_provider = 1097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang template_url_service_->GetDefaultSearchProvider(); 1107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (default_provider == NULL) 1117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 1127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::string16 prefix; 1147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang TemplateURLRef::SearchTermsArgs search_term_args(prefix); 1157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang GURL suggest_url(default_provider->suggestions_url_ref().ReplaceSearchTerms( 1167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang search_term_args)); 1177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!suggest_url.is_valid()) 1187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 1197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // No need to send the current page URL in personalized suggest field trial. 1217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (CanSendURL(input.current_url(), suggest_url, default_provider, 1227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_page_classification_, profile_) && 1237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang !OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) { 1247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Update suggest_url to include the current_page_url. 1257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang search_term_args.current_page_url = current_query_; 1267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang suggest_url = GURL(default_provider->suggestions_url_ref(). 1277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ReplaceSearchTerms(search_term_args)); 1287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } else if (!CanShowZeroSuggestWithoutSendingURL(suggest_url, 1297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang input.current_url())) { 1307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 1317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang done_ = false; 1347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // TODO(jered): Consider adding locally-sourced zero-suggestions here too. 1357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // These may be useful on the NTP or more relevant to the user than server 1367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // suggestions, if based on local browsing history. 1377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang MaybeUseCachedSuggestions(); 1387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang Run(suggest_url); 1397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::DeleteMatch(const AutocompleteMatch& match) { 1427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) { 1437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Remove the deleted match from the cache, so it is not shown to the user 1447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // again. Since we cannot remove just one result, blow away the cache. 1457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang profile_->GetPrefs()->SetString(prefs::kZeroSuggestCachedResults, 1467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang std::string()); 1477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 1487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang BaseSearchProvider::DeleteMatch(match); 1497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::ResetSession() { 1527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // The user has started editing in the omnibox, so leave 1537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // |field_trial_triggered_in_session_| unchanged and set 1547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // |field_trial_triggered_| to false since zero suggest is inactive now. 1557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang field_trial_triggered_ = false; 1567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::ModifyProviderInfo( 1597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang metrics::OmniboxEventProto_ProviderInfo* provider_info) const { 1607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!results_.suggest_results.empty() || !results_.navigation_results.empty()) 1617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang provider_info->set_times_returned_results_in_session(1); 1627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangZeroSuggestProvider::ZeroSuggestProvider( 1657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteProviderListener* listener, 1667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang Profile* profile) 1677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang : BaseSearchProvider(listener, profile, 1687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteProvider::TYPE_ZERO_SUGGEST), 1697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang template_url_service_(TemplateURLServiceFactory::GetForProfile(profile)), 1707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_from_cache_(false), 1717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang weak_ptr_factory_(this) { 1727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangZeroSuggestProvider::~ZeroSuggestProvider() { 1757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 1767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangbool ZeroSuggestProvider::StoreSuggestionResponse( 1787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const std::string& json_data, 1797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const base::Value& parsed_data) { 1807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial() || 1817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang json_data.empty()) 1827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 1837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang profile_->GetPrefs()->SetString(prefs::kZeroSuggestCachedResults, json_data); 1847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // If we received an empty result list, we should update the display, as it 1867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // may be showing cached results that should not be shown. 1877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const base::ListValue* root_list = NULL; 1887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const base::ListValue* results_list = NULL; 1897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (parsed_data.GetAsList(&root_list) && 1907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang root_list->GetList(1, &results_list) && 1917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_list->empty()) 1927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 1937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // We are finished with the request and want to bail early. 1957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (results_from_cache_) 1967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang done_ = true; 1977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 1987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return results_from_cache_; 1997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangconst TemplateURL* ZeroSuggestProvider::GetTemplateURL(bool is_keyword) const { 2027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Zero suggest provider should not receive keyword results. 2037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang DCHECK(!is_keyword); 2047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return template_url_service_->GetDefaultSearchProvider(); 2057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangconst AutocompleteInput ZeroSuggestProvider::GetInput(bool is_keyword) const { 2087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return AutocompleteInput( 2097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::string16(), base::string16::npos, base::string16(), 2107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang GURL(current_query_), current_page_classification_, true, false, false, 2117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang true); 2127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangBaseSearchProvider::Results* ZeroSuggestProvider::GetResultsToFill( 2157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang bool is_keyword) { 2167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang DCHECK(!is_keyword); 2177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return &results_; 2187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangbool ZeroSuggestProvider::ShouldAppendExtraParams( 2217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const SuggestResult& result) const { 2227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // We always use the default provider for search, so append the params. 2237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return true; 2247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::StopSuggest() { 2277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (suggest_results_pending_ > 0) 2287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_INVALIDATED); 2297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang suggest_results_pending_ = 0; 2307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_.reset(); 2317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::ClearAllResults() { 2347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // We do not call Clear() on |results_| to retain |verbatim_relevance| 2357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // value in the |results_| object. |verbatim_relevance| is used at the 2367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // beginning of the next StartZeroSuggest() call to determine the current url 2377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // match relevance. 2387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_.suggest_results.clear(); 2397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_.navigation_results.clear(); 2407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_query_.clear(); 2417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint ZeroSuggestProvider::GetDefaultResultRelevance() const { 2447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return kDefaultZeroSuggestRelevance; 2457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::RecordDeletionResult(bool success) { 2487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (success) { 2497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang content::RecordAction( 2507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::UserMetricsAction("Omnibox.ZeroSuggestDelete.Success")); 2517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } else { 2527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang content::RecordAction( 2537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::UserMetricsAction("Omnibox.ZeroSuggestDelete.Failure")); 2547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 2557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::LogFetchComplete(bool success, bool is_keyword) { 2587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REPLY_RECEIVED); 2597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangbool ZeroSuggestProvider::IsKeywordFetcher( 2627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const net::URLFetcher* fetcher) const { 2637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // ZeroSuggestProvider does not have a keyword provider. 2647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang DCHECK_EQ(fetcher, fetcher_.get()); 2657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 2667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::UpdateMatches() { 2697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang done_ = true; 2707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ConvertResultsToAutocompleteMatches(); 2717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::AddSuggestResultsToMap( 2747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const SuggestResults& results, 2757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang MatchMap* map) { 2767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for (size_t i = 0; i < results.size(); ++i) 2777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AddMatchToMap(results[i], std::string(), i, false, map); 2787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 2797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangAutocompleteMatch ZeroSuggestProvider::NavigationToMatch( 2817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const NavigationResult& navigation) { 2827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteMatch match(this, navigation.relevance(), false, 2837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang navigation.type()); 2847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.destination_url = navigation.url(); 2857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Zero suggest results should always omit protocols and never appear bold. 2877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const std::string languages( 2887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 2897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.contents = net::FormatUrl(navigation.url(), languages, 2907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang net::kFormatUrlOmitAll, net::UnescapeRule::SPACES, NULL, NULL, NULL); 2917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.fill_into_edit += 2927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteInput::FormattedStringWithEquivalentMeaning(navigation.url(), 2937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.contents); 2947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteMatch::ClassifyLocationInString(base::string16::npos, 0, 2967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.contents.length(), ACMatchClassification::URL, 2977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang &match.contents_class); 2987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 2997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.description = 3007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteMatch::SanitizeString(navigation.description()); 3017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteMatch::ClassifyLocationInString(base::string16::npos, 0, 3027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.description.length(), ACMatchClassification::NONE, 3037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang &match.description_class); 3047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return match; 3057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::Run(const GURL& suggest_url) { 3087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang suggest_results_pending_ = 0; 3097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const int kFetcherID = 1; 3107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_.reset( 3117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang net::URLFetcher::Create(kFetcherID, 3127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang suggest_url, 3137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang net::URLFetcher::GET, this)); 3147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_->SetRequestContext(profile_->GetRequestContext()); 3157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES); 3167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Add Chrome experiment state to the request headers. 3177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang net::HttpRequestHeaders headers; 3187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang chrome_variations::VariationsHttpHeaderProvider::GetInstance()->AppendHeaders( 3197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_->GetOriginalURL(), profile_->IsOffTheRecord(), false, &headers); 3207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_->SetExtraRequestHeaders(headers.ToString()); 3217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang fetcher_->Start(); 3227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial()) { 3247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang most_visited_urls_.clear(); 3257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang history::TopSites* ts = profile_->GetTopSites(); 3267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (ts) { 3277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ts->GetMostVisitedURLs( 3287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::Bind(&ZeroSuggestProvider::OnMostVisitedUrlsAvailable, 3297913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang weak_ptr_factory_.GetWeakPtr()), false); 3307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang suggest_results_pending_ = 1; 3337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang LogOmniboxZeroSuggestRequest(ZERO_SUGGEST_REQUEST_SENT); 3347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::OnMostVisitedUrlsAvailable( 3377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const history::MostVisitedURLList& urls) { 3387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang most_visited_urls_ = urls; 3397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 3407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::ConvertResultsToAutocompleteMatches() { 3427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.clear(); 3437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const TemplateURL* default_provider = 3457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang template_url_service_->GetDefaultSearchProvider(); 3467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Fail if we can't set the clickthrough URL for query suggestions. 3477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (default_provider == NULL || !default_provider->SupportsReplacement()) 3487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 3497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang MatchMap map; 3517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AddSuggestResultsToMap(results_.suggest_results, &map); 3527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const int num_query_results = map.size(); 3547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const int num_nav_results = results_.navigation_results.size(); 3557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const int num_results = num_query_results + num_nav_results; 3567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang UMA_HISTOGRAM_COUNTS("ZeroSuggest.QueryResults", num_query_results); 3577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang UMA_HISTOGRAM_COUNTS("ZeroSuggest.URLResults", num_nav_results); 3587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang UMA_HISTOGRAM_COUNTS("ZeroSuggest.AllResults", num_results); 3597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Show Most Visited results after ZeroSuggest response is received. 3617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial()) { 3627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!current_url_match_.destination_url.is_valid()) 3637913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 3647913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.push_back(current_url_match_); 3657913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang int relevance = 600; 3667913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (num_results > 0) { 3677913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang UMA_HISTOGRAM_COUNTS( 3687913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang "Omnibox.ZeroSuggest.MostVisitedResultsCounterfactual", 3697913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang most_visited_urls_.size()); 3707913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3717913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const base::string16 current_query_string16( 3727913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang base::ASCIIToUTF16(current_query_)); 3737913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const std::string languages( 3747913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang profile_->GetPrefs()->GetString(prefs::kAcceptLanguages)); 3757913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for (size_t i = 0; i < most_visited_urls_.size(); i++) { 3767913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const history::MostVisitedURL& url = most_visited_urls_[i]; 3777913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang NavigationResult nav(*this, url.url, AutocompleteMatchType::NAVSUGGEST, 3787913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang url.title, std::string(), false, relevance, true, 3797913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_query_string16, languages); 3807913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.push_back(NavigationToMatch(nav)); 3817913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang --relevance; 3827913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3837913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 3847913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 3857913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3867913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (num_results == 0) 3877913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 3887913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3897913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // TODO(jered): Rip this out once the first match is decoupled from the 3907913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // current typing in the omnibox. 3917913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.push_back(current_url_match_); 3927913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3937913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for (MatchMap::const_iterator it(map.begin()); it != map.end(); ++it) 3947913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.push_back(it->second); 3957913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 3967913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const NavigationResults& nav_results(results_.navigation_results); 3977913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang for (NavigationResults::const_iterator it(nav_results.begin()); 3987913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang it != nav_results.end(); ++it) 3997913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang matches_.push_back(NavigationToMatch(*it)); 4007913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4017913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4027913073ddf11ca3dd7b0439998e1b17d443bb0baGloria WangAutocompleteMatch ZeroSuggestProvider::MatchForCurrentURL() { 4037913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteMatch match; 4047913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang AutocompleteClassifierFactory::GetForProfile(profile_)->Classify( 4057913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang permanent_text_, false, true, current_page_classification_, &match, NULL); 4067913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.is_history_what_you_typed_match = false; 4077913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.allowed_to_be_default_match = true; 4087913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4097913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // The placeholder suggestion for the current URL has high relevance so 4107913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // that it is in the first suggestion slot and inline autocompleted. It 4117913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // gets dropped as soon as the user types something. 4127913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang match.relevance = GetVerbatimRelevance(); 4137913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4147913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return match; 4157913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4167913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4177913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangint ZeroSuggestProvider::GetVerbatimRelevance() const { 4187913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return results_.verbatim_relevance >= 0 ? 4197913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_.verbatim_relevance : kDefaultVerbatimZeroSuggestRelevance; 4207913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4217913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4227913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangbool ZeroSuggestProvider::CanShowZeroSuggestWithoutSendingURL( 4237913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const GURL& suggest_url, 4247913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang const GURL& current_page_url) const { 4257913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!ZeroSuggestEnabled(suggest_url, 4267913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang template_url_service_->GetDefaultSearchProvider(), 4277913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang current_page_classification_, profile_)) 4287913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 429021523c8f11a487b993a1bce5304752b21754574Gloria Wang 4307913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // If we cannot send URLs, then only the MostVisited and Personalized 4317913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // variations can be shown. 4327913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!OmniboxFieldTrial::InZeroSuggestMostVisitedFieldTrial() && 4337913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang !OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) 4347913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 4357913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4367913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // Only show zero suggest for HTTP[S] pages. 4377913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // TODO(mariakhomenko): We may be able to expand this set to include pages 4387913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // with other schemes (e.g. chrome://). That may require improvements to 4397913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang // the formatting of the verbatim result returned by MatchForCurrentURL(). 4407913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!current_page_url.is_valid() || 4417913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ((current_page_url.scheme() != url::kHttpScheme) && 4427913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang (current_page_url.scheme() != url::kHttpsScheme))) 4437913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return false; 4447913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4457913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return true; 4467913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4477913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4487913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wangvoid ZeroSuggestProvider::MaybeUseCachedSuggestions() { 4497913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!OmniboxFieldTrial::InZeroSuggestPersonalizedFieldTrial()) 4507913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang return; 4517913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang 4527913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang std::string json_data = profile_->GetPrefs()->GetString( 4537913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang prefs::kZeroSuggestCachedResults); 4547913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (!json_data.empty()) { 4557913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang scoped_ptr<base::Value> data(DeserializeJsonData(json_data)); 4567913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang if (data && ParseSuggestResults(*data.get(), false, &results_)) { 4577913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang ConvertResultsToAutocompleteMatches(); 4587913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang results_from_cache_ = !matches_.empty(); 4597913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4607913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang } 4617913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang} 4627913073ddf11ca3dd7b0439998e1b17d443bb0baGloria Wang