| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 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 class contains common functionality for search-based autocomplete | |
| 6 // providers. Search provider and zero suggest provider both use it for common | |
| 7 // functionality. | |
| 8 | |
| 9 #ifndef CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ | |
| 10 #define CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ | |
| 11 | |
| 12 #include <map> | |
| 13 #include <string> | |
| 14 #include <utility> | |
| 15 #include <vector> | |
| 16 | |
| 17 #include "base/memory/scoped_vector.h" | |
| 18 #include "base/strings/string16.h" | |
| 19 #include "components/metrics/proto/omnibox_event.pb.h" | |
| 20 #include "components/omnibox/autocomplete_input.h" | |
| 21 #include "components/omnibox/autocomplete_match.h" | |
| 22 #include "components/omnibox/autocomplete_provider.h" | |
| 23 #include "components/omnibox/search_suggestion_parser.h" | |
| 24 | |
| 25 class AutocompleteProviderDelegate; | |
| 26 class GURL; | |
| 27 class SearchTermsData; | |
| 28 class SuggestionDeletionHandler; | |
| 29 class TemplateURL; | |
| 30 class TemplateURLService; | |
| 31 | |
| 32 namespace base { | |
| 33 class DictionaryValue; | |
| 34 class ListValue; | |
| 35 class Value; | |
| 36 } | |
| 37 | |
| 38 // Base functionality for receiving suggestions from a search engine. | |
| 39 // This class is abstract and should only be used as a base for other | |
| 40 // autocomplete providers utilizing its functionality. | |
| 41 class BaseSearchProvider : public AutocompleteProvider { | |
| 42 public: | |
| 43 // ID used in creating URLFetcher for default provider's suggest results. | |
| 44 static const int kDefaultProviderURLFetcherID; | |
| 45 | |
| 46 // ID used in creating URLFetcher for keyword provider's suggest results. | |
| 47 static const int kKeywordProviderURLFetcherID; | |
| 48 | |
| 49 // ID used in creating URLFetcher for deleting suggestion results. | |
| 50 static const int kDeletionURLFetcherID; | |
| 51 | |
| 52 BaseSearchProvider(TemplateURLService* template_url_service, | |
| 53 scoped_ptr<AutocompleteProviderDelegate> delegate, | |
| 54 AutocompleteProvider::Type type); | |
| 55 | |
| 56 // Returns whether |match| is flagged as a query that should be prefetched. | |
| 57 static bool ShouldPrefetch(const AutocompleteMatch& match); | |
| 58 | |
| 59 // Returns a simpler AutocompleteMatch suitable for persistence like in | |
| 60 // ShortcutsDatabase. This wrapper function uses a number of default values | |
| 61 // that may or may not be appropriate for your needs. | |
| 62 // NOTE: Use with care. Most likely you want the other CreateSearchSuggestion | |
| 63 // with protected access. | |
| 64 static AutocompleteMatch CreateSearchSuggestion( | |
| 65 const base::string16& suggestion, | |
| 66 AutocompleteMatchType::Type type, | |
| 67 bool from_keyword_provider, | |
| 68 const TemplateURL* template_url, | |
| 69 const SearchTermsData& search_terms_data); | |
| 70 | |
| 71 // AutocompleteProvider: | |
| 72 virtual void DeleteMatch(const AutocompleteMatch& match) OVERRIDE; | |
| 73 virtual void AddProviderInfo(ProvidersInfo* provider_info) const OVERRIDE; | |
| 74 | |
| 75 bool field_trial_triggered_in_session() const { | |
| 76 return field_trial_triggered_in_session_; | |
| 77 } | |
| 78 | |
| 79 protected: | |
| 80 // The following keys are used to record additional information on matches. | |
| 81 | |
| 82 // We annotate our AutocompleteMatches with whether their relevance scores | |
| 83 // were server-provided using this key in the |additional_info| field. | |
| 84 static const char kRelevanceFromServerKey[]; | |
| 85 | |
| 86 // Indicates whether the server said a match should be prefetched. | |
| 87 static const char kShouldPrefetchKey[]; | |
| 88 | |
| 89 // Used to store metadata from the server response, which is needed for | |
| 90 // prefetching. | |
| 91 static const char kSuggestMetadataKey[]; | |
| 92 | |
| 93 // Used to store a deletion request url for server-provided suggestions. | |
| 94 static const char kDeletionUrlKey[]; | |
| 95 | |
| 96 // These are the values for the above keys. | |
| 97 static const char kTrue[]; | |
| 98 static const char kFalse[]; | |
| 99 | |
| 100 virtual ~BaseSearchProvider(); | |
| 101 | |
| 102 typedef std::pair<base::string16, std::string> MatchKey; | |
| 103 typedef std::map<MatchKey, AutocompleteMatch> MatchMap; | |
| 104 typedef ScopedVector<SuggestionDeletionHandler> SuggestionDeletionHandlers; | |
| 105 | |
| 106 // Returns an AutocompleteMatch with the given |autocomplete_provider| | |
| 107 // for the search |suggestion|, which represents a search via |template_url|. | |
| 108 // If |template_url| is NULL, returns a match with an invalid destination URL. | |
| 109 // | |
| 110 // |input| is the original user input. Text in the input is used to highlight | |
| 111 // portions of the match contents to distinguish locally-typed text from | |
| 112 // suggested text. | |
| 113 // | |
| 114 // |input| is also necessary for various other details, like whether we should | |
| 115 // allow inline autocompletion and what the transition type should be. | |
| 116 // |in_keyword_mode| helps guarantee a non-keyword suggestion does not | |
| 117 // appear as the default match when the user is in keyword mode. | |
| 118 // |accepted_suggestion| is used to generate Assisted Query Stats. | |
| 119 // |append_extra_query_params| should be set if |template_url| is the default | |
| 120 // search engine, so the destination URL will contain any | |
| 121 // command-line-specified query params. | |
| 122 static AutocompleteMatch CreateSearchSuggestion( | |
| 123 AutocompleteProvider* autocomplete_provider, | |
| 124 const AutocompleteInput& input, | |
| 125 const bool in_keyword_mode, | |
| 126 const SearchSuggestionParser::SuggestResult& suggestion, | |
| 127 const TemplateURL* template_url, | |
| 128 const SearchTermsData& search_terms_data, | |
| 129 int accepted_suggestion, | |
| 130 bool append_extra_query_params); | |
| 131 | |
| 132 // Returns whether the requirements for requesting zero suggest results | |
| 133 // are met. The requirements are | |
| 134 // * The user is enrolled in a zero suggest experiment. | |
| 135 // * The user is not on the NTP. | |
| 136 // * The suggest request is sent over HTTPS. This avoids leaking the current | |
| 137 // page URL or personal data in unencrypted network traffic. | |
| 138 // * The user has suggest enabled in their settings and is not in incognito | |
| 139 // mode. (Incognito disables suggest entirely.) | |
| 140 // * The user's suggest provider is Google. We might want to allow other | |
| 141 // providers to see this data someday, but for now this has only been | |
| 142 // implemented for Google. | |
| 143 static bool ZeroSuggestEnabled( | |
| 144 const GURL& suggest_url, | |
| 145 const TemplateURL* template_url, | |
| 146 metrics::OmniboxEventProto::PageClassification page_classification, | |
| 147 const SearchTermsData& search_terms_data, | |
| 148 AutocompleteProviderDelegate* delegate); | |
| 149 | |
| 150 // Returns whether we can send the URL of the current page in any suggest | |
| 151 // requests. Doing this requires that all the following hold: | |
| 152 // * ZeroSuggestEnabled() is true, so we meet the requirements above. | |
| 153 // * The current URL is HTTP, or HTTPS with the same domain as the suggest | |
| 154 // server. Non-HTTP[S] URLs (e.g. FTP/file URLs) may contain sensitive | |
| 155 // information. HTTPS URLs may also contain sensitive information, but if | |
| 156 // they're on the same domain as the suggest server, then the relevant | |
| 157 // entity could have already seen/logged this data. | |
| 158 // * The user is OK in principle with sending URLs of current pages to their | |
| 159 // provider. Today, there is no explicit setting that controls this, but if | |
| 160 // the user has tab sync enabled and tab sync is unencrypted, then they're | |
| 161 // already sending this data to Google for sync purposes. Thus we use this | |
| 162 // setting as a proxy for "it's OK to send such data". In the future, | |
| 163 // especially if we want to support suggest providers other than Google, we | |
| 164 // may change this to be a standalone setting or part of some explicit | |
| 165 // general opt-in. | |
| 166 static bool CanSendURL( | |
| 167 const GURL& current_page_url, | |
| 168 const GURL& suggest_url, | |
| 169 const TemplateURL* template_url, | |
| 170 metrics::OmniboxEventProto::PageClassification page_classification, | |
| 171 const SearchTermsData& search_terms_data, | |
| 172 AutocompleteProviderDelegate* delegate); | |
| 173 | |
| 174 // If the |deletion_url| is valid, then set |match.deletable| to true and | |
| 175 // save the |deletion_url| into the |match|'s additional info under | |
| 176 // the key |kDeletionUrlKey|. | |
| 177 void SetDeletionURL(const std::string& deletion_url, | |
| 178 AutocompleteMatch* match); | |
| 179 | |
| 180 // Creates an AutocompleteMatch from |result| to search for the query in | |
| 181 // |result|. Adds the created match to |map|; if such a match | |
| 182 // already exists, whichever one has lower relevance is eliminated. | |
| 183 // |metadata| and |accepted_suggestion| are used for generating an | |
| 184 // AutocompleteMatch. | |
| 185 // |mark_as_deletable| indicates whether the match should be marked deletable. | |
| 186 // |in_keyword_mode| helps guarantee a non-keyword suggestion does not | |
| 187 // appear as the default match when the user is in keyword mode. | |
| 188 // NOTE: Any result containing a deletion URL is always marked deletable. | |
| 189 void AddMatchToMap(const SearchSuggestionParser::SuggestResult& result, | |
| 190 const std::string& metadata, | |
| 191 int accepted_suggestion, | |
| 192 bool mark_as_deletable, | |
| 193 bool in_keyword_mode, | |
| 194 MatchMap* map); | |
| 195 | |
| 196 // Parses results from the suggest server and updates the appropriate suggest | |
| 197 // and navigation result lists in |results|. |default_result_relevance| is | |
| 198 // the relevance to use if it was not explicitly set by the server. | |
| 199 // |is_keyword_result| indicates whether the response was received from the | |
| 200 // keyword provider. | |
| 201 // Returns whether the appropriate result list members were updated. | |
| 202 bool ParseSuggestResults(const base::Value& root_val, | |
| 203 int default_result_relevance, | |
| 204 bool is_keyword_result, | |
| 205 SearchSuggestionParser::Results* results); | |
| 206 | |
| 207 // Returns the TemplateURL corresponding to the keyword or default | |
| 208 // provider based on the value of |is_keyword|. | |
| 209 virtual const TemplateURL* GetTemplateURL(bool is_keyword) const = 0; | |
| 210 | |
| 211 // Returns the AutocompleteInput for keyword provider or default provider | |
| 212 // based on the value of |is_keyword|. | |
| 213 virtual const AutocompleteInput GetInput(bool is_keyword) const = 0; | |
| 214 | |
| 215 // Returns whether the destination URL corresponding to the given |result| | |
| 216 // should contain command-line-specified query params. | |
| 217 virtual bool ShouldAppendExtraParams( | |
| 218 const SearchSuggestionParser::SuggestResult& result) const = 0; | |
| 219 | |
| 220 // Records in UMA whether the deletion request resulted in success. | |
| 221 virtual void RecordDeletionResult(bool success) = 0; | |
| 222 | |
| 223 TemplateURLService* template_url_service_; | |
| 224 scoped_ptr<AutocompleteProviderDelegate> delegate_; | |
| 225 | |
| 226 // Whether a field trial, if any, has triggered in the most recent | |
| 227 // autocomplete query. This field is set to true only if the suggestion | |
| 228 // provider has completed and the response contained | |
| 229 // '"google:fieldtrialtriggered":true'. | |
| 230 bool field_trial_triggered_; | |
| 231 | |
| 232 // Same as above except that it is maintained across the current Omnibox | |
| 233 // session. | |
| 234 bool field_trial_triggered_in_session_; | |
| 235 | |
| 236 private: | |
| 237 friend class SearchProviderTest; | |
| 238 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, TestDeleteMatch); | |
| 239 | |
| 240 // Removes the deleted |match| from the list of |matches_|. | |
| 241 void DeleteMatchFromMatches(const AutocompleteMatch& match); | |
| 242 | |
| 243 // This gets called when we have requested a suggestion deletion from the | |
| 244 // server to handle the results of the deletion. It will be called after the | |
| 245 // deletion request completes. | |
| 246 void OnDeletionComplete(bool success, | |
| 247 SuggestionDeletionHandler* handler); | |
| 248 | |
| 249 // Each deletion handler in this vector corresponds to an outstanding request | |
| 250 // that a server delete a personalized suggestion. Making this a ScopedVector | |
| 251 // causes us to auto-cancel all such requests on shutdown. | |
| 252 SuggestionDeletionHandlers deletion_handlers_; | |
| 253 | |
| 254 DISALLOW_COPY_AND_ASSIGN(BaseSearchProvider); | |
| 255 }; | |
| 256 | |
| 257 #endif // CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ | |
| OLD | NEW |