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