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