1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 // This file contains the zero-suggest autocomplete provider. This experimental
6 // provider is invoked when the user focuses in the omnibox prior to editing,
7 // and generates search query suggestions based on the current URL. To enable
8 // this provider, point --experimental-zero-suggest-url-prefix at an
9 // appropriate suggestion service.
11 // HUGE DISCLAIMER: This is just here for experimenting and will probably be
12 // deleted entirely as we revise how suggestions work with the omnibox.
14 #ifndef CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_
15 #define CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_
21 #include "base/basictypes.h"
22 #include "base/compiler_specific.h"
23 #include "base/memory/scoped_ptr.h"
24 #include "base/strings/string16.h"
25 #include "chrome/browser/autocomplete/autocomplete_provider.h"
26 #include "chrome/browser/autocomplete/search_provider.h"
27 #include "net/url_request/url_fetcher_delegate.h"
29 class AutocompleteInput
;
31 class TemplateURLService
;
42 // Autocomplete provider for searches based on the current URL.
44 // The controller will call StartZeroSuggest when the user focuses in the
45 // omnibox. After construction, the autocomplete controller repeatedly calls
46 // Start() with some user input, each time expecting to receive an updated
49 // TODO(jered): Consider deleting this class and building this functionality
50 // into SearchProvider after dogfood and after we break the association between
51 // omnibox text and suggestions.
52 class ZeroSuggestProvider
: public AutocompleteProvider
,
53 public net::URLFetcherDelegate
{
55 // Creates and returns an instance of this provider.
56 static ZeroSuggestProvider
* Create(AutocompleteProviderListener
* listener
,
59 // AutocompleteProvider:
60 virtual void Start(const AutocompleteInput
& input
,
61 bool /*minimal_changes*/) OVERRIDE
;
62 virtual void Stop(bool clear_cached_results
) OVERRIDE
;
64 // Adds provider-specific information to omnibox event logs.
65 virtual void AddProviderInfo(ProvidersInfo
* provider_info
) const OVERRIDE
;
67 // Sets |field_trial_triggered_| to false.
68 virtual void ResetSession() OVERRIDE
;
70 // net::URLFetcherDelegate
71 virtual void OnURLFetchComplete(const net::URLFetcher
* source
) OVERRIDE
;
73 // Initiates a new fetch for the given |url| of classification
74 // |page_classification|. |permanent_text| is the omnibox text
75 // for the current page.
76 void StartZeroSuggest(
77 const GURL
& curent_page_url
,
78 AutocompleteInput::PageClassification page_classification
,
79 const base::string16
& permanent_text
);
81 bool field_trial_triggered_in_session() const {
82 return field_trial_triggered_in_session_
;
86 ZeroSuggestProvider(AutocompleteProviderListener
* listener
,
89 virtual ~ZeroSuggestProvider();
91 // The 4 functions below (that take classes defined in SearchProvider as
92 // arguments) were copied and trimmed from SearchProvider.
93 // TODO(hfung): Refactor them into a new base class common to both
94 // ZeroSuggestProvider and SearchProvider.
96 // From the OpenSearch formatted response |root_val|, populate query
97 // suggestions into |suggest_results|, navigation suggestions into
98 // |navigation_results|, and the verbatim relevance score into
99 // |verbatim_relevance|.
100 void FillResults(const base::Value
& root_val
,
101 int* verbatim_relevance
,
102 SearchProvider::SuggestResults
* suggest_results
,
103 SearchProvider::NavigationResults
* navigation_results
);
105 // Creates AutocompleteMatches to search |template_url| for "<suggestion>" for
106 // all suggestions in |results|, and adds them to |map|.
107 void AddSuggestResultsToMap(const SearchProvider::SuggestResults
& results
,
108 const TemplateURL
* template_url
,
109 SearchProvider::MatchMap
* map
);
111 // Creates an AutocompleteMatch with the provided |relevance| and |type| to
112 // search |template_url| for |query_string|. |accepted_suggestion| will be
113 // used to generate Assisted Query Stats.
115 // Adds this match to |map|; if such a match already exists, whichever one
116 // has lower relevance is eliminated.
117 void AddMatchToMap(int relevance
,
118 AutocompleteMatch::Type type
,
119 const TemplateURL
* template_url
,
120 const base::string16
& query_string
,
121 int accepted_suggestion
,
122 SearchProvider::MatchMap
* map
);
124 // Returns an AutocompleteMatch for a navigational suggestion |navigation|.
125 AutocompleteMatch
NavigationToMatch(
126 const SearchProvider::NavigationResult
& navigation
);
128 // Fetches zero-suggest suggestions by sending a request using |suggest_url|.
129 void Run(const GURL
& suggest_url
);
131 // Parses results from the zero-suggest server and updates results.
132 void ParseSuggestResults(const base::Value
& root_val
);
134 // Converts the parsed results to a set of AutocompleteMatches and adds them
135 // to |matches_|. Also update the histograms for how many results were
137 void ConvertResultsToAutocompleteMatches();
139 // Returns an AutocompleteMatch for the current URL. The match should be in
140 // the top position so that pressing enter has the effect of reloading the
142 AutocompleteMatch
MatchForCurrentURL();
144 // When the user is in the Most Visited field trial, we ask the TopSites
145 // service for the most visited URLs during Run(). It calls back to this
146 // function to return those |urls|.
147 void OnMostVisitedUrlsAvailable(const history::MostVisitedURLList
& urls
);
149 // Used to build default search engine URLs for suggested queries.
150 TemplateURLService
* template_url_service_
;
152 // The URL for which a suggestion fetch is pending.
153 std::string current_query_
;
155 // The type of page the user is viewing (a search results page doing search
156 // term replacement, an arbitrary URL, etc.).
157 AutocompleteInput::PageClassification current_page_classification_
;
159 // Copy of OmniboxEditModel::permanent_text_.
160 base::string16 permanent_text_
;
162 // Fetcher used to retrieve results.
163 scoped_ptr
<net::URLFetcher
> fetcher_
;
164 // Whether there's a pending request in flight.
165 bool have_pending_request_
;
167 // Suggestion for the current URL.
168 AutocompleteMatch current_url_match_
;
169 // Navigation suggestions for the most recent ZeroSuggest input URL.
170 SearchProvider::NavigationResults navigation_results_
;
171 // Query suggestions for the most recent ZeroSuggest input URL.
172 SearchProvider::MatchMap query_matches_map_
;
173 // The relevance score for the URL of the current page.
174 int verbatim_relevance_
;
176 // Whether a field trial, if any, has triggered in the most recent
177 // autocomplete query. This field is set to true if the last request
178 // was a zero suggest request, the provider has completed and their
179 // corresponding response contained '"google:fieldtrialtriggered":true'.
180 bool field_trial_triggered_
;
181 // Whether a zero suggest request triggered a field trial in the omnibox
182 // session. The user could have clicked on a suggestion when zero suggest
183 // triggered (same condition as field_trial_triggered_), or triggered zero
184 // suggest but kept typing.
185 bool field_trial_triggered_in_session_
;
187 history::MostVisitedURLList most_visited_urls_
;
189 // For callbacks that may be run after destruction.
190 base::WeakPtrFactory
<ZeroSuggestProvider
> weak_ptr_factory_
;
192 DISALLOW_COPY_AND_ASSIGN(ZeroSuggestProvider
);
195 #endif // CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_