Chromium Code Reviews| Index: chrome/browser/autocomplete/base_search_provider.h |
| diff --git a/chrome/browser/autocomplete/base_search_provider.h b/chrome/browser/autocomplete/base_search_provider.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e4ad7a84a9f57cf4619c851d8f9baffd15179f6b |
| --- /dev/null |
| +++ b/chrome/browser/autocomplete/base_search_provider.h |
| @@ -0,0 +1,247 @@ |
| +// Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| +// |
| +// This class contains common functionality for search-based autocomplete |
| +// providers. Search provider and zero suggest provider both use it for common |
| +// functionality. |
| + |
| +#ifndef CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ |
| +#define CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ |
| + |
| +#include <map> |
| +#include <string> |
| +#include <utility> |
| +#include <vector> |
| + |
| +#include "base/strings/string16.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/autocomplete_provider_listener.h" |
|
msw
2014/02/03 22:53:14
nit: use a forward declaration instead.
Maria
2014/02/04 03:16:39
Done.
|
| +#include "chrome/browser/profiles/profile.h" |
|
msw
2014/02/03 22:53:14
nit: use a forward declaration instead.
Maria
2014/02/04 03:16:39
Done.
|
| +#include "net/url_request/url_fetcher_delegate.h" |
| +#include "url/gurl.h" |
| + |
| +// Base functionality for receiving suggestions from a search engine. |
| +// This class is abstract and should only be used as a base for other |
| +// autocomplete providers utilizing the functionality. |
|
msw
2014/02/03 22:53:14
nit: s/the/its/
Maria
2014/02/04 03:16:39
Done.
|
| +class BaseSearchProvider : public AutocompleteProvider, |
| + public net::URLFetcherDelegate { |
| + public: |
| + BaseSearchProvider(AutocompleteProviderListener* listener, |
| + Profile* profile, |
| + AutocompleteProvider::Type type); |
| + |
| + protected: |
| + // 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; |
|
msw
2014/02/03 22:53:14
nit: avoid wrapping like this; keep it as it was:
Maria
2014/02/04 03:16:39
Done.
|
| + |
| + 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_; |
| + }; |
| + |
| + typedef std::vector<SuggestResult> SuggestResults; |
| + typedef std::vector<NavigationResult> NavigationResults; |
| + typedef std::pair<base::string16, std::string> MatchKey; |
| + typedef std::map<MatchKey, AutocompleteMatch> MatchMap; |
| + |
| + // 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); |
| + }; |
| + |
| + virtual ~BaseSearchProvider(); |
|
msw
2014/02/03 22:53:14
nit: order this immediately after the ctor.
Maria
2014/02/04 03:16:39
Done.
|
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(BaseSearchProvider); |
| +}; |
| +#endif // CHROME_BROWSER_AUTOCOMPLETE_BASE_SEARCH_PROVIDER_H_ |
|
msw
2014/02/03 22:53:14
nit: add a blank line above.
Maria
2014/02/04 03:16:39
Done.
|