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 Search autocomplete provider. This provider is 6 // responsible for all autocomplete entries that start with "Search <engine> 7 // for ...", including searching for the current input string, search 8 // history, and search suggestions. An instance of it gets created and 9 // managed by the autocomplete controller. 10 11 #ifndef CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_ 12 #define CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_ 13 14 #include <map> 15 #include <string> 16 #include <vector> 17 18 #include "base/basictypes.h" 19 #include "base/compiler_specific.h" 20 #include "base/memory/scoped_ptr.h" 21 #include "base/memory/scoped_vector.h" 22 #include "base/time/time.h" 23 #include "base/timer/timer.h" 24 #include "chrome/browser/autocomplete/autocomplete_input.h" 25 #include "chrome/browser/autocomplete/autocomplete_match.h" 26 #include "chrome/browser/autocomplete/autocomplete_provider.h" 27 #include "chrome/browser/history/history_types.h" 28 #include "chrome/browser/search_engines/template_url.h" 29 #include "net/url_request/url_fetcher_delegate.h" 30 31 class Profile; 32 class SearchProviderTest; 33 class SuggestionDeletionHandler; 34 class TemplateURLService; 35 36 namespace base { 37 class Value; 38 } 39 40 namespace net { 41 class URLFetcher; 42 } 43 44 // Autocomplete provider for searches and suggestions from a search engine. 45 // 46 // After construction, the autocomplete controller repeatedly calls Start() 47 // with some user input, each time expecting to receive a small set of the best 48 // matches (either synchronously or asynchronously). 49 // 50 // Initially the provider creates a match that searches for the current input 51 // text. It also starts a task to query the Suggest servers. When that data 52 // comes back, the provider creates and returns matches for the best 53 // suggestions. 54 class SearchProvider : public AutocompleteProvider, 55 public net::URLFetcherDelegate { 56 public: 57 // ID used in creating URLFetcher for default provider's suggest results. 58 static const int kDefaultProviderURLFetcherID; 59 60 // ID used in creating URLFetcher for keyword provider's suggest results. 61 static const int kKeywordProviderURLFetcherID; 62 63 // ID used in creating URLFetcher for deleting suggestion results. 64 static const int kDeletionURLFetcherID; 65 66 SearchProvider(AutocompleteProviderListener* listener, Profile* profile); 67 68 // Returns an AutocompleteMatch with the given |autocomplete_provider|, 69 // |relevance|, and |type|, which represents a search via |template_url| for 70 // |query_string|. If |template_url| is NULL, returns a match with an invalid 71 // destination URL. 72 // 73 // |input_text| is the original user input, which may differ from 74 // |query_string|; e.g. the user typed "foo" and got a search suggestion of 75 // "food", which we're now marking up. This is used to highlight portions of 76 // the match contents to distinguish locally-typed text from suggested text. 77 // 78 // |input| and |is_keyword| are necessary for various other details, like 79 // whether we should allow inline autocompletion and what the transition type 80 // should be. |accepted_suggestion| and |omnibox_start_margin| are used along 81 // with |input_text| to generate Assisted Query Stats. 82 // |append_extra_query_params| should be set if |template_url| is the default 83 // search engine, so the destination URL will contain any 84 // command-line-specified query params. 85 static AutocompleteMatch CreateSearchSuggestion( 86 AutocompleteProvider* autocomplete_provider, 87 const AutocompleteInput& input, 88 const base::string16& input_text, 89 int relevance, 90 AutocompleteMatch::Type type, 91 bool is_keyword, 92 const base::string16& match_contents, 93 const base::string16& annotation, 94 const TemplateURL* template_url, 95 const base::string16& query_string, 96 const std::string& suggest_query_params, 97 int accepted_suggestion, 98 int omnibox_start_margin, 99 bool append_extra_query_params); 100 101 // Returns whether the SearchProvider previously flagged |match| as a query 102 // that should be prefetched. 103 static bool ShouldPrefetch(const AutocompleteMatch& match); 104 105 // Extracts the suggest response metadata which SearchProvider previously 106 // stored for |match|. 107 static std::string GetSuggestMetadata(const AutocompleteMatch& match); 108 109 // AutocompleteProvider: 110 virtual void AddProviderInfo(ProvidersInfo* provider_info) const OVERRIDE; 111 virtual void DeleteMatch(const AutocompleteMatch& match) OVERRIDE; 112 virtual void ResetSession() OVERRIDE; 113 114 bool field_trial_triggered_in_session() const { 115 return field_trial_triggered_in_session_; 116 } 117 118 // This URL may be sent with suggest requests; see comments on CanSendURL(). 119 void set_current_page_url(const GURL& current_page_url) { 120 current_page_url_ = current_page_url; 121 } 122 123 protected: 124 virtual ~SearchProvider(); 125 126 private: 127 // TODO(hfung): Remove ZeroSuggestProvider as a friend class after 128 // refactoring common code to a new base class. 129 friend class SearchProviderTest; 130 friend class ZeroSuggestProvider; 131 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, CanSendURL); 132 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInline); 133 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInlineDomainClassify); 134 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInlineSchemeSubstring); 135 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, RemoveStaleResultsTest); 136 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, SuggestRelevanceExperiment); 137 FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, TestDeleteMatch); 138 FRIEND_TEST_ALL_PREFIXES(AutocompleteProviderTest, GetDestinationURL); 139 FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, ClearPrefetchedResults); 140 FRIEND_TEST_ALL_PREFIXES(InstantExtendedPrefetchTest, SetPrefetchQuery); 141 142 // Manages the providers (TemplateURLs) used by SearchProvider. Two providers 143 // may be used: 144 // . The default provider. This corresponds to the user's default search 145 // engine. This is always used, except for the rare case of no default 146 // engine. 147 // . The keyword provider. This is used if the user has typed in a keyword. 148 class Providers { 149 public: 150 explicit Providers(TemplateURLService* template_url_service); 151 152 // Returns true if the specified providers match the two providers cached 153 // by this class. 154 bool equal(const base::string16& default_provider, 155 const base::string16& keyword_provider) const { 156 return (default_provider == default_provider_) && 157 (keyword_provider == keyword_provider_); 158 } 159 160 // Resets the cached providers. 161 void set(const base::string16& default_provider, 162 const base::string16& keyword_provider) { 163 default_provider_ = default_provider; 164 keyword_provider_ = keyword_provider; 165 } 166 167 TemplateURLService* template_url_service() { return template_url_service_; } 168 const base::string16& default_provider() const { return default_provider_; } 169 const base::string16& keyword_provider() const { return keyword_provider_; } 170 171 // NOTE: These may return NULL even if the provider members are nonempty! 172 const TemplateURL* GetDefaultProviderURL() const; 173 const TemplateURL* GetKeywordProviderURL() const; 174 175 // Returns true if there is a valid keyword provider. 176 bool has_keyword_provider() const { return !keyword_provider_.empty(); } 177 178 private: 179 TemplateURLService* template_url_service_; 180 181 // Cached across the life of a query so we behave consistently even if the 182 // user changes their default while the query is running. 183 base::string16 default_provider_; 184 base::string16 keyword_provider_; 185 186 DISALLOW_COPY_AND_ASSIGN(Providers); 187 }; 188 189 // The Result classes are intermediate representations of AutocompleteMatches, 190 // simply containing relevance-ranked search and navigation suggestions. 191 // They may be cached to provide some synchronous matches while requests for 192 // new suggestions from updated input are in flight. 193 // TODO(msw) Extend these classes to generate their corresponding matches and 194 // other requisite data, in order to consolidate and simplify the 195 // highly fragmented SearchProvider logic for each Result type. 196 class Result { 197 public: 198 Result(bool from_keyword_provider, 199 int relevance, 200 bool relevance_from_server); 201 virtual ~Result(); 202 203 bool from_keyword_provider() const { return from_keyword_provider_; } 204 205 int relevance() const { return relevance_; } 206 void set_relevance(int relevance) { relevance_ = relevance; } 207 208 bool relevance_from_server() const { return relevance_from_server_; } 209 void set_relevance_from_server(bool relevance_from_server) { 210 relevance_from_server_ = relevance_from_server; 211 } 212 213 // Returns if this result is inlineable against the current input |input|. 214 // Non-inlineable results are stale. 215 virtual bool IsInlineable(const base::string16& input) const = 0; 216 217 // Returns the default relevance value for this result (which may 218 // be left over from a previous omnibox input) given the current 219 // input and whether the current input caused a keyword provider 220 // to be active. 221 virtual int CalculateRelevance(const AutocompleteInput& input, 222 bool keyword_provider_requested) const = 0; 223 224 protected: 225 // True if the result came from the keyword provider. 226 bool from_keyword_provider_; 227 228 // The relevance score. 229 int relevance_; 230 231 private: 232 // Whether this result's relevance score was fully or partly calculated 233 // based on server information, and thus is assumed to be more accurate. 234 // This is ultimately used in 235 // SearchProvider::ConvertResultsToAutocompleteMatches(), see comments 236 // there. 237 bool relevance_from_server_; 238 }; 239 240 class SuggestResult : public Result { 241 public: 242 SuggestResult(const base::string16& suggestion, 243 AutocompleteMatchType::Type type, 244 const base::string16& match_contents, 245 const base::string16& annotation, 246 const std::string& suggest_query_params, 247 const std::string& deletion_url, 248 bool from_keyword_provider, 249 int relevance, 250 bool relevance_from_server, 251 bool should_prefetch); 252 virtual ~SuggestResult(); 253 254 const base::string16& suggestion() const { return suggestion_; } 255 AutocompleteMatchType::Type type() const { return type_; } 256 const base::string16& match_contents() const { return match_contents_; } 257 const base::string16& annotation() const { return annotation_; } 258 const std::string& suggest_query_params() const { 259 return suggest_query_params_; 260 } 261 const std::string& deletion_url() const { return deletion_url_; } 262 bool should_prefetch() const { return should_prefetch_; } 263 264 // Result: 265 virtual bool IsInlineable(const base::string16& input) const OVERRIDE; 266 virtual int CalculateRelevance( 267 const AutocompleteInput& input, 268 bool keyword_provider_requested) const OVERRIDE; 269 270 private: 271 // The search terms to be used for this suggestion. 272 base::string16 suggestion_; 273 274 AutocompleteMatchType::Type type_; 275 276 // The contents to be displayed in the autocomplete match. 277 base::string16 match_contents_; 278 279 // Optional annotation for the |match_contents_| for disambiguation. 280 // This may be displayed in the autocomplete match contents, but is defined 281 // separately to facilitate different formatting. 282 base::string16 annotation_; 283 284 // Optional additional parameters to be added to the search URL. 285 std::string suggest_query_params_; 286 287 // Optional deletion URL provided with suggestions. Fetching this URL 288 // should result in some reasonable deletion behaviour on the server, 289 // e.g. deleting this term out of a user's server-side search history. 290 std::string deletion_url_; 291 292 // Should this result be prefetched? 293 bool should_prefetch_; 294 }; 295 296 class NavigationResult : public Result { 297 public: 298 // |provider| is necessary to use StringForURLDisplay() in order to 299 // compute |formatted_url_|. 300 NavigationResult(const AutocompleteProvider& provider, 301 const GURL& url, 302 const base::string16& description, 303 bool from_keyword_provider, 304 int relevance, 305 bool relevance_from_server); 306 virtual ~NavigationResult(); 307 308 const GURL& url() const { return url_; } 309 const base::string16& description() const { return description_; } 310 const base::string16& formatted_url() const { return formatted_url_; } 311 312 // Result: 313 virtual bool IsInlineable(const base::string16& input) const OVERRIDE; 314 virtual int CalculateRelevance( 315 const AutocompleteInput& input, 316 bool keyword_provider_requested) const OVERRIDE; 317 318 private: 319 // The suggested url for navigation. 320 GURL url_; 321 322 // The properly formatted ("fixed up") URL string with equivalent meaning 323 // to the one in |url_|. 324 base::string16 formatted_url_; 325 326 // The suggested navigational result description; generally the site name. 327 base::string16 description_; 328 }; 329 330 class CompareScoredResults; 331 332 typedef std::vector<SuggestResult> SuggestResults; 333 typedef std::vector<NavigationResult> NavigationResults; 334 typedef std::vector<history::KeywordSearchTermVisit> HistoryResults; 335 typedef std::pair<base::string16, std::string> MatchKey; 336 typedef std::map<MatchKey, AutocompleteMatch> MatchMap; 337 typedef ScopedVector<SuggestionDeletionHandler> SuggestionDeletionHandlers; 338 339 // A simple structure bundling most of the information (including 340 // both SuggestResults and NavigationResults) returned by a call to 341 // the suggest server. 342 // 343 // This has to be declared after the typedefs since it relies on some of them. 344 struct Results { 345 Results(); 346 ~Results(); 347 348 // Clears |suggest_results| and |navigation_results| and resets 349 // |verbatim_relevance| to -1 (implies unset). 350 void Clear(); 351 352 // Returns whether any of the results (including verbatim) have 353 // server-provided scores. 354 bool HasServerProvidedScores() const; 355 356 // Query suggestions sorted by relevance score. 357 SuggestResults suggest_results; 358 359 // Navigational suggestions sorted by relevance score. 360 NavigationResults navigation_results; 361 362 // The server supplied verbatim relevance scores. Negative values 363 // indicate that there is no suggested score; a value of 0 364 // suppresses the verbatim result. 365 int verbatim_relevance; 366 367 // The JSON metadata associated with this server response. 368 std::string metadata; 369 370 private: 371 DISALLOW_COPY_AND_ASSIGN(Results); 372 }; 373 374 // Removes non-inlineable results until either the top result can inline 375 // autocomplete the current input or verbatim outscores the top result. 376 static void RemoveStaleResults(const base::string16& input, 377 int verbatim_relevance, 378 SuggestResults* suggest_results, 379 NavigationResults* navigation_results); 380 381 // Calculates the relevance score for the keyword verbatim result (if the 382 // input matches one of the profile's keyword). 383 static int CalculateRelevanceForKeywordVerbatim(AutocompleteInput::Type type, 384 bool prefer_keyword); 385 386 // AutocompleteProvider: 387 virtual void Start(const AutocompleteInput& input, 388 bool minimal_changes) OVERRIDE; 389 virtual void Stop(bool clear_cached_results) OVERRIDE; 390 391 // net::URLFetcherDelegate: 392 virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; 393 394 // This gets called when we have requested a suggestion deletion from the 395 // server to handle the results of the deletion. 396 void OnDeletionComplete(bool success, 397 SuggestionDeletionHandler* handler); 398 399 // Records in UMA whether the deletion request resulted in success. 400 // This is virtual so test code can override it to check that we 401 // correctly handle the request result. 402 virtual void RecordDeletionResult(bool success); 403 404 // Removes the deleted match from the list of |matches_|. 405 void DeleteMatchFromMatches(const AutocompleteMatch& match); 406 407 // Called when timer_ expires. 408 void Run(); 409 410 // Runs the history query, if necessary. The history query is synchronous. 411 // This does not update |done_|. 412 void DoHistoryQuery(bool minimal_changes); 413 414 // Determines whether an asynchronous subcomponent query should run for the 415 // current input. If so, starts it if necessary; otherwise stops it. 416 // NOTE: This function does not update |done_|. Callers must do so. 417 void StartOrStopSuggestQuery(bool minimal_changes); 418 419 // Returns true when the current query can be sent to the Suggest service. 420 // This will be false e.g. when Suggest is disabled, the query contains 421 // potentially private data, etc. 422 bool IsQuerySuitableForSuggest() const; 423 424 // Stops the suggest query. 425 // NOTE: This does not update |done_|. Callers must do so. 426 void StopSuggest(); 427 428 // Clears the current results. 429 void ClearAllResults(); 430 431 // Removes stale results for both default and keyword providers. See comments 432 // on RemoveStaleResults(). 433 void RemoveAllStaleResults(); 434 435 // Apply calculated relevance scores to the current results. 436 void ApplyCalculatedRelevance(); 437 void ApplyCalculatedSuggestRelevance(SuggestResults* list); 438 void ApplyCalculatedNavigationRelevance(NavigationResults* list); 439 440 // Starts a new URLFetcher requesting suggest results from |template_url|; 441 // callers own the returned URLFetcher, which is NULL for invalid providers. 442 net::URLFetcher* CreateSuggestFetcher(int id, 443 const TemplateURL* template_url, 444 const AutocompleteInput& input); 445 446 // Parses JSON response received from the provider, stripping XSSI 447 // protection if needed. Returns the parsed data if successful, NULL 448 // otherwise. 449 static scoped_ptr<base::Value> DeserializeJsonData(std::string json_data); 450 451 // Parses results from the suggest server and updates the appropriate suggest 452 // and navigation result lists, depending on whether |is_keyword| is true. 453 // Returns whether the appropriate result list members were updated. 454 bool ParseSuggestResults(base::Value* root_val, bool is_keyword); 455 456 // Converts the parsed results to a set of AutocompleteMatches, |matches_|. 457 void ConvertResultsToAutocompleteMatches(); 458 459 // Returns an iterator to the first match in |matches_| which might 460 // be chosen as default. If 461 // |autocomplete_result_will_reorder_for_default_match| is false, 462 // this simply means the first match; otherwise, it means the first 463 // match for which the |allowed_to_be_default_match| member is true. 464 ACMatches::const_iterator FindTopMatch( 465 bool autocomplete_result_will_reorder_for_default_match) const; 466 467 // Checks if suggested relevances violate certain expected constraints. 468 // See UpdateMatches() for the use and explanation of these constraints. 469 bool IsTopMatchNavigationInKeywordMode( 470 bool autocomplete_result_will_reorder_for_default_match) const; 471 bool HasKeywordDefaultMatchInKeywordMode() const; 472 bool IsTopMatchScoreTooLow( 473 bool autocomplete_result_will_reorder_for_default_match) const; 474 bool IsTopMatchSearchWithURLInput( 475 bool autocomplete_result_will_reorder_for_default_match) const; 476 bool HasValidDefaultMatch( 477 bool autocomplete_result_will_reorder_for_default_match) const; 478 479 // Updates |matches_| from the latest results; applies calculated relevances 480 // if suggested relevances cause undesriable behavior. Updates |done_|. 481 void UpdateMatches(); 482 483 // Converts an appropriate number of navigation results in 484 // |navigation_results| to matches and adds them to |matches|. 485 void AddNavigationResultsToMatches( 486 const NavigationResults& navigation_results, 487 ACMatches* matches); 488 489 // Adds a match for each result in |results| to |map|. |is_keyword| indicates 490 // whether the results correspond to the keyword provider or default provider. 491 void AddHistoryResultsToMap(const HistoryResults& results, 492 bool is_keyword, 493 int did_not_accept_suggestion, 494 MatchMap* map); 495 496 // Calculates relevance scores for all |results|. 497 SuggestResults ScoreHistoryResults(const HistoryResults& results, 498 bool base_prevent_inline_autocomplete, 499 bool input_multiple_words, 500 const base::string16& input_text, 501 bool is_keyword); 502 503 // Adds matches for |results| to |map|. 504 void AddSuggestResultsToMap(const SuggestResults& results, 505 const std::string& metadata, 506 MatchMap* map); 507 508 // Gets the relevance score for the verbatim result. This value may be 509 // provided by the suggest server or calculated locally; if 510 // |relevance_from_server| is non-NULL, it will be set to indicate which of 511 // those is true. 512 int GetVerbatimRelevance(bool* relevance_from_server) const; 513 514 // Calculates the relevance score for the verbatim result from the 515 // default search engine. This version takes into account context: 516 // i.e., whether the user has entered a keyword-based search or not. 517 int CalculateRelevanceForVerbatim() const; 518 519 // Calculates the relevance score for the verbatim result from the default 520 // search engine *ignoring* whether the input is a keyword-based search 521 // or not. This function should only be used to determine the minimum 522 // relevance score that the best result from this provider should have. 523 // For normal use, prefer the above function. 524 int CalculateRelevanceForVerbatimIgnoringKeywordModeState() const; 525 526 // Gets the relevance score for the keyword verbatim result. 527 // |relevance_from_server| is handled as in GetVerbatimRelevance(). 528 // TODO(mpearson): Refactor so this duplication isn't necessary or 529 // restructure so one static function takes all the parameters it needs 530 // (rather than looking at internal state). 531 int GetKeywordVerbatimRelevance(bool* relevance_from_server) const; 532 533 // |time| is the time at which this query was last seen. |is_keyword| 534 // indicates whether the results correspond to the keyword provider or default 535 // provider. |use_aggressive_method| says whether this function can use a 536 // method that gives high scores (1200+) rather than one that gives lower 537 // scores. When using the aggressive method, scores may exceed 1300 538 // unless |prevent_search_history_inlining| is set. 539 int CalculateRelevanceForHistory(const base::Time& time, 540 bool is_keyword, 541 bool use_aggressive_method, 542 bool prevent_search_history_inlining) const; 543 544 // Creates an AutocompleteMatch for "Search <engine> for |query_string|" with 545 // the supplied details. Adds this match to |map|; if such a match already 546 // exists, whichever one has lower relevance is eliminated. 547 void AddMatchToMap(const SuggestResult& result, 548 const base::string16& input_text, 549 const std::string& metadata, 550 int accepted_suggestion, 551 MatchMap* map); 552 553 // Returns an AutocompleteMatch for a navigational suggestion. 554 AutocompleteMatch NavigationToMatch(const NavigationResult& navigation); 555 556 // Resets the scores of all |keyword_navigation_results_| matches to 557 // be below that of the top keyword query match (the verbatim match 558 // as expressed by |keyword_verbatim_relevance_| or keyword query 559 // suggestions stored in |keyword_suggest_results_|). If there 560 // are no keyword suggestions and keyword verbatim is suppressed, 561 // then drops the suggested relevance scores for the navsuggestions 562 // and drops the request to suppress verbatim, thereby introducing the 563 // keyword verbatim match which will naturally outscore the navsuggestions. 564 void DemoteKeywordNavigationMatchesPastTopQuery(); 565 566 // Updates the value of |done_| from the internal state. 567 void UpdateDone(); 568 569 // Returns whether we can send the URL of the current page in any suggest 570 // requests. Doing this requires that all the following hold: 571 // * The user has suggest enabled in their settings and is not in incognito 572 // mode. (Incognito disables suggest entirely.) 573 // * The current URL is HTTP, or HTTPS with the same domain as the suggest 574 // server. Non-HTTP[S] URLs (e.g. FTP/file URLs) may contain sensitive 575 // information. HTTPS URLs may also contain sensitive information, but if 576 // they're on the same domain as the suggest server, then the relevant 577 // entity could have already seen/logged this data. 578 // * The suggest request is sent over HTTPS. This avoids leaking the current 579 // page URL in world-readable network traffic. 580 // * The user's suggest provider is Google. We might want to allow other 581 // providers to see this data someday, but for now this has only been 582 // implemented for Google. Also see next bullet. 583 // * The user is OK in principle with sending URLs of current pages to their 584 // provider. Today, there is no explicit setting that controls this, but if 585 // the user has tab sync enabled and tab sync is unencrypted, then they're 586 // already sending this data to Google for sync purposes. Thus we use this 587 // setting as a proxy for "it's OK to send such data". In the future, 588 // especially if we want to support suggest providers other than Google, we 589 // may change this to be a standalone setting or part of some explicit 590 // general opt-in. 591 static bool CanSendURL( 592 const GURL& current_page_url, 593 const GURL& suggest_url, 594 const TemplateURL* template_url, 595 AutocompleteInput::PageClassification page_classification, 596 Profile* profile); 597 598 // The amount of time to wait before sending a new suggest request after the 599 // previous one. Non-const because some unittests modify this value. 600 static int kMinimumTimeBetweenSuggestQueriesMs; 601 602 // The following keys are used to record additional information on matches. 603 604 // We annotate our AutocompleteMatches with whether their relevance scores 605 // were server-provided using this key in the |additional_info| field. 606 static const char kRelevanceFromServerKey[]; 607 608 // Indicates whether the server said a match should be prefetched. 609 static const char kShouldPrefetchKey[]; 610 611 // Used to store metadata from the server response, which is needed for 612 // prefetching. 613 static const char kSuggestMetadataKey[]; 614 615 // Used to store a deletion request url for server-provided suggestions. 616 static const char kDeletionUrlKey[]; 617 618 // These are the values for the above keys. 619 static const char kTrue[]; 620 static const char kFalse[]; 621 622 // Maintains the TemplateURLs used. 623 Providers providers_; 624 625 // The user's input. 626 AutocompleteInput input_; 627 628 // Input when searching against the keyword provider. 629 AutocompleteInput keyword_input_; 630 631 // Searches in the user's history that begin with the input text. 632 HistoryResults keyword_history_results_; 633 HistoryResults default_history_results_; 634 635 // Number of suggest results that haven't yet arrived. If greater than 0 it 636 // indicates one of the URLFetchers is still running. 637 int suggest_results_pending_; 638 639 // A timer to start a query to the suggest server after the user has stopped 640 // typing for long enough. 641 base::OneShotTimer<SearchProvider> timer_; 642 643 // The time at which we sent a query to the suggest server. 644 base::TimeTicks time_suggest_request_sent_; 645 646 // Fetchers used to retrieve results for the keyword and default providers. 647 scoped_ptr<net::URLFetcher> keyword_fetcher_; 648 scoped_ptr<net::URLFetcher> default_fetcher_; 649 650 // Results from the default and keyword search providers. 651 Results default_results_; 652 Results keyword_results_; 653 654 // Each deletion handler in this vector corresponds to an outstanding request 655 // that a server delete a personalized suggestion. Making this a ScopedVector 656 // causes us to auto-cancel all such requests on shutdown. 657 SuggestionDeletionHandlers deletion_handlers_; 658 659 // Whether a field trial, if any, has triggered in the most recent 660 // autocomplete query. This field is set to false in Start() and may be set 661 // to true if either the default provider or keyword provider has completed 662 // and their corresponding suggest response contained 663 // '"google:fieldtrialtriggered":true'. 664 // If the autocomplete query has not returned, this field is set to false. 665 bool field_trial_triggered_; 666 667 // Same as above except that it is maintained across the current Omnibox 668 // session. 669 bool field_trial_triggered_in_session_; 670 671 // If true, search history query suggestions will score low enough that 672 // they will not be inlined. 673 bool prevent_search_history_inlining_; 674 675 GURL current_page_url_; 676 677 DISALLOW_COPY_AND_ASSIGN(SearchProvider); 678 }; 679 680 #endif // CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_ 681