1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This file contains the Search autocomplete provider.  This provider is
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// responsible for all non-keyword autocomplete entries that start with
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "Search <engine> for ...", including searching for the current input string,
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// search history, and search suggestions.  An instance of it gets created and
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// managed by the autocomplete controller.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For more information on the autocomplete system in general, including how
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the autocomplete controller and autocomplete providers work, see
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// chrome/browser/autocomplete.h.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <map>
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_ptr.h"
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/autocomplete/autocomplete.h"
25513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/autocomplete/autocomplete_match.h"
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history_types.h"
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/search_engines/template_url.h"
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h"
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/net/url_fetcher.h"
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Profile;
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Value;
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Autocomplete provider for searches and suggestions from a search engine.
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// After construction, the autocomplete controller repeatedly calls Start()
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// with some user input, each time expecting to receive a small set of the best
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// matches (either synchronously or asynchronously).
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Initially the provider creates a match that searches for the current input
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// text.  It also starts a task to query the Suggest servers.  When that data
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// comes back, the provider creates and returns matches for the best
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// suggestions.
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass SearchProvider : public AutocompleteProvider,
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       public URLFetcher::Delegate {
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  SearchProvider(ACProviderListener* listener, Profile* profile);
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if defined(UNIT_TEST)
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static void set_query_suggest_immediately(bool value) {
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    query_suggest_immediately_ = value;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Marks the instant query as done. If |input_text| is non-empty this changes
56201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the 'search what you typed' results text to |input_text| + |suggest_text|.
57201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // |input_text| is the text the user input into the edit. |input_text| differs
58201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // from |input_.text()| if the input contained whitespace.
59201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  //
60201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // This method also marks the search provider as no longer needing to wait for
61201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // the instant result.
6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void FinalizeInstantQuery(const string16& input_text,
6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            const string16& suggest_text);
64201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // AutocompleteProvider
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Start(const AutocompleteInput& input,
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bool minimal_changes);
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Stop();
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URLFetcher::Delegate
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void OnURLFetchComplete(const URLFetcher* source,
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const GURL& url,
733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen                                  const net::URLRequestStatus& status,
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  int response_code,
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const ResponseCookies& cookies,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                  const std::string& data);
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ID used in creating URLFetcher for default provider's suggest results.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kDefaultProviderURLFetcherID;
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // ID used in creating URLFetcher for keyword provider's suggest results.
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static const int kKeywordProviderURLFetcherID;
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~SearchProvider();
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Manages the providers (TemplateURLs) used by SearchProvider. Two providers
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // may be used:
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // . The default provider. This corresponds to the user's default search
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   engine. This is always used, except for the rare case of no default
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //   engine.
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // . The keyword provider. This is used if the user has typed in a keyword.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  class Providers {
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   public:
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Providers() : default_provider_(NULL), keyword_provider_(NULL) {}
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true if the specified providers match the two providers managed
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // by this class.
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool equals(const TemplateURL* default_provider,
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                const TemplateURL* keyword_provider) {
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return (default_provider == default_provider_ &&
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              keyword_provider == keyword_provider_);
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Resets the providers.
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    void Set(const TemplateURL* default_provider,
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch             const TemplateURL* keyword_provider);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TemplateURL& default_provider() const {
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(valid_default_provider());
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return cached_default_provider_;
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TemplateURL& keyword_provider() const {
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      DCHECK(valid_keyword_provider());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return cached_keyword_provider_;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true of the keyword provider is valid.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool valid_keyword_provider() const { return !!keyword_provider_; }
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true if the keyword provider is valid and has a valid suggest
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // url.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool valid_suggest_for_keyword_provider() const {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return keyword_provider_ && cached_keyword_provider_.suggestions_url();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true of the default provider is valid.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool valid_default_provider() const { return !!default_provider_; }
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true if the default provider is valid and has a valid suggest
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // url.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool valid_suggest_for_default_provider() const {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return default_provider_ && cached_default_provider_.suggestions_url();
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Returns true if |from_keyword_provider| is true, or
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // the keyword provider is not valid.
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_primary_provider(bool from_keyword_provider) const {
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      return from_keyword_provider || !valid_keyword_provider();
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch   private:
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Cached across the life of a query so we behave consistently even if the
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // user changes their default while the query is running.
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TemplateURL cached_default_provider_;
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    TemplateURL cached_keyword_provider_;
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // TODO(pkasting): http://b/1162970  We shouldn't need these.
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TemplateURL* default_provider_;
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const TemplateURL* keyword_provider_;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct NavigationResult {
15572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    NavigationResult(const GURL& url, const string16& site_name)
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : url(url),
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          site_name(site_name) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // The URL.
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Name for the site.
16472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    string16 site_name;
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  typedef std::vector<string16> SuggestResults;
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<NavigationResult> NavigationResults;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<history::KeywordSearchTermVisit> HistoryResults;
17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  typedef std::map<string16, AutocompleteMatch> MatchMap;
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Called when timer_ expires.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Run();
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Runs the history query, if necessary. The history query is synchronous.
176513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // This does not update |done_|.
177513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void DoHistoryQuery(bool minimal_changes);
178513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Determines whether an asynchronous subcomponent query should run for the
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // current input.  If so, starts it if necessary; otherwise stops it.
181513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // NOTE: This function does not update |done_|.  Callers must do so.
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StartOrStopSuggestQuery(bool minimal_changes);
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true when the current query can be sent to the Suggest service.
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This will be false e.g. when Suggest is disabled, the query contains
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // potentially private data, etc.
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsQuerySuitableForSuggest() const;
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // Stops the suggest query.
190513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  // NOTE: This does not update |done_|.  Callers must do so.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void StopSuggest();
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates a URLFetcher requesting suggest results for the specified
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TemplateURL. Ownership of the returned URLFetchet passes to the caller.
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  URLFetcher* CreateSuggestFetcher(int id,
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   const TemplateURL& provider,
19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                   const string16& text);
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parses the results from the Suggest server and stores up to kMaxMatches of
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // them in server_results_.  Returns whether parsing succeeded.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ParseSuggestResults(Value* root_val,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           bool is_keyword,
20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                           const string16& input_text,
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                           SuggestResults* suggest_results);
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts the parsed server results in server_results_ to a set of
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // AutocompleteMatches and adds them to |matches_|.  This also sets |done_|
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // correctly.
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ConvertResultsToAutocompleteMatches();
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts the first navigation result in |navigation_results| to an
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // AutocompleteMatch and adds it to |matches_|.
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddNavigationResultsToMatches(
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    const NavigationResults& navigation_results,
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    bool is_keyword);
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a match for each result in |results| to |map|. |is_keyword| indicates
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // whether the results correspond to the keyword provider or default provider.
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddHistoryResultsToMap(const HistoryResults& results,
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              bool is_keyword,
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              int did_not_accept_suggestion,
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              MatchMap* map);
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Adds a match for each result in |suggest_results| to |map|. |is_keyword|
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // indicates whether the results correspond to the keyword provider or default
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // provider.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void AddSuggestResultsToMap(const SuggestResults& suggest_results,
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              bool is_keyword,
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              int did_not_accept_suggestion,
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              MatchMap* map);
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Determines the relevance for a particular match.  We use different scoring
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // algorithms for the different types of matches.
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int CalculateRelevanceForWhatYouTyped() const;
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |time| is the time at which this query was last seen. |is_keyword| is true
236ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // if the search is from the keyword provider. |looks_like_url| is true if the
237ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // search term would be treated as a URL if typed into the omnibox.
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int CalculateRelevanceForHistory(const base::Time& time,
239ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                   bool looks_like_url,
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                   bool is_keyword) const;
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |result_number| is the index of the suggestion in the result set from the
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // server; the best suggestion is suggestion number 0.  |is_keyword| is true
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // if the search is from the keyword provider.
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int CalculateRelevanceForSuggestion(size_t num_results,
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      size_t result_number,
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      bool is_keyword) const;
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |result_number| is same as above. |is_keyword| is true if the navigation
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // result was suggested by the keyword provider.
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int CalculateRelevanceForNavigation(size_t num_results,
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      size_t result_number,
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      bool is_keyword) const;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Creates an AutocompleteMatch for "Search <engine> for |query_string|" with
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the supplied relevance.  Adds this match to |map|; if such a match already
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // exists, whichever one has lower relevance is eliminated.
25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void AddMatchToMap(const string16& query_string,
25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                     const string16& input_text,
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     int relevance,
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     AutocompleteMatch::Type type,
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     int accepted_suggestion,
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     bool is_keyword,
262201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch                     bool prevent_inline_autocomplete,
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                     MatchMap* map);
264201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns an AutocompleteMatch for a navigational suggestion.
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteMatch NavigationToMatch(const NavigationResult& query_string,
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      int relevance,
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                      bool is_keyword);
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
270201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Updates the value of |done_| from the internal state.
271201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  void UpdateDone();
272201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
2733f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  // Updates the description/description_class of the first search match.
2743f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  void UpdateFirstSearchMatchDescription();
2753f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Should we query for suggest results immediately? This is normally false,
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // but may be set to true during testing.
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool query_suggest_immediately_;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Maintains the TemplateURLs used.
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Providers providers_;
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The user's input.
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  AutocompleteInput input_;
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Input text when searching against the keyword provider.
28772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 keyword_input_text_;
288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Searches in the user's history that begin with the input text.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryResults keyword_history_results_;
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  HistoryResults default_history_results_;
292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
293c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Number of suggest results that haven't yet arrived. If greater than 0 it
294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // indicates either |timer_| or one of the URLFetchers is still running.
295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int suggest_results_pending_;
296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A timer to start a query to the suggest server after the user has stopped
298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // typing for long enough.
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::OneShotTimer<SearchProvider> timer_;
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The fetcher that retrieves suggest results for the keyword from the server.
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<URLFetcher> keyword_fetcher_;
303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The fetcher that retrieves suggest results for the default engine from the
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // server.
306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<URLFetcher> default_fetcher_;
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Suggestions returned by the Suggest server for the input text.
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SuggestResults keyword_suggest_results_;
310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  SuggestResults default_suggest_results_;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Navigational suggestions returned by the server.
313c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationResults keyword_navigation_results_;
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NavigationResults default_navigation_results_;
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
316c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether suggest_results_ is valid.
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool have_suggest_results_;
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
319201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  // Has FinalizeInstantQuery been invoked since the last |Start|?
320201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch  bool instant_finalized_;
321201ade2fbba22bfb27ae029f4d23fca6ded109a0Ben Murdoch
32272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // The |suggest_text| parameter passed to FinalizeInstantQuery.
32372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 default_provider_suggest_text_;
32472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  DISALLOW_COPY_AND_ASSIGN(SearchProvider);
326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_
329