Merge Chromium + Blink git repositories
[chromium-blink-merge.git] / components / search_engines / template_url.h
blob20919cf7fbf2ce40ebea81ce541ec19706d90c7e
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.
5 #ifndef COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_H_
6 #define COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_H_
8 #include <string>
9 #include <utility>
10 #include <vector>
12 #include "base/gtest_prod_util.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "base/time/time.h"
15 #include "components/metrics/proto/omnibox_event.pb.h"
16 #include "components/metrics/proto/omnibox_input_type.pb.h"
17 #include "components/search_engines/template_url_data.h"
18 #include "components/search_engines/template_url_id.h"
19 #include "ui/gfx/geometry/size.h"
20 #include "url/gurl.h"
21 #include "url/third_party/mozilla/url_parse.h"
23 class SearchTermsData;
24 class TemplateURL;
27 // TemplateURLRef -------------------------------------------------------------
29 // A TemplateURLRef represents a single URL within the larger TemplateURL class
30 // (which represents an entire "search engine", see below). If
31 // SupportsReplacement() is true, this URL has placeholders in it, for which
32 // callers can substitute values to get a "real" URL using ReplaceSearchTerms().
34 // TemplateURLRefs always have a non-NULL |owner_| TemplateURL, which they
35 // access in order to get at important data like the underlying URL string or
36 // the associated Profile.
37 class TemplateURLRef {
38 public:
39 // Magic numbers to pass to ReplaceSearchTerms() for the |accepted_suggestion|
40 // parameter. Most callers aren't using Suggest capabilities and should just
41 // pass NO_SUGGESTIONS_AVAILABLE.
42 // NOTE: Because positive values are meaningful, make sure these are negative!
43 enum AcceptedSuggestion {
44 NO_SUGGESTION_CHOSEN = -1,
45 NO_SUGGESTIONS_AVAILABLE = -2,
48 // Which kind of URL within our owner we are. This allows us to get at the
49 // correct string field. Use |INDEXED| to indicate that the numerical
50 // |index_in_owner_| should be used instead.
51 enum Type {
52 SEARCH,
53 SUGGEST,
54 INSTANT,
55 IMAGE,
56 NEW_TAB,
57 CONTEXTUAL_SEARCH,
58 INDEXED
61 // Type to store <content_type, post_data> pair for POST URLs.
62 // The |content_type|(first part of the pair) is the content-type of
63 // the |post_data|(second part of the pair) which is encoded in
64 // "multipart/form-data" format, it also contains the MIME boundary used in
65 // the |post_data|. See http://tools.ietf.org/html/rfc2046 for the details.
66 typedef std::pair<std::string, std::string> PostContent;
68 // This struct encapsulates arguments passed to
69 // TemplateURLRef::ReplaceSearchTerms methods. By default, only search_terms
70 // is required and is passed in the constructor.
71 struct SearchTermsArgs {
72 explicit SearchTermsArgs(const base::string16& search_terms);
73 ~SearchTermsArgs();
75 struct ContextualSearchParams {
76 ContextualSearchParams();
77 // Used when the content is sent in the HTTP header instead of as CGI
78 // parameters.
79 // TODO(jeremycho): Remove base_page_url and selection parameters once
80 // they are logged from the HTTP header.
81 ContextualSearchParams(const int version,
82 const std::string& selection,
83 const std::string& base_page_url,
84 const bool resolve);
85 // TODO(jeremycho): Delete constructor once Clank no longer depends on it.
86 ContextualSearchParams(const int version,
87 const size_t start,
88 const size_t end,
89 const std::string& selection,
90 const std::string& content,
91 const std::string& base_page_url,
92 const std::string& encoding,
93 const bool resolve);
94 ~ContextualSearchParams();
96 // The version of contextual search.
97 int version;
99 // Offset into the page content of the start of the user selection.
100 size_t start;
102 // Offset into the page content of the end of the user selection.
103 size_t end;
105 // The user selection.
106 std::string selection;
108 // The text including and surrounding the user selection.
109 std::string content;
111 // The URL of the page containing the user selection.
112 std::string base_page_url;
114 // The encoding of content.
115 std::string encoding;
117 // If true, the server will generate a search term based on the user
118 // selection and context. Otherwise the user selection will be used as-is
119 // as the search term.
120 bool resolve;
123 // The search terms (query).
124 base::string16 search_terms;
126 // The original (input) query.
127 base::string16 original_query;
129 // The type the original input query was identified as.
130 metrics::OmniboxInputType::Type input_type;
132 // The optional assisted query stats, aka AQS, used for logging purposes.
133 // This string contains impressions of all autocomplete matches shown
134 // at the query submission time. For privacy reasons, we require the
135 // search provider to support HTTPS protocol in order to receive the AQS
136 // param.
137 // For more details, see http://goto.google.com/binary-clients-logging .
138 std::string assisted_query_stats;
140 // TODO: Remove along with "aq" CGI param.
141 int accepted_suggestion;
143 // The 0-based position of the cursor within the query string at the time
144 // the request was issued. Set to base::string16::npos if not used.
145 size_t cursor_position;
147 // True to enable the start-edge margin of the omnibox, used in extended
148 // Instant to align the preview contents with the omnibox.
149 bool enable_omnibox_start_margin;
151 // The URL of the current webpage to be used for experimental zero-prefix
152 // suggestions.
153 std::string current_page_url;
155 // Which omnibox the user used to type the prefix.
156 metrics::OmniboxEventProto::PageClassification page_classification;
158 // True for searches issued with the bookmark bar pref set to shown.
159 bool bookmark_bar_pinned;
161 // Optional session token.
162 std::string session_token;
164 // Prefetch query and type.
165 std::string prefetch_query;
166 std::string prefetch_query_type;
168 // Additional query params provided by the suggest server.
169 std::string suggest_query_params;
171 // If set, ReplaceSearchTerms() will automatically append any extra query
172 // params specified via the --extra-search-query-params command-line
173 // argument. Generally, this should be set when dealing with the search or
174 // instant TemplateURLRefs of the default search engine and the caller cares
175 // about the query portion of the URL. Since neither TemplateURLRef nor
176 // indeed TemplateURL know whether a TemplateURL is the default search
177 // engine, callers instead must set this manually.
178 bool append_extra_query_params;
180 // The raw content of an image thumbnail that will be used as a query for
181 // search-by-image frontend.
182 std::string image_thumbnail_content;
184 // When searching for an image, the URL of the original image. Callers
185 // should leave this empty for images specified via data: URLs.
186 GURL image_url;
188 // When searching for an image, the original size of the image.
189 gfx::Size image_original_size;
191 // If set, ReplaceSearchTerms() will append a param to the TemplateURLRef to
192 // update the search results page incrementally even if that is otherwise
193 // disabled by google.com preferences. See comments on
194 // chrome::ForceInstantResultsParam().
195 bool force_instant_results;
197 // True if the search was made using the app list search box. Otherwise, the
198 // search was made using the omnibox.
199 bool from_app_list;
201 ContextualSearchParams contextual_search_params;
204 TemplateURLRef(const TemplateURL* owner, Type type);
205 TemplateURLRef(const TemplateURL* owner, size_t index_in_owner);
206 ~TemplateURLRef();
208 // Returns the raw URL. None of the parameters will have been replaced.
209 std::string GetURL() const;
211 // Returns the raw string of the post params. Please see comments in
212 // prepopulated_engines_schema.json for the format.
213 std::string GetPostParamsString() const;
215 // Returns true if this URL supports search term replacement.
216 bool SupportsReplacement(const SearchTermsData& search_terms_data) const;
218 // Returns a string that is the result of replacing the search terms in
219 // the url with the specified arguments. We use our owner's input encoding.
221 // If this TemplateURLRef does not support replacement (SupportsReplacement
222 // returns false), an empty string is returned.
223 // If this TemplateURLRef uses POST, and |post_content| is not NULL, the
224 // |post_params_| will be replaced, encoded in "multipart/form-data" format
225 // and stored into |post_content|.
226 std::string ReplaceSearchTerms(const SearchTermsArgs& search_terms_args,
227 const SearchTermsData& search_terms_data,
228 PostContent* post_content) const;
230 // TODO(jnd): remove the following ReplaceSearchTerms definition which does
231 // not have |post_content| parameter once all reference callers pass
232 // |post_content| parameter.
233 std::string ReplaceSearchTerms(
234 const SearchTermsArgs& search_terms_args,
235 const SearchTermsData& search_terms_data) const {
236 return ReplaceSearchTerms(search_terms_args, search_terms_data, NULL);
239 // Returns true if the TemplateURLRef is valid. An invalid TemplateURLRef is
240 // one that contains unknown terms, or invalid characters.
241 bool IsValid(const SearchTermsData& search_terms_data) const;
243 // Returns a string representation of this TemplateURLRef suitable for
244 // display. The display format is the same as the format used by Firefox.
245 base::string16 DisplayURL(const SearchTermsData& search_terms_data) const;
247 // Converts a string as returned by DisplayURL back into a string as
248 // understood by TemplateURLRef.
249 static std::string DisplayURLToURLRef(const base::string16& display_url);
251 // If this TemplateURLRef is valid and contains one search term, this returns
252 // the host/path of the URL, otherwise this returns an empty string.
253 const std::string& GetHost(const SearchTermsData& search_terms_data) const;
254 const std::string& GetPath(const SearchTermsData& search_terms_data) const;
256 // If this TemplateURLRef is valid and contains one search term
257 // in its query or ref, this returns the key of the search term,
258 // otherwise this returns an empty string.
259 const std::string& GetSearchTermKey(
260 const SearchTermsData& search_terms_data) const;
262 // If this TemplateURLRef is valid and contains one search term
263 // in its path, this returns the length of the subpath before the search term,
264 // otherwise this returns std::string::npos.
265 size_t GetSearchTermPositionInPath(
266 const SearchTermsData& search_terms_data) const;
268 // If this TemplateURLRef is valid and contains one search term,
269 // this returns the location of the search term,
270 // otherwise this returns url::Parsed::QUERY.
271 url::Parsed::ComponentType GetSearchTermKeyLocation(
272 const SearchTermsData& search_terms_data) const;
274 // Converts the specified term in our owner's encoding to a base::string16.
275 base::string16 SearchTermToString16(const std::string& term) const;
277 // Returns true if this TemplateURLRef has a replacement term of
278 // {google:baseURL} or {google:baseSuggestURL}.
279 bool HasGoogleBaseURLs(const SearchTermsData& search_terms_data) const;
281 // Use the pattern referred to by this TemplateURLRef to match the provided
282 // |url| and extract |search_terms| from it. Returns true if the pattern
283 // matches, even if |search_terms| is empty. In this case
284 // |search_term_component|, if not NULL, indicates whether the search terms
285 // were found in the query or the ref parameters; and |search_terms_position|,
286 // if not NULL, contains the position of the search terms in the query or the
287 // ref parameters. Returns false and an empty |search_terms| if the pattern
288 // does not match.
289 bool ExtractSearchTermsFromURL(
290 const GURL& url,
291 base::string16* search_terms,
292 const SearchTermsData& search_terms_data,
293 url::Parsed::ComponentType* search_term_component,
294 url::Component* search_terms_position) const;
296 // Whether the URL uses POST (as opposed to GET).
297 bool UsesPOSTMethod(const SearchTermsData& search_terms_data) const;
299 private:
300 friend class TemplateURL;
301 friend class TemplateURLTest;
302 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, SetPrepopulatedAndParse);
303 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseParameterKnown);
304 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseParameterUnknown);
305 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLEmpty);
306 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNoTemplateEnd);
307 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNoKnownParameters);
308 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLTwoParameters);
309 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNestedParameter);
310 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, URLRefTestImageURLWithPOST);
311 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ReflectsBookmarkBarPinned);
313 // Enumeration of the known types.
314 enum ReplacementType {
315 ENCODING,
316 GOOGLE_ASSISTED_QUERY_STATS,
317 GOOGLE_BASE_URL,
318 GOOGLE_BASE_SUGGEST_URL,
319 GOOGLE_BOOKMARK_BAR_PINNED,
320 GOOGLE_CURRENT_PAGE_URL,
321 GOOGLE_CURSOR_POSITION,
322 GOOGLE_FORCE_INSTANT_RESULTS,
323 GOOGLE_IMAGE_ORIGINAL_HEIGHT,
324 GOOGLE_IMAGE_ORIGINAL_WIDTH,
325 GOOGLE_IMAGE_SEARCH_SOURCE,
326 GOOGLE_IMAGE_THUMBNAIL,
327 GOOGLE_IMAGE_URL,
328 GOOGLE_INPUT_TYPE,
329 GOOGLE_INSTANT_EXTENDED_ENABLED,
330 GOOGLE_NTP_IS_THEMED,
331 GOOGLE_OMNIBOX_START_MARGIN,
332 GOOGLE_CONTEXTUAL_SEARCH_VERSION,
333 GOOGLE_CONTEXTUAL_SEARCH_CONTEXT_DATA,
334 GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION,
335 GOOGLE_PAGE_CLASSIFICATION,
336 GOOGLE_PREFETCH_QUERY,
337 GOOGLE_RLZ,
338 GOOGLE_SEARCH_CLIENT,
339 GOOGLE_SEARCH_FIELDTRIAL_GROUP,
340 GOOGLE_SEARCH_VERSION,
341 GOOGLE_SESSION_TOKEN,
342 GOOGLE_SUGGEST_CLIENT,
343 GOOGLE_SUGGEST_REQUEST_ID,
344 GOOGLE_UNESCAPED_SEARCH_TERMS,
345 LANGUAGE,
346 SEARCH_TERMS,
349 // Used to identify an element of the raw url that can be replaced.
350 struct Replacement {
351 Replacement(ReplacementType type, size_t index)
352 : type(type), index(index), is_post_param(false) {}
353 ReplacementType type;
354 size_t index;
355 // Indicates the location in where the replacement is replaced. If
356 // |is_post_param| is false, |index| indicates the byte position in
357 // |parsed_url_|. Otherwise, |index| is the index of |post_params_|.
358 bool is_post_param;
361 // Stores a single parameter for a POST.
362 struct PostParam {
363 std::string name;
364 std::string value;
365 std::string content_type;
368 // The list of elements to replace.
369 typedef std::vector<struct Replacement> Replacements;
370 typedef std::vector<PostParam> PostParams;
372 // TemplateURLRef internally caches values to make replacement quick. This
373 // method invalidates any cached values.
374 void InvalidateCachedValues() const;
376 // Parses the parameter in url at the specified offset. start/end specify the
377 // range of the parameter in the url, including the braces. If the parameter
378 // is valid, url is updated to reflect the appropriate parameter. If
379 // the parameter is one of the known parameters an element is added to
380 // replacements indicating the type and range of the element. The original
381 // parameter is erased from the url.
383 // If the parameter is not a known parameter, false is returned. If this is a
384 // prepopulated URL, the parameter is erased, otherwise it is left alone.
385 bool ParseParameter(size_t start,
386 size_t end,
387 std::string* url,
388 Replacements* replacements) const;
390 // Parses the specified url, replacing parameters as necessary. If
391 // successful, valid is set to true, and the parsed url is returned. For all
392 // known parameters that are encountered an entry is added to replacements.
393 // If there is an error parsing the url, valid is set to false, and an empty
394 // string is returned. If the URL has the POST parameters, they will be
395 // parsed into |post_params| which will be further replaced with real search
396 // terms data and encoded in "multipart/form-data" format to generate the
397 // POST data.
398 std::string ParseURL(const std::string& url,
399 Replacements* replacements,
400 PostParams* post_params,
401 bool* valid) const;
403 // If the url has not yet been parsed, ParseURL is invoked.
404 // NOTE: While this is const, it modifies parsed_, valid_, parsed_url_ and
405 // search_offset_.
406 void ParseIfNecessary(const SearchTermsData& search_terms_data) const;
408 // Extracts the query key and host from the url.
409 void ParseHostAndSearchTermKey(
410 const SearchTermsData& search_terms_data) const;
412 // Encode post parameters in "multipart/form-data" format and store it
413 // inside |post_content|. Returns false if errors are encountered during
414 // encoding. This method is called each time ReplaceSearchTerms gets called.
415 bool EncodeFormData(const PostParams& post_params,
416 PostContent* post_content) const;
418 // Handles a replacement by using real term data. If the replacement
419 // belongs to a PostParam, the PostParam will be replaced by the term data.
420 // Otherwise, the term data will be inserted at the place that the
421 // replacement points to.
422 void HandleReplacement(const std::string& name,
423 const std::string& value,
424 const Replacement& replacement,
425 std::string* url) const;
427 // Replaces all replacements in |parsed_url_| with their actual values and
428 // returns the result. This is the main functionality of
429 // ReplaceSearchTerms().
430 std::string HandleReplacements(
431 const SearchTermsArgs& search_terms_args,
432 const SearchTermsData& search_terms_data,
433 PostContent* post_content) const;
435 // The TemplateURL that contains us. This should outlive us.
436 const TemplateURL* const owner_;
438 // What kind of URL we are.
439 const Type type_;
441 // If |type_| is |INDEXED|, this |index_in_owner_| is used instead to refer to
442 // a url within our owner.
443 const size_t index_in_owner_;
445 // Whether the URL has been parsed.
446 mutable bool parsed_;
448 // Whether the url was successfully parsed.
449 mutable bool valid_;
451 // The parsed URL. All terms have been stripped out of this with
452 // replacements_ giving the index of the terms to replace.
453 mutable std::string parsed_url_;
455 // Do we support search term replacement?
456 mutable bool supports_replacements_;
458 // The replaceable parts of url (parsed_url_). These are ordered by index
459 // into the string, and may be empty.
460 mutable Replacements replacements_;
462 // Host, path, key and location of the search term. These are only set if the
463 // url contains one search term.
464 mutable std::string host_;
465 mutable std::string path_;
466 mutable std::string search_term_key_;
467 mutable size_t search_term_position_in_path_;
468 mutable url::Parsed::ComponentType search_term_key_location_;
470 mutable PostParams post_params_;
472 // Whether the contained URL is a pre-populated URL.
473 bool prepopulated_;
475 DISALLOW_COPY_AND_ASSIGN(TemplateURLRef);
479 // TemplateURL ----------------------------------------------------------------
481 // A TemplateURL represents a single "search engine", defined primarily as a
482 // subset of the Open Search Description Document
483 // (http://www.opensearch.org/Specifications/OpenSearch) plus some extensions.
484 // One TemplateURL contains several TemplateURLRefs, which correspond to various
485 // different capabilities (e.g. doing searches or getting suggestions), as well
486 // as a TemplateURLData containing other details like the name, keyword, etc.
488 // TemplateURLs are intended to be read-only for most users.
489 // The TemplateURLService, which handles storing and manipulating TemplateURLs,
490 // is made a friend so that it can be the exception to this pattern.
491 class TemplateURL {
492 public:
493 enum Type {
494 // Regular search engine.
495 NORMAL,
496 // Installed by extension through Override Settings API.
497 NORMAL_CONTROLLED_BY_EXTENSION,
498 // The keyword associated with an extension that uses the Omnibox API.
499 OMNIBOX_API_EXTENSION,
502 // An AssociatedExtensionInfo represents information about the extension that
503 // added the search engine.
504 struct AssociatedExtensionInfo {
505 AssociatedExtensionInfo(Type type, const std::string& extension_id);
506 ~AssociatedExtensionInfo();
508 Type type;
510 std::string extension_id;
512 // Whether the search engine is supposed to be default.
513 bool wants_to_be_default_engine;
515 // Used to resolve conflicts when there are multiple extensions specifying
516 // the default search engine. The most recently-installed wins.
517 base::Time install_time;
520 explicit TemplateURL(const TemplateURLData& data);
521 ~TemplateURL();
523 // Generates a suitable keyword for the specified url, which must be valid.
524 // This is guaranteed not to return an empty string, since TemplateURLs should
525 // never have an empty keyword.
526 // |accept_languages| is a list of languages, which will be used in
527 // IDN-decoding of |url|'s hostname.
528 static base::string16 GenerateKeyword(const GURL& url,
529 const std::string& accept_languages);
531 // Generates a favicon URL from the specified url.
532 static GURL GenerateFaviconURL(const GURL& url);
534 // Returns true if |t_url| and |data| are equal in all meaningful respects.
535 // Static to allow either or both params to be NULL.
536 static bool MatchesData(const TemplateURL* t_url,
537 const TemplateURLData* data,
538 const SearchTermsData& search_terms_data);
540 const TemplateURLData& data() const { return data_; }
542 const base::string16& short_name() const { return data_.short_name(); }
543 // An accessor for the short_name, but adjusted so it can be appropriately
544 // displayed even if it is LTR and the UI is RTL.
545 base::string16 AdjustedShortNameForLocaleDirection() const;
547 const base::string16& keyword() const { return data_.keyword(); }
549 const std::string& url() const { return data_.url(); }
550 const std::string& suggestions_url() const { return data_.suggestions_url; }
551 const std::string& instant_url() const { return data_.instant_url; }
552 const std::string& image_url() const { return data_.image_url; }
553 const std::string& new_tab_url() const { return data_.new_tab_url; }
554 const std::string& contextual_search_url() const {
555 return data_.contextual_search_url;
557 const std::string& search_url_post_params() const {
558 return data_.search_url_post_params;
560 const std::string& suggestions_url_post_params() const {
561 return data_.suggestions_url_post_params;
563 const std::string& instant_url_post_params() const {
564 return data_.instant_url_post_params;
566 const std::string& image_url_post_params() const {
567 return data_.image_url_post_params;
569 const std::vector<std::string>& alternate_urls() const {
570 return data_.alternate_urls;
572 const GURL& favicon_url() const { return data_.favicon_url; }
574 const GURL& originating_url() const { return data_.originating_url; }
576 bool show_in_default_list() const { return data_.show_in_default_list; }
577 // Returns true if show_in_default_list() is true and this TemplateURL has a
578 // TemplateURLRef that supports replacement.
579 bool ShowInDefaultList(const SearchTermsData& search_terms_data) const;
581 bool safe_for_autoreplace() const { return data_.safe_for_autoreplace; }
583 const std::vector<std::string>& input_encodings() const {
584 return data_.input_encodings;
587 TemplateURLID id() const { return data_.id; }
589 base::Time date_created() const { return data_.date_created; }
590 base::Time last_modified() const { return data_.last_modified; }
592 bool created_by_policy() const { return data_.created_by_policy; }
594 int usage_count() const { return data_.usage_count; }
596 int prepopulate_id() const { return data_.prepopulate_id; }
598 const std::string& sync_guid() const { return data_.sync_guid; }
600 // TODO(beaudoin): Rename this when renaming HasSearchTermsReplacementKey().
601 const std::string& search_terms_replacement_key() const {
602 return data_.search_terms_replacement_key;
605 const TemplateURLRef& url_ref() const { return url_ref_; }
606 const TemplateURLRef& suggestions_url_ref() const {
607 return suggestions_url_ref_;
609 const TemplateURLRef& instant_url_ref() const { return instant_url_ref_; }
610 const TemplateURLRef& image_url_ref() const { return image_url_ref_; }
611 const TemplateURLRef& new_tab_url_ref() const { return new_tab_url_ref_; }
612 const TemplateURLRef& contextual_search_url_ref() const {
613 return contextual_search_url_ref_;
616 // This setter shouldn't be used except by TemplateURLService and
617 // TemplateURLServiceClient implementations.
618 void set_extension_info(scoped_ptr<AssociatedExtensionInfo> extension_info) {
619 extension_info_ = extension_info.Pass();
622 // Returns true if |url| supports replacement.
623 bool SupportsReplacement(const SearchTermsData& search_terms_data) const;
625 // Returns true if any URLRefs use Googe base URLs.
626 bool HasGoogleBaseURLs(const SearchTermsData& search_terms_data) const;
628 // Returns true if this TemplateURL uses Google base URLs and has a keyword
629 // of "google.TLD". We use this to decide whether we can automatically
630 // update the keyword to reflect the current Google base URL TLD.
631 bool IsGoogleSearchURLWithReplaceableKeyword(
632 const SearchTermsData& search_terms_data) const;
634 // Returns true if the keywords match or if
635 // IsGoogleSearchURLWithReplaceableKeyword() is true for both |this| and
636 // |other|.
637 bool HasSameKeywordAs(const TemplateURLData& other,
638 const SearchTermsData& search_terms_data) const;
640 Type GetType() const;
642 // Returns the id of the extension that added this search engine. Only call
643 // this for TemplateURLs of type NORMAL_CONTROLLED_BY_EXTENSION or
644 // OMNIBOX_API_EXTENSION.
645 std::string GetExtensionId() const;
647 // Returns the total number of URLs comprised in this template, including
648 // search and alternate URLs.
649 size_t URLCount() const;
651 // Gets the search URL at the given index. The alternate URLs, if any, are
652 // numbered starting at 0, and the primary search URL follows. This is used
653 // to decode the search term given a search URL (see
654 // ExtractSearchTermsFromURL()).
655 const std::string& GetURL(size_t index) const;
657 // Use the alternate URLs and the search URL to match the provided |url|
658 // and extract |search_terms| from it. Returns false and an empty
659 // |search_terms| if no search terms can be matched. The order in which the
660 // alternate URLs are listed dictates their priority, the URL at index 0 is
661 // treated as the highest priority and the primary search URL is treated as
662 // the lowest priority (see GetURL()). For example, if a TemplateURL has
663 // alternate URL "http://foo/#q={searchTerms}" and search URL
664 // "http://foo/?q={searchTerms}", and the URL to be decoded is
665 // "http://foo/?q=a#q=b", the alternate URL will match first and the decoded
666 // search term will be "b".
667 bool ExtractSearchTermsFromURL(const GURL& url,
668 const SearchTermsData& search_terms_data,
669 base::string16* search_terms) const;
671 // Returns true if non-empty search terms could be extracted from |url| using
672 // ExtractSearchTermsFromURL(). In other words, this returns whether |url|
673 // could be the result of performing a search with |this|.
674 bool IsSearchURL(const GURL& url,
675 const SearchTermsData& search_terms_data) const;
677 // Returns true if the specified |url| contains the search terms replacement
678 // key in either the query or the ref. This method does not verify anything
679 // else about the URL. In particular, it does not check that the domain
680 // matches that of this TemplateURL.
681 // TODO(beaudoin): Rename this to reflect that it really checks for an
682 // InstantExtended capable URL.
683 bool HasSearchTermsReplacementKey(const GURL& url) const;
685 // Given a |url| corresponding to this TemplateURL, identifies the search
686 // terms and replaces them with the ones in |search_terms_args|, leaving the
687 // other parameters untouched. If the replacement fails, returns false and
688 // leaves |result| untouched. This is used by mobile ports to perform query
689 // refinement.
690 bool ReplaceSearchTermsInURL(
691 const GURL& url,
692 const TemplateURLRef::SearchTermsArgs& search_terms_args,
693 const SearchTermsData& search_terms_data,
694 GURL* result);
696 // Encodes the search terms from |search_terms_args| so that we know the
697 // |input_encoding|. Returns the |encoded_terms| and the
698 // |encoded_original_query|. |encoded_terms| may be escaped as path or query
699 // depending on |is_in_query|; |encoded_original_query| is always escaped as
700 // query.
701 void EncodeSearchTerms(
702 const TemplateURLRef::SearchTermsArgs& search_terms_args,
703 bool is_in_query,
704 std::string* input_encoding,
705 base::string16* encoded_terms,
706 base::string16* encoded_original_query) const;
708 // Returns the search url for this template URL.
709 // Returns an empty GURL if this template URL has no url().
710 GURL GenerateSearchURL(const SearchTermsData& search_terms_data) const;
712 private:
713 friend class TemplateURLService;
714 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ReflectsBookmarkBarPinned);
716 void CopyFrom(const TemplateURL& other);
718 void SetURL(const std::string& url);
719 void SetPrepopulateId(int id);
721 // Resets the keyword if IsGoogleSearchURLWithReplaceableKeyword() or |force|.
722 // The |force| parameter is useful when the existing keyword is known to be
723 // a placeholder. The resulting keyword is generated using
724 // GenerateSearchURL() and GenerateKeyword().
725 void ResetKeywordIfNecessary(const SearchTermsData& search_terms_data,
726 bool force);
728 // Uses the alternate URLs and the search URL to match the provided |url|
729 // and extract |search_terms| from it as well as the |search_terms_component|
730 // (either REF or QUERY) and |search_terms_component| at which the
731 // |search_terms| are found in |url|. See also ExtractSearchTermsFromURL().
732 bool FindSearchTermsInURL(const GURL& url,
733 const SearchTermsData& search_terms_data,
734 base::string16* search_terms,
735 url::Parsed::ComponentType* search_terms_component,
736 url::Component* search_terms_position) const;
738 TemplateURLData data_;
739 TemplateURLRef url_ref_;
740 TemplateURLRef suggestions_url_ref_;
741 TemplateURLRef instant_url_ref_;
742 TemplateURLRef image_url_ref_;
743 TemplateURLRef new_tab_url_ref_;
744 TemplateURLRef contextual_search_url_ref_;
745 scoped_ptr<AssociatedExtensionInfo> extension_info_;
747 // TODO(sky): Add date last parsed OSD file.
749 DISALLOW_COPY_AND_ASSIGN(TemplateURL);
752 #endif // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_H_