15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file contains the Search autocomplete provider.  This provider is
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// responsible for all autocomplete entries that start with "Search <engine>
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// for ...", including searching for the current input string, search
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// history, and search suggestions.  An instance of it gets created and
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// managed by the autocomplete controller.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <map>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_input.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_match.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/autocomplete/autocomplete_provider.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_types.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/search_engines/template_url.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/url_request/url_fetcher_delegate.h"
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile;
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class SearchProviderTest;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURLService;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Value;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class URLFetcher;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Autocomplete provider for searches and suggestions from a search engine.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// After construction, the autocomplete controller repeatedly calls Start()
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// with some user input, each time expecting to receive a small set of the best
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// matches (either synchronously or asynchronously).
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Initially the provider creates a match that searches for the current input
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// text.  It also starts a task to query the Suggest servers.  When that data
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// comes back, the provider creates and returns matches for the best
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// suggestions.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SearchProvider : public AutocompleteProvider,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       public net::URLFetcherDelegate {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ID used in creating URLFetcher for default provider's suggest results.
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const int kDefaultProviderURLFetcherID;
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ID used in creating URLFetcher for keyword provider's suggest results.
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static const int kKeywordProviderURLFetcherID;
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  SearchProvider(AutocompleteProviderListener* listener, Profile* profile);
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns an AutocompleteMatch with the given |autocomplete_provider|,
64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |relevance|, and |type|, which represents a search via |template_url| for
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |query_string|.  If |template_url| is NULL, returns a match with an invalid
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // destination URL.
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  //
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |input_text| is the original user input, which may differ from
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |query_string|; e.g. the user typed "foo" and got a search suggestion of
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // "food", which we're now marking up.  This is used to highlight portions of
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // the match contents to distinguish locally-typed text from suggested text.
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  //
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |input| and |is_keyword| are necessary for various other details, like
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // whether we should allow inline autocompletion and what the transition type
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // should be.  |accepted_suggestion| and |omnibox_start_margin| are used along
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // with |input_text| to generate Assisted Query Stats.
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |append_extra_query_params| should be set if |template_url| is the default
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // search engine, so the destination URL will contain any
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // command-line-specified query params.
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  static AutocompleteMatch CreateSearchSuggestion(
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutocompleteProvider* autocomplete_provider,
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      int relevance,
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      AutocompleteMatch::Type type,
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const TemplateURL* template_url,
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const string16& query_string,
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const string16& input_text,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const AutocompleteInput& input,
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      bool is_keyword,
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int accepted_suggestion,
90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      int omnibox_start_margin,
91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      bool append_extra_query_params);
925e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AutocompleteProvider:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddProviderInfo(ProvidersInfo* provider_info) const OVERRIDE;
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ResetSession() OVERRIDE;
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool field_trial_triggered_in_session() const {
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return field_trial_triggered_in_session_;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
102868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // TODO(hfung): Remove ZeroSuggestProvider as a friend class after
103868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // refactoring common code to a new base class.
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class SearchProviderTest;
1057dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  friend class ZeroSuggestProvider;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInline);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInlineDomainClassify);
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInlineSchemeSubstring);
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, RemoveStaleResultsTest);
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, SuggestRelevanceExperiment);
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(AutocompleteProviderTest, GetDestinationURL);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Manages the providers (TemplateURLs) used by SearchProvider. Two providers
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may be used:
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . The default provider. This corresponds to the user's default search
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   engine. This is always used, except for the rare case of no default
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //   engine.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // . The keyword provider. This is used if the user has typed in a keyword.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Providers {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit Providers(TemplateURLService* template_url_service);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Returns true if the specified providers match the two providers cached
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // by this class.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool equal(const string16& default_provider,
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const string16& keyword_provider) const {
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return (default_provider == default_provider_) &&
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          (keyword_provider == keyword_provider_);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Resets the cached providers.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set(const string16& default_provider,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             const string16& keyword_provider) {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_provider_ = default_provider;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      keyword_provider_ = keyword_provider;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURLService* template_url_service() { return template_url_service_; }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& default_provider() const { return default_provider_; }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& keyword_provider() const { return keyword_provider_; }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // NOTE: These may return NULL even if the provider members are nonempty!
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TemplateURL* GetDefaultProviderURL() const;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const TemplateURL* GetKeywordProviderURL() const;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns true if there is a valid keyword provider.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool has_keyword_provider() const { return !keyword_provider_.empty(); }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    TemplateURLService* template_url_service_;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Cached across the life of a query so we behave consistently even if the
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // user changes their default while the query is running.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 default_provider_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 keyword_provider_;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Providers);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The Result classes are intermediate representations of AutocompleteMatches,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // simply containing relevance-ranked search and navigation suggestions.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // They may be cached to provide some synchronous matches while requests for
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // new suggestions from updated input are in flight.
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(msw) Extend these classes to generate their corresponding matches and
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //           other requisite data, in order to consolidate and simplify the
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  //           highly fragmented SearchProvider logic for each Result type.
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Result {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
169eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    Result(bool from_keyword_provider,
170eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           int relevance,
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch           bool relevance_from_server);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~Result();
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool from_keyword_provider() const { return from_keyword_provider_; }
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int relevance() const { return relevance_; }
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_relevance(int relevance) { relevance_ = relevance; }
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool relevance_from_server() const { return relevance_from_server_; }
180eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    void set_relevance_from_server(bool relevance_from_server) {
181eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      relevance_from_server_ = relevance_from_server;
182eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    }
183eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns if this result is inlineable against the current input |input|.
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Non-inlineable results are stale.
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual bool IsInlineable(const string16& input) const = 0;
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Returns the default relevance value for this result (which may
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // be left over from a previous omnibox input) given the current
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // input and whether the current input caused a keyword provider
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // to be active.
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual int CalculateRelevance(const AutocompleteInput& input,
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   bool keyword_provider_requested) const = 0;
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)   protected:
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // True if the result came from the keyword provider.
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool from_keyword_provider_;
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The relevance score.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int relevance_;
201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch   private:
203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Whether this result's relevance score was fully or partly calculated
204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // based on server information, and thus is assumed to be more accurate.
205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // This is ultimately used in
206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // SearchProvider::ConvertResultsToAutocompleteMatches(), see comments
207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // there.
208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool relevance_from_server_;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class SuggestResult : public Result {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    SuggestResult(const string16& suggestion,
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  bool from_keyword_provider,
215eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  int relevance,
216eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                  bool relevance_from_server);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~SuggestResult();
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& suggestion() const { return suggestion_; }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Result:
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual bool IsInlineable(const string16& input) const OVERRIDE;
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual int CalculateRelevance(
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const AutocompleteInput& input,
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bool keyword_provider_requested) const OVERRIDE;
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The search suggestion string.
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 suggestion_;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class NavigationResult : public Result {
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // |provider| is necessary to use StringForURLDisplay() in order to
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // compute |formatted_url_|.
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    NavigationResult(const AutocompleteProvider& provider,
237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     const GURL& url,
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const string16& description,
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                     bool from_keyword_provider,
240eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     int relevance,
241eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     bool relevance_from_server);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual ~NavigationResult();
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url() const { return url_; }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const string16& description() const { return description_; }
246eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const string16& formatted_url() const { return formatted_url_; }
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // Result:
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual bool IsInlineable(const string16& input) const OVERRIDE;
250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    virtual int CalculateRelevance(
251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        const AutocompleteInput& input,
252c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        bool keyword_provider_requested) const OVERRIDE;
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The suggested url for navigation.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    GURL url_;
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
258c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // The properly formatted ("fixed up") URL string with equivalent meaning
259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // to the one in |url_|.
260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    string16 formatted_url_;
261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The suggested navigational result description; generally the site name.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    string16 description_;
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
266eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  class CompareScoredResults;
267eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<SuggestResult> SuggestResults;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::vector<NavigationResult> NavigationResults;
270eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::vector<history::KeywordSearchTermVisit> HistoryResults;
271eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  typedef std::map<string16, AutocompleteMatch> MatchMap;
27290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
27390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // A simple structure bundling most of the information (including
27490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // both SuggestResults and NavigationResults) returned by a call to
27590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // the suggest server.
276eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  //
277eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // This has to be declared after the typedefs since it relies on some of them.
27890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  struct Results {
27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    Results();
28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    ~Results();
28190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
28290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Clears |suggest_results| and |navigation_results| and resets
283eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // |verbatim_relevance| to -1 (implies unset).
28490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    void Clear();
28590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
286eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // Returns whether any of the results (including verbatim) have
287eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    // server-provided scores.
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    bool HasServerProvidedScores() const;
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
29090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Query suggestions sorted by relevance score.
29190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    SuggestResults suggest_results;
29290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // Navigational suggestions sorted by relevance score.
29490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    NavigationResults navigation_results;
29590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
29690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // The server supplied verbatim relevance scores. Negative values
29790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // indicate that there is no suggested score; a value of 0
29890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    // suppresses the verbatim result.
29990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    int verbatim_relevance;
30090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
30190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)   private:
30290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(Results);
30390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  };
30490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~SearchProvider();
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Removes non-inlineable results until either the top result can inline
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // autocomplete the current input or verbatim outscores the top result.
309eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static void RemoveStaleResults(const string16& input,
310eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 int verbatim_relevance,
311eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 SuggestResults* suggest_results,
312eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                 NavigationResults* navigation_results);
313eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
314eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Calculates the relevance score for the keyword verbatim result (if the
315eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // input matches one of the profile's keyword).
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static int CalculateRelevanceForKeywordVerbatim(AutocompleteInput::Type type,
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                                  bool prefer_keyword);
318eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
319eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // AutocompleteProvider:
320eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Start(const AutocompleteInput& input,
321eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     bool minimal_changes) OVERRIDE;
322eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void Stop(bool clear_cached_results) OVERRIDE;
323eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
324eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // net::URLFetcherDelegate:
325eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called when timer_ expires.
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Run();
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Runs the history query, if necessary. The history query is synchronous.
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This does not update |done_|.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoHistoryQuery(bool minimal_changes);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Determines whether an asynchronous subcomponent query should run for the
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // current input.  If so, starts it if necessary; otherwise stops it.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This function does not update |done_|.  Callers must do so.
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartOrStopSuggestQuery(bool minimal_changes);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true when the current query can be sent to the Suggest service.
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This will be false e.g. when Suggest is disabled, the query contains
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // potentially private data, etc.
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsQuerySuitableForSuggest() const;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Stops the suggest query.
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: This does not update |done_|.  Callers must do so.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StopSuggest();
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Clears the current results.
349c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ClearAllResults();
350c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
351eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Removes stale results for both default and keyword providers.  See comments
352eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // on RemoveStaleResults().
353c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void RemoveAllStaleResults();
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Apply calculated relevance scores to the current results.
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ApplyCalculatedRelevance();
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ApplyCalculatedSuggestRelevance(SuggestResults* list);
358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void ApplyCalculatedNavigationRelevance(NavigationResults* list);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Starts a new URLFetcher requesting suggest results from |template_url|;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // callers own the returned URLFetcher, which is NULL for invalid providers.
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  net::URLFetcher* CreateSuggestFetcher(int id,
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        const TemplateURL* template_url,
3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                        const AutocompleteInput& input);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parses results from the suggest server and updates the appropriate suggest
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and navigation result lists, depending on whether |is_keyword| is true.
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns whether the appropriate result list members were updated.
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ParseSuggestResults(base::Value* root_val, bool is_keyword);
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Converts the parsed results to a set of AutocompleteMatches, |matches_|.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ConvertResultsToAutocompleteMatches();
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Checks if suggested relevances violate certain expected constraints.
3752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // See UpdateMatches() for the use and explanation of these constraints.
376c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool IsTopMatchNavigationInKeywordMode() const;
3772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsTopMatchScoreTooLow() const;
3789ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch  bool IsTopMatchSearchWithURLInput() const;
379a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch  bool HasValidDefaultMatch(
380a031efa9dbd9b321781674193e8ac7636d47eb1dBen Murdoch      bool autocomplete_result_will_reorder_for_default_match) const;
3812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Updates |matches_| from the latest results; applies calculated relevances
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if suggested relevances cause undesriable behavior. Updates |done_|.
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateMatches();
3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
386eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Converts an appropriate number of navigation results in
387eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |navigation_results| to matches and adds them to |matches|.
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddNavigationResultsToMatches(
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const NavigationResults& navigation_results,
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      ACMatches* matches);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a match for each result in |results| to |map|. |is_keyword| indicates
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // whether the results correspond to the keyword provider or default provider.
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddHistoryResultsToMap(const HistoryResults& results,
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              bool is_keyword,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              int did_not_accept_suggestion,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              MatchMap* map);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Calculates relevance scores for all |results|.
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SuggestResults ScoreHistoryResults(const HistoryResults& results,
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool base_prevent_inline_autocomplete,
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool input_multiple_words,
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const string16& input_text,
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool is_keyword);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Adds matches for |results| to |map|.
407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void AddSuggestResultsToMap(const SuggestResults& results, MatchMap* map);
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Gets the relevance score for the verbatim result.  This value may be
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // provided by the suggest server or calculated locally; if
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |relevance_from_server| is non-NULL, it will be set to indicate which of
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // those is true.
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int GetVerbatimRelevance(bool* relevance_from_server) const;
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculates the relevance score for the verbatim result from the
4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // default search engine.  This version takes into account context:
4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // i.e., whether the user has entered a keyword-based search or not.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CalculateRelevanceForVerbatim() const;
419eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Calculates the relevance score for the verbatim result from the default
4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // search engine *ignoring* whether the input is a keyword-based search
4222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // or not.  This function should only be used to determine the minimum
4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // relevance score that the best result from this provider should have.
4242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // For normal use, prefer the above function.
4252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int CalculateRelevanceForVerbatimIgnoringKeywordModeState() const;
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Gets the relevance score for the keyword verbatim result.
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // |relevance_from_server| is handled as in GetVerbatimRelevance().
4292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(mpearson): Refactor so this duplication isn't necesary or
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // restructure so one static function takes all the parameters it needs
4312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // (rather than looking at internal state).
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  int GetKeywordVerbatimRelevance(bool* relevance_from_server) const;
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |time| is the time at which this query was last seen.  |is_keyword|
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indicates whether the results correspond to the keyword provider or default
436a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // provider. |use_aggressive_method| says whether this function can use a
437a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // method that gives high scores (1200+) rather than one that gives lower
438a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // scores.  When using the aggressive method, scores may exceed 1300
439a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // unless |prevent_search_history_inlining| is set.
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int CalculateRelevanceForHistory(const base::Time& time,
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   bool is_keyword,
442a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   bool use_aggressive_method,
443a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                   bool prevent_search_history_inlining) const;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates an AutocompleteMatch for "Search <engine> for |query_string|" with
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the supplied relevance.  Adds this match to |map|; if such a match already
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // exists, whichever one has lower relevance is eliminated.
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddMatchToMap(const string16& query_string,
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const string16& input_text,
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int relevance,
451eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                     bool relevance_from_server,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     AutocompleteMatch::Type type,
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     int accepted_suggestion,
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     bool is_keyword,
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     MatchMap* map);
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns an AutocompleteMatch for a navigational suggestion.
458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  AutocompleteMatch NavigationToMatch(const NavigationResult& navigation);
459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Resets the scores of all |keyword_navigation_results_| matches to
461c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // be below that of the top keyword query match (the verbatim match
462c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // as expressed by |keyword_verbatim_relevance_| or keyword query
463c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // suggestions stored in |keyword_suggest_results_|).  If there
464c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // are no keyword suggestions and keyword verbatim is suppressed,
465c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // then drops the suggested relevance scores for the navsuggestions
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // and drops the request to suppress verbatim, thereby introducing the
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // keyword verbatim match which will naturally outscore the navsuggestions.
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void DemoteKeywordNavigationMatchesPastTopQuery();
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Updates the value of |done_| from the internal state.
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateDone();
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // The amount of time to wait before sending a new suggest request after the
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // previous one.  Non-const because some unittests modify this value.
475eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static int kMinimumTimeBetweenSuggestQueriesMs;
476eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
477eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // We annotate our AutocompleteMatches with whether their relevance scores
478eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // were server-provided using this key in the |additional_info| field.
479eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static const char kRelevanceFromServerKey[];
480eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // These are the values we record with the above key.
481eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static const char kTrue[];
482eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static const char kFalse[];
483eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Maintains the TemplateURLs used.
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Providers providers_;
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The user's input.
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AutocompleteInput input_;
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Input when searching against the keyword provider.
4912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  AutocompleteInput keyword_input_;
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Searches in the user's history that begin with the input text.
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryResults keyword_history_results_;
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HistoryResults default_history_results_;
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Number of suggest results that haven't yet arrived. If greater than 0 it
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // indicates one of the URLFetchers is still running.
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int suggest_results_pending_;
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // A timer to start a query to the suggest server after the user has stopped
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // typing for long enough.
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::OneShotTimer<SearchProvider> timer_;
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The time at which we sent a query to the suggest server.
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeTicks time_suggest_request_sent_;
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fetchers used to retrieve results for the keyword and default providers.
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> keyword_fetcher_;
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<net::URLFetcher> default_fetcher_;
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Results from the default and keyword search providers.
51390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Results default_results_;
51490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  Results keyword_results_;
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether a field trial, if any, has triggered in the most recent
5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // autocomplete query.  This field is set to false in Start() and may be set
5182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to true if either the default provider or keyword provider has completed
5192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and their corresponding suggest response contained
5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // '"google:fieldtrialtriggered":true'.
5212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // If the autocomplete query has not returned, this field is set to false.
5222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool field_trial_triggered_;
5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above except that it is maintained across the current Omnibox
5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // session.
5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool field_trial_triggered_in_session_;
5272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
5287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // If true, search history query suggestions will score low enough that
5297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // they will not be inlined.
5307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  bool prevent_search_history_inlining_;
5317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(SearchProvider);
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
536