Index: chrome/browser/autocomplete/search_provider.h |
diff --git a/chrome/browser/autocomplete/search_provider.h b/chrome/browser/autocomplete/search_provider.h |
index ec6565f13ed7b491f35e5fbd5a007b5583c9247f..0e808526429ecba42bd8bb91a6c617d4dfd1d1a1 100644 |
--- a/chrome/browser/autocomplete/search_provider.h |
+++ b/chrome/browser/autocomplete/search_provider.h |
@@ -11,26 +11,21 @@ |
#ifndef CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_ |
#define CHROME_BROWSER_AUTOCOMPLETE_SEARCH_PROVIDER_H_ |
-#include <map> |
#include <string> |
#include <vector> |
-#include "base/basictypes.h" |
#include "base/compiler_specific.h" |
#include "base/memory/scoped_ptr.h" |
-#include "base/memory/scoped_vector.h" |
#include "base/time/time.h" |
#include "base/timer/timer.h" |
#include "chrome/browser/autocomplete/autocomplete_input.h" |
#include "chrome/browser/autocomplete/autocomplete_match.h" |
-#include "chrome/browser/autocomplete/autocomplete_provider.h" |
+#include "chrome/browser/autocomplete/base_search_provider.h" |
#include "chrome/browser/history/history_types.h" |
#include "chrome/browser/search_engines/template_url.h" |
-#include "net/url_request/url_fetcher_delegate.h" |
class Profile; |
class SearchProviderTest; |
-class SuggestionDeletionHandler; |
class TemplateURLService; |
namespace base { |
@@ -51,8 +46,7 @@ class URLFetcher; |
// text. It also starts a task to query the Suggest servers. When that data |
// comes back, the provider creates and returns matches for the best |
// suggestions. |
-class SearchProvider : public AutocompleteProvider, |
- public net::URLFetcherDelegate { |
+class SearchProvider : public BaseSearchProvider { |
public: |
// ID used in creating URLFetcher for default provider's suggest results. |
static const int kDefaultProviderURLFetcherID; |
@@ -60,28 +54,15 @@ class SearchProvider : public AutocompleteProvider, |
// ID used in creating URLFetcher for keyword provider's suggest results. |
static const int kKeywordProviderURLFetcherID; |
- // ID used in creating URLFetcher for deleting suggestion results. |
- static const int kDeletionURLFetcherID; |
- |
SearchProvider(AutocompleteProviderListener* listener, Profile* profile); |
- // Returns whether the SearchProvider previously flagged |match| as a query |
- // that should be prefetched. |
- static bool ShouldPrefetch(const AutocompleteMatch& match); |
- |
// Extracts the suggest response metadata which SearchProvider previously |
// stored for |match|. |
static std::string GetSuggestMetadata(const AutocompleteMatch& match); |
// AutocompleteProvider: |
- virtual void AddProviderInfo(ProvidersInfo* provider_info) const OVERRIDE; |
- virtual void DeleteMatch(const AutocompleteMatch& match) OVERRIDE; |
virtual void ResetSession() OVERRIDE; |
- bool field_trial_triggered_in_session() const { |
- return field_trial_triggered_in_session_; |
- } |
- |
// This URL may be sent with suggest requests; see comments on CanSendURL(). |
void set_current_page_url(const GURL& current_page_url) { |
current_page_url_ = current_page_url; |
@@ -91,10 +72,7 @@ class SearchProvider : public AutocompleteProvider, |
virtual ~SearchProvider(); |
private: |
- // TODO(hfung): Remove ZeroSuggestProvider as a friend class after |
- // refactoring common code to a new base class. |
friend class SearchProviderTest; |
- friend class ZeroSuggestProvider; |
FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, CanSendURL); |
FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInline); |
FRIEND_TEST_ALL_PREFIXES(SearchProviderTest, NavigationInlineDomainClassify); |
@@ -153,239 +131,9 @@ class SearchProvider : public AutocompleteProvider, |
DISALLOW_COPY_AND_ASSIGN(Providers); |
}; |
- // The Result classes are intermediate representations of AutocompleteMatches, |
- // simply containing relevance-ranked search and navigation suggestions. |
- // They may be cached to provide some synchronous matches while requests for |
- // new suggestions from updated input are in flight. |
- // TODO(msw) Extend these classes to generate their corresponding matches and |
- // other requisite data, in order to consolidate and simplify the |
- // highly fragmented SearchProvider logic for each Result type. |
- class Result { |
- public: |
- Result(bool from_keyword_provider, |
- int relevance, |
- bool relevance_from_server); |
- virtual ~Result(); |
- |
- bool from_keyword_provider() const { return from_keyword_provider_; } |
- |
- const base::string16& match_contents() const { return match_contents_; } |
- const ACMatchClassifications& match_contents_class() const { |
- return match_contents_class_; |
- } |
- |
- int relevance() const { return relevance_; } |
- void set_relevance(int relevance) { relevance_ = relevance; } |
- |
- bool relevance_from_server() const { return relevance_from_server_; } |
- void set_relevance_from_server(bool relevance_from_server) { |
- relevance_from_server_ = relevance_from_server; |
- } |
- |
- // Returns if this result is inlineable against the current input |input|. |
- // Non-inlineable results are stale. |
- virtual bool IsInlineable(const base::string16& input) const = 0; |
- |
- // Returns the default relevance value for this result (which may |
- // be left over from a previous omnibox input) given the current |
- // input and whether the current input caused a keyword provider |
- // to be active. |
- virtual int CalculateRelevance(const AutocompleteInput& input, |
- bool keyword_provider_requested) const = 0; |
- |
- protected: |
- // The contents to be displayed and its style info. |
- base::string16 match_contents_; |
- ACMatchClassifications match_contents_class_; |
- |
- // True if the result came from the keyword provider. |
- bool from_keyword_provider_; |
- |
- // The relevance score. |
- int relevance_; |
- |
- private: |
- // Whether this result's relevance score was fully or partly calculated |
- // based on server information, and thus is assumed to be more accurate. |
- // This is ultimately used in |
- // SearchProvider::ConvertResultsToAutocompleteMatches(), see comments |
- // there. |
- bool relevance_from_server_; |
- }; |
- |
- class SuggestResult : public Result { |
- public: |
- SuggestResult(const base::string16& suggestion, |
- AutocompleteMatchType::Type type, |
- const base::string16& match_contents, |
- const base::string16& annotation, |
- const std::string& suggest_query_params, |
- const std::string& deletion_url, |
- bool from_keyword_provider, |
- int relevance, |
- bool relevance_from_server, |
- bool should_prefetch, |
- const base::string16& input_text); |
- virtual ~SuggestResult(); |
- |
- const base::string16& suggestion() const { return suggestion_; } |
- AutocompleteMatchType::Type type() const { return type_; } |
- const base::string16& annotation() const { return annotation_; } |
- const std::string& suggest_query_params() const { |
- return suggest_query_params_; |
- } |
- const std::string& deletion_url() const { return deletion_url_; } |
- bool should_prefetch() const { return should_prefetch_; } |
- |
- // Fills in |match_contents_class_| to reflect how |match_contents_| should |
- // be displayed and bolded against the current |input_text|. If |
- // |allow_bolding_all| is false and |match_contents_class_| would have all |
- // of |match_contents_| bolded, do nothing. |
- void ClassifyMatchContents(const bool allow_bolding_all, |
- const base::string16& input_text); |
- |
- // Result: |
- virtual bool IsInlineable(const base::string16& input) const OVERRIDE; |
- virtual int CalculateRelevance( |
- const AutocompleteInput& input, |
- bool keyword_provider_requested) const OVERRIDE; |
- |
- private: |
- // The search terms to be used for this suggestion. |
- base::string16 suggestion_; |
- |
- AutocompleteMatchType::Type type_; |
- |
- // Optional annotation for the |match_contents_| for disambiguation. |
- // This may be displayed in the autocomplete match contents, but is defined |
- // separately to facilitate different formatting. |
- base::string16 annotation_; |
- |
- // Optional additional parameters to be added to the search URL. |
- std::string suggest_query_params_; |
- |
- // Optional deletion URL provided with suggestions. Fetching this URL |
- // should result in some reasonable deletion behaviour on the server, |
- // e.g. deleting this term out of a user's server-side search history. |
- std::string deletion_url_; |
- |
- // Should this result be prefetched? |
- bool should_prefetch_; |
- }; |
- |
- class NavigationResult : public Result { |
- public: |
- // |provider| is necessary to use StringForURLDisplay() in order to |
- // compute |formatted_url_|. |
- NavigationResult(const AutocompleteProvider& provider, |
- const GURL& url, |
- const base::string16& description, |
- bool from_keyword_provider, |
- int relevance, |
- bool relevance_from_server, |
- const base::string16& input_text, |
- const std::string& languages); |
- virtual ~NavigationResult(); |
- |
- const GURL& url() const { return url_; } |
- const base::string16& description() const { return description_; } |
- const base::string16& formatted_url() const { return formatted_url_; } |
- |
- // Fills in |match_contents_| and |match_contents_class_| to reflect how |
- // the URL should be displayed and bolded against the current |input_text| |
- // and user |languages|. If |allow_bolding_nothing| is false and |
- // |match_contents_class_| would result in an entirely unbolded |
- // |match_contents_|, do nothing. |
- void CalculateAndClassifyMatchContents(const bool allow_bolding_nothing, |
- const base::string16& input_text, |
- const std::string& languages); |
- |
- // Result: |
- virtual bool IsInlineable(const base::string16& input) const OVERRIDE; |
- virtual int CalculateRelevance( |
- const AutocompleteInput& input, |
- bool keyword_provider_requested) const OVERRIDE; |
- |
- private: |
- // The suggested url for navigation. |
- GURL url_; |
- |
- // The properly formatted ("fixed up") URL string with equivalent meaning |
- // to the one in |url_|. |
- base::string16 formatted_url_; |
- |
- // The suggested navigational result description; generally the site name. |
- base::string16 description_; |
- }; |
- |
class CompareScoredResults; |
- typedef std::vector<SuggestResult> SuggestResults; |
- typedef std::vector<NavigationResult> NavigationResults; |
typedef std::vector<history::KeywordSearchTermVisit> HistoryResults; |
- typedef std::pair<base::string16, std::string> MatchKey; |
- typedef std::map<MatchKey, AutocompleteMatch> MatchMap; |
- typedef ScopedVector<SuggestionDeletionHandler> SuggestionDeletionHandlers; |
- |
- // A simple structure bundling most of the information (including |
- // both SuggestResults and NavigationResults) returned by a call to |
- // the suggest server. |
- // |
- // This has to be declared after the typedefs since it relies on some of them. |
- struct Results { |
- Results(); |
- ~Results(); |
- |
- // Clears |suggest_results| and |navigation_results| and resets |
- // |verbatim_relevance| to -1 (implies unset). |
- void Clear(); |
- |
- // Returns whether any of the results (including verbatim) have |
- // server-provided scores. |
- bool HasServerProvidedScores() const; |
- |
- // Query suggestions sorted by relevance score. |
- SuggestResults suggest_results; |
- |
- // Navigational suggestions sorted by relevance score. |
- NavigationResults navigation_results; |
- |
- // The server supplied verbatim relevance scores. Negative values |
- // indicate that there is no suggested score; a value of 0 |
- // suppresses the verbatim result. |
- int verbatim_relevance; |
- |
- // The JSON metadata associated with this server response. |
- std::string metadata; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(Results); |
- }; |
- |
- // Returns an AutocompleteMatch with the given |autocomplete_provider| |
- // for the search |suggestion|, which represents a search via |template_url|. |
- // If |template_url| is NULL, returns a match with an invalid destination URL. |
- // |
- // |input_text| is the original user input. This is used to highlight |
- // portions of the match contents to distinguish locally-typed text from |
- // suggested text. |
- // |
- // |input| is necessary for various other details, like whether we should |
- // allow inline autocompletion and what the transition type should be. |
- // |accepted_suggestion| and |omnibox_start_margin| are used along with |
- // |input_text| to generate Assisted Query Stats. |
- // |append_extra_query_params| should be set if |template_url| is the default |
- // search engine, so the destination URL will contain any |
- // command-line-specified query params. |
- static AutocompleteMatch CreateSearchSuggestion( |
- AutocompleteProvider* autocomplete_provider, |
- const AutocompleteInput& input, |
- const base::string16& input_text, |
- const SuggestResult& suggestion, |
- const TemplateURL* template_url, |
- int accepted_suggestion, |
- int omnibox_start_margin, |
- bool append_extra_query_params); |
// Removes non-inlineable results until either the top result can inline |
// autocomplete the current input or verbatim outscores the top result. |
@@ -407,23 +155,39 @@ class SearchProvider : public AutocompleteProvider, |
// AutocompleteProvider: |
virtual void Start(const AutocompleteInput& input, |
bool minimal_changes) OVERRIDE; |
- virtual void Stop(bool clear_cached_results) OVERRIDE; |
- // net::URLFetcherDelegate: |
- virtual void OnURLFetchComplete(const net::URLFetcher* source) OVERRIDE; |
+ virtual bool IsKeywordRequest(const net::URLFetcher* source) OVERRIDE; |
+ |
+ virtual bool IsRequestSuccessful(const net::URLFetcher* source) OVERRIDE; |
+ |
+ virtual void LogFetchComplete(const net::URLFetcher* source) OVERRIDE; |
+ |
+ virtual bool IsValidQuery(const base::string16 query, |
+ const net::URLFetcher* source) OVERRIDE; |
+ |
+ virtual void RecordDeletionResult(bool success) OVERRIDE; |
+ |
+ virtual void StopSuggest() OVERRIDE; |
+ |
+ virtual void ClearAllResults() OVERRIDE; |
+ |
+ virtual int GetDefaultRelevance() OVERRIDE; |
+ |
+ virtual const base::string16 GetInputText(const net::URLFetcher* source) |
+ OVERRIDE; |
- // This gets called when we have requested a suggestion deletion from the |
- // server to handle the results of the deletion. |
- void OnDeletionComplete(bool success, |
- SuggestionDeletionHandler* handler); |
+ virtual bool ShouldAllowNavSuggest(const net::URLFetcher* source) OVERRIDE; |
- // Records in UMA whether the deletion request resulted in success. |
- // This is virtual so test code can override it to check that we |
- // correctly handle the request result. |
- virtual void RecordDeletionResult(bool success); |
+ virtual Results* GetResultsObjectToFill(const net::URLFetcher* source) |
+ OVERRIDE; |
- // Removes the deleted match from the list of |matches_|. |
- void DeleteMatchFromMatches(const AutocompleteMatch& match); |
+ virtual void SortResults(const net::URLFetcher* source, |
+ const base::ListValue* relevances, |
+ Results* results) OVERRIDE; |
+ |
+ virtual void UpdateMatches() OVERRIDE; |
+ |
+ virtual bool ShouldSendProviderUpdate(bool results_updated) OVERRIDE; |
// Called when timer_ expires. |
void Run(); |
@@ -442,15 +206,8 @@ class SearchProvider : public AutocompleteProvider, |
// potentially private data, etc. |
bool IsQuerySuitableForSuggest() const; |
- // Stops the suggest query. |
- // NOTE: This does not update |done_|. Callers must do so. |
- void StopSuggest(); |
- |
- // Clears the current results. |
- void ClearAllResults(); |
- |
- // Removes stale results for both default and keyword providers. See comments |
- // on RemoveStaleResults(). |
+ // Removes stale results for both default and keyword providers. |
+ // See comments on RemoveStaleResults(). |
void RemoveAllStaleResults(); |
// Apply calculated relevance scores to the current results. |
@@ -464,16 +221,6 @@ class SearchProvider : public AutocompleteProvider, |
const TemplateURL* template_url, |
const AutocompleteInput& input); |
- // Parses JSON response received from the provider, stripping XSSI |
- // protection if needed. Returns the parsed data if successful, NULL |
- // otherwise. |
- static scoped_ptr<base::Value> DeserializeJsonData(std::string json_data); |
- |
- // Parses results from the suggest server and updates the appropriate suggest |
- // and navigation result lists, depending on whether |is_keyword| is true. |
- // Returns whether the appropriate result list members were updated. |
- bool ParseSuggestResults(base::Value* root_val, bool is_keyword); |
- |
// Converts the parsed results to a set of AutocompleteMatches, |matches_|. |
void ConvertResultsToAutocompleteMatches(); |
@@ -497,10 +244,6 @@ class SearchProvider : public AutocompleteProvider, |
bool HasValidDefaultMatch( |
bool autocomplete_result_will_reorder_for_default_match) const; |
- // Updates |matches_| from the latest results; applies calculated relevances |
- // if suggested relevances cause undesriable behavior. Updates |done_|. |
- void UpdateMatches(); |
- |
// Converts an appropriate number of navigation results in |
// |navigation_results| to matches and adds them to |matches|. |
void AddNavigationResultsToMatches( |
@@ -508,7 +251,8 @@ class SearchProvider : public AutocompleteProvider, |
ACMatches* matches); |
// Adds a match for each result in |results| to |map|. |is_keyword| indicates |
- // whether the results correspond to the keyword provider or default provider. |
+ // whether the results correspond to the keyword provider or default |
+ // provider. |
void AddHistoryResultsToMap(const HistoryResults& results, |
bool is_keyword, |
int did_not_accept_suggestion, |
@@ -526,6 +270,12 @@ class SearchProvider : public AutocompleteProvider, |
const std::string& metadata, |
MatchMap* map); |
+ // Returns the right template URL for the given |result|. |
+ const TemplateURL* GetTemplateURL(const SuggestResult& result); |
+ |
+ // Returns whether we should append extra query params to the match. |
+ bool ShouldAppendExtraQueryParams(const SuggestResult& result); |
+ |
// Gets the relevance score for the verbatim result. This value may be |
// provided by the suggest server or calculated locally; if |
// |relevance_from_server| is non-NULL, it will be set to indicate which of |
@@ -552,25 +302,16 @@ class SearchProvider : public AutocompleteProvider, |
int GetKeywordVerbatimRelevance(bool* relevance_from_server) const; |
// |time| is the time at which this query was last seen. |is_keyword| |
- // indicates whether the results correspond to the keyword provider or default |
- // provider. |use_aggressive_method| says whether this function can use a |
- // method that gives high scores (1200+) rather than one that gives lower |
- // scores. When using the aggressive method, scores may exceed 1300 |
+ // indicates whether the results correspond to the keyword provider or |
+ // default provider. |use_aggressive_method| says whether this function can |
+ // use a method that gives high scores (1200+) rather than one that gives |
+ // lower scores. When using the aggressive method, scores may exceed 1300 |
// unless |prevent_search_history_inlining| is set. |
int CalculateRelevanceForHistory(const base::Time& time, |
bool is_keyword, |
bool use_aggressive_method, |
bool prevent_search_history_inlining) const; |
- // Creates an AutocompleteMatch for "Search <engine> for |query_string|" with |
- // the supplied details. Adds this match to |map|; if such a match already |
- // exists, whichever one has lower relevance is eliminated. |
- void AddMatchToMap(const SuggestResult& result, |
- const base::string16& input_text, |
- const std::string& metadata, |
- int accepted_suggestion, |
- MatchMap* map); |
- |
// Returns an AutocompleteMatch for a navigational suggestion. |
AutocompleteMatch NavigationToMatch(const NavigationResult& navigation); |
@@ -587,59 +328,10 @@ class SearchProvider : public AutocompleteProvider, |
// Updates the value of |done_| from the internal state. |
void UpdateDone(); |
- // Returns whether we can send the URL of the current page in any suggest |
- // requests. Doing this requires that all the following hold: |
- // * The user has suggest enabled in their settings and is not in incognito |
- // mode. (Incognito disables suggest entirely.) |
- // * The current URL is HTTP, or HTTPS with the same domain as the suggest |
- // server. Non-HTTP[S] URLs (e.g. FTP/file URLs) may contain sensitive |
- // information. HTTPS URLs may also contain sensitive information, but if |
- // they're on the same domain as the suggest server, then the relevant |
- // entity could have already seen/logged this data. |
- // * The suggest request is sent over HTTPS. This avoids leaking the current |
- // page URL in world-readable network traffic. |
- // * The user's suggest provider is Google. We might want to allow other |
- // providers to see this data someday, but for now this has only been |
- // implemented for Google. Also see next bullet. |
- // * The user is OK in principle with sending URLs of current pages to their |
- // provider. Today, there is no explicit setting that controls this, but if |
- // the user has tab sync enabled and tab sync is unencrypted, then they're |
- // already sending this data to Google for sync purposes. Thus we use this |
- // setting as a proxy for "it's OK to send such data". In the future, |
- // especially if we want to support suggest providers other than Google, we |
- // may change this to be a standalone setting or part of some explicit |
- // general opt-in. |
- static bool CanSendURL( |
- const GURL& current_page_url, |
- const GURL& suggest_url, |
- const TemplateURL* template_url, |
- AutocompleteInput::PageClassification page_classification, |
- Profile* profile); |
- |
// The amount of time to wait before sending a new suggest request after the |
// previous one. Non-const because some unittests modify this value. |
static int kMinimumTimeBetweenSuggestQueriesMs; |
- // The following keys are used to record additional information on matches. |
- |
- // We annotate our AutocompleteMatches with whether their relevance scores |
- // were server-provided using this key in the |additional_info| field. |
- static const char kRelevanceFromServerKey[]; |
- |
- // Indicates whether the server said a match should be prefetched. |
- static const char kShouldPrefetchKey[]; |
- |
- // Used to store metadata from the server response, which is needed for |
- // prefetching. |
- static const char kSuggestMetadataKey[]; |
- |
- // Used to store a deletion request url for server-provided suggestions. |
- static const char kDeletionUrlKey[]; |
- |
- // These are the values for the above keys. |
- static const char kTrue[]; |
- static const char kFalse[]; |
- |
// Maintains the TemplateURLs used. |
Providers providers_; |
@@ -653,10 +345,6 @@ class SearchProvider : public AutocompleteProvider, |
HistoryResults keyword_history_results_; |
HistoryResults default_history_results_; |
- // Number of suggest results that haven't yet arrived. If greater than 0 it |
- // indicates one of the URLFetchers is still running. |
- int suggest_results_pending_; |
- |
// A timer to start a query to the suggest server after the user has stopped |
// typing for long enough. |
base::OneShotTimer<SearchProvider> timer_; |
@@ -672,23 +360,6 @@ class SearchProvider : public AutocompleteProvider, |
Results default_results_; |
Results keyword_results_; |
- // Each deletion handler in this vector corresponds to an outstanding request |
- // that a server delete a personalized suggestion. Making this a ScopedVector |
- // causes us to auto-cancel all such requests on shutdown. |
- SuggestionDeletionHandlers deletion_handlers_; |
- |
- // Whether a field trial, if any, has triggered in the most recent |
- // autocomplete query. This field is set to false in Start() and may be set |
- // to true if either the default provider or keyword provider has completed |
- // and their corresponding suggest response contained |
- // '"google:fieldtrialtriggered":true'. |
- // If the autocomplete query has not returned, this field is set to false. |
- bool field_trial_triggered_; |
- |
- // Same as above except that it is maintained across the current Omnibox |
- // session. |
- bool field_trial_triggered_in_session_; |
- |
// If true, search history query suggestions will score low enough that |
// they will not be inlined. |
bool prevent_search_history_inlining_; |