Upstream version 5.34.92.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / autocomplete / zero_suggest_provider.h
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.
4 //
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.
10 //
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.
13
14 #ifndef CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_
15 #define CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_
16
17 #include <map>
18 #include <string>
19 #include <vector>
20
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"
28
29 class AutocompleteInput;
30 class GURL;
31 class TemplateURLService;
32
33 namespace base {
34 class ListValue;
35 class Value;
36 }
37
38 namespace net {
39 class URLFetcher;
40 }
41
42 // Autocomplete provider for searches based on the current URL.
43 //
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
47 // set of matches.
48 //
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 {
54  public:
55   // Creates and returns an instance of this provider.
56   static ZeroSuggestProvider* Create(AutocompleteProviderListener* listener,
57                                      Profile* profile);
58
59   // AutocompleteProvider:
60   virtual void Start(const AutocompleteInput& input,
61                      bool /*minimal_changes*/) OVERRIDE;
62   virtual void Stop(bool clear_cached_results) OVERRIDE;
63
64   // Adds provider-specific information to omnibox event logs.
65   virtual void AddProviderInfo(ProvidersInfo* provider_info) const OVERRIDE;
66
67   // Sets |field_trial_triggered_| to false.
68   virtual void ResetSession() OVERRIDE;
69
70   // net::URLFetcherDelegate
71   virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE;
72
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);
80
81   bool field_trial_triggered_in_session() const {
82     return field_trial_triggered_in_session_;
83   }
84
85  private:
86   ZeroSuggestProvider(AutocompleteProviderListener* listener,
87                       Profile* profile);
88
89   virtual ~ZeroSuggestProvider();
90
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.
95
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);
104
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);
110
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.
114   //
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);
123
124   // Returns an AutocompleteMatch for a navigational suggestion |navigation|.
125   AutocompleteMatch NavigationToMatch(
126       const SearchProvider::NavigationResult& navigation);
127
128   // Fetches zero-suggest suggestions by sending a request using |suggest_url|.
129   void Run(const GURL& suggest_url);
130
131   // Parses results from the zero-suggest server and updates results.
132   void ParseSuggestResults(const base::Value& root_val);
133
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
136   // received.
137   void ConvertResultsToAutocompleteMatches();
138
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
141   // page.
142   AutocompleteMatch MatchForCurrentURL();
143
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);
148
149   // Used to build default search engine URLs for suggested queries.
150   TemplateURLService* template_url_service_;
151
152   // The URL for which a suggestion fetch is pending.
153   std::string current_query_;
154
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_;
158
159   // Copy of OmniboxEditModel::permanent_text_.
160   base::string16 permanent_text_;
161
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_;
166
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_;
175
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_;
186
187   history::MostVisitedURLList most_visited_urls_;
188
189   // For callbacks that may be run after destruction.
190   base::WeakPtrFactory<ZeroSuggestProvider> weak_ptr_factory_;
191
192   DISALLOW_COPY_AND_ASSIGN(ZeroSuggestProvider);
193 };
194
195 #endif  // CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_PROVIDER_H_