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