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_
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"
21 #include "url/url_parse.h"
23 class SearchTermsData
;
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
{
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.
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
);
75 struct ContextualSearchParams
{
76 ContextualSearchParams();
77 // TODO(jeremycho): Delete constructor once Clank no longer depends on it.
78 ContextualSearchParams(const int version
,
81 const std::string
& selection
,
82 const std::string
& content
,
83 const std::string
& base_page_url
,
84 const std::string
& encoding
);
85 ContextualSearchParams(const int version
,
88 const std::string
& selection
,
89 const std::string
& content
,
90 const std::string
& base_page_url
,
91 const std::string
& encoding
,
93 ~ContextualSearchParams();
95 // The version of contextual search.
98 // Offset into the page content of the start of the user selection.
101 // Offset into the page content of the end of the user selection.
104 // The user selection.
105 std::string selection
;
107 // The text including and surrounding the user selection.
110 // The URL of the page containing the user selection.
111 std::string base_page_url
;
113 // The encoding of content.
114 std::string encoding
;
116 // If true, the server will generate a search term based on the user
117 // selection and context. Otherwise the user selection will be used as-is
118 // as the search term.
122 // The search terms (query).
123 base::string16 search_terms
;
125 // The original (input) query.
126 base::string16 original_query
;
128 // The type the original input query was identified as.
129 metrics::OmniboxInputType::Type input_type
;
131 // The optional assisted query stats, aka AQS, used for logging purposes.
132 // This string contains impressions of all autocomplete matches shown
133 // at the query submission time. For privacy reasons, we require the
134 // search provider to support HTTPS protocol in order to receive the AQS
136 // For more details, see http://goto.google.com/binary-clients-logging .
137 std::string assisted_query_stats
;
139 // TODO: Remove along with "aq" CGI param.
140 int accepted_suggestion
;
142 // The 0-based position of the cursor within the query string at the time
143 // the request was issued. Set to base::string16::npos if not used.
144 size_t cursor_position
;
146 // True to enable the start-edge margin of the omnibox, used in extended
147 // Instant to align the preview contents with the omnibox.
148 bool enable_omnibox_start_margin
;
150 // The URL of the current webpage to be used for experimental zero-prefix
152 std::string current_page_url
;
154 // Which omnibox the user used to type the prefix.
155 metrics::OmniboxEventProto::PageClassification page_classification
;
157 // True for searches issued with the bookmark bar pref set to shown.
158 bool bookmark_bar_pinned
;
160 // Optional session token.
161 std::string session_token
;
163 // Prefetch query and type.
164 std::string prefetch_query
;
165 std::string prefetch_query_type
;
167 // Additional query params provided by the suggest server.
168 std::string suggest_query_params
;
170 // If set, ReplaceSearchTerms() will automatically append any extra query
171 // params specified via the --extra-search-query-params command-line
172 // argument. Generally, this should be set when dealing with the search or
173 // instant TemplateURLRefs of the default search engine and the caller cares
174 // about the query portion of the URL. Since neither TemplateURLRef nor
175 // indeed TemplateURL know whether a TemplateURL is the default search
176 // engine, callers instead must set this manually.
177 bool append_extra_query_params
;
179 // The raw content of an image thumbnail that will be used as a query for
180 // search-by-image frontend.
181 std::string image_thumbnail_content
;
183 // When searching for an image, the URL of the original image. Callers
184 // should leave this empty for images specified via data: URLs.
187 // When searching for an image, the original size of the image.
188 gfx::Size image_original_size
;
190 // If set, ReplaceSearchTerms() will append a param to the TemplateURLRef to
191 // update the search results page incrementally even if that is otherwise
192 // disabled by google.com preferences. See comments on
193 // chrome::ForceInstantResultsParam().
194 bool force_instant_results
;
196 // True if the search was made using the app list search box. Otherwise, the
197 // search was made using the omnibox.
200 ContextualSearchParams contextual_search_params
;
203 TemplateURLRef(TemplateURL
* owner
, Type type
);
204 TemplateURLRef(TemplateURL
* owner
, size_t index_in_owner
);
207 // Returns the raw URL. None of the parameters will have been replaced.
208 std::string
GetURL() const;
210 // Returns the raw string of the post params. Please see comments in
211 // prepopulated_engines_schema.json for the format.
212 std::string
GetPostParamsString() const;
214 // Returns true if this URL supports search term replacement.
215 bool SupportsReplacement(const SearchTermsData
& search_terms_data
) const;
217 // Returns a string that is the result of replacing the search terms in
218 // the url with the specified arguments. We use our owner's input encoding.
220 // If this TemplateURLRef does not support replacement (SupportsReplacement
221 // returns false), an empty string is returned.
222 // If this TemplateURLRef uses POST, and |post_content| is not NULL, the
223 // |post_params_| will be replaced, encoded in "multipart/form-data" format
224 // and stored into |post_content|.
225 std::string
ReplaceSearchTerms(const SearchTermsArgs
& search_terms_args
,
226 const SearchTermsData
& search_terms_data
,
227 PostContent
* post_content
) const;
229 // TODO(jnd): remove the following ReplaceSearchTerms definition which does
230 // not have |post_content| parameter once all reference callers pass
231 // |post_content| parameter.
232 std::string
ReplaceSearchTerms(
233 const SearchTermsArgs
& search_terms_args
,
234 const SearchTermsData
& search_terms_data
) const {
235 return ReplaceSearchTerms(search_terms_args
, search_terms_data
, NULL
);
238 // Returns true if the TemplateURLRef is valid. An invalid TemplateURLRef is
239 // one that contains unknown terms, or invalid characters.
240 bool IsValid(const SearchTermsData
& search_terms_data
) const;
242 // Returns a string representation of this TemplateURLRef suitable for
243 // display. The display format is the same as the format used by Firefox.
244 base::string16
DisplayURL(const SearchTermsData
& search_terms_data
) const;
246 // Converts a string as returned by DisplayURL back into a string as
247 // understood by TemplateURLRef.
248 static std::string
DisplayURLToURLRef(const base::string16
& display_url
);
250 // If this TemplateURLRef is valid and contains one search term, this returns
251 // the host/path of the URL, otherwise this returns an empty string.
252 const std::string
& GetHost(const SearchTermsData
& search_terms_data
) const;
253 const std::string
& GetPath(const SearchTermsData
& search_terms_data
) const;
255 // If this TemplateURLRef is valid and contains one search term, this returns
256 // the key of the search term, otherwise this returns an empty string.
257 const std::string
& GetSearchTermKey(
258 const SearchTermsData
& search_terms_data
) const;
260 // Converts the specified term in our owner's encoding to a base::string16.
261 base::string16
SearchTermToString16(const std::string
& term
) const;
263 // Returns true if this TemplateURLRef has a replacement term of
264 // {google:baseURL} or {google:baseSuggestURL}.
265 bool HasGoogleBaseURLs(const SearchTermsData
& search_terms_data
) const;
267 // Use the pattern referred to by this TemplateURLRef to match the provided
268 // |url| and extract |search_terms| from it. Returns true if the pattern
269 // matches, even if |search_terms| is empty. In this case
270 // |search_term_component|, if not NULL, indicates whether the search terms
271 // were found in the query or the ref parameters; and |search_terms_position|,
272 // if not NULL, contains the position of the search terms in the query or the
273 // ref parameters. Returns false and an empty |search_terms| if the pattern
275 bool ExtractSearchTermsFromURL(
277 base::string16
* search_terms
,
278 const SearchTermsData
& search_terms_data
,
279 url::Parsed::ComponentType
* search_term_component
,
280 url::Component
* search_terms_position
) const;
282 // Whether the URL uses POST (as opposed to GET).
283 bool UsesPOSTMethod(const SearchTermsData
& search_terms_data
) const;
286 friend class TemplateURL
;
287 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, SetPrepopulatedAndParse
);
288 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseParameterKnown
);
289 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseParameterUnknown
);
290 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseURLEmpty
);
291 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseURLNoTemplateEnd
);
292 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseURLNoKnownParameters
);
293 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseURLTwoParameters
);
294 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ParseURLNestedParameter
);
295 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, URLRefTestImageURLWithPOST
);
296 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ReflectsBookmarkBarPinned
);
298 // Enumeration of the known types.
299 enum ReplacementType
{
301 GOOGLE_ASSISTED_QUERY_STATS
,
303 GOOGLE_BASE_SUGGEST_URL
,
304 GOOGLE_BOOKMARK_BAR_PINNED
,
305 GOOGLE_CURRENT_PAGE_URL
,
306 GOOGLE_CURSOR_POSITION
,
307 GOOGLE_FORCE_INSTANT_RESULTS
,
308 GOOGLE_IMAGE_ORIGINAL_HEIGHT
,
309 GOOGLE_IMAGE_ORIGINAL_WIDTH
,
310 GOOGLE_IMAGE_SEARCH_SOURCE
,
311 GOOGLE_IMAGE_THUMBNAIL
,
314 GOOGLE_INSTANT_EXTENDED_ENABLED
,
315 GOOGLE_NTP_IS_THEMED
,
316 GOOGLE_OMNIBOX_START_MARGIN
,
317 GOOGLE_CONTEXTUAL_SEARCH_VERSION
,
318 GOOGLE_CONTEXTUAL_SEARCH_CONTEXT_DATA
,
319 GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION
,
320 GOOGLE_PAGE_CLASSIFICATION
,
321 GOOGLE_PREFETCH_QUERY
,
323 GOOGLE_SEARCH_CLIENT
,
324 GOOGLE_SEARCH_FIELDTRIAL_GROUP
,
325 GOOGLE_SEARCH_VERSION
,
326 GOOGLE_SESSION_TOKEN
,
327 GOOGLE_SUGGEST_CLIENT
,
328 GOOGLE_SUGGEST_REQUEST_ID
,
329 GOOGLE_UNESCAPED_SEARCH_TERMS
,
334 // Used to identify an element of the raw url that can be replaced.
336 Replacement(ReplacementType type
, size_t index
)
337 : type(type
), index(index
), is_post_param(false) {}
338 ReplacementType type
;
340 // Indicates the location in where the replacement is replaced. If
341 // |is_post_param| is false, |index| indicates the byte position in
342 // |parsed_url_|. Otherwise, |index| is the index of |post_params_|.
346 // The list of elements to replace.
347 typedef std::vector
<struct Replacement
> Replacements
;
348 // Type to store <key, value> pairs for POST URLs.
349 typedef std::pair
<std::string
, std::string
> PostParam
;
350 typedef std::vector
<PostParam
> PostParams
;
352 // TemplateURLRef internally caches values to make replacement quick. This
353 // method invalidates any cached values.
354 void InvalidateCachedValues() const;
356 // Parses the parameter in url at the specified offset. start/end specify the
357 // range of the parameter in the url, including the braces. If the parameter
358 // is valid, url is updated to reflect the appropriate parameter. If
359 // the parameter is one of the known parameters an element is added to
360 // replacements indicating the type and range of the element. The original
361 // parameter is erased from the url.
363 // If the parameter is not a known parameter, false is returned. If this is a
364 // prepopulated URL, the parameter is erased, otherwise it is left alone.
365 bool ParseParameter(size_t start
,
368 Replacements
* replacements
) const;
370 // Parses the specified url, replacing parameters as necessary. If
371 // successful, valid is set to true, and the parsed url is returned. For all
372 // known parameters that are encountered an entry is added to replacements.
373 // If there is an error parsing the url, valid is set to false, and an empty
374 // string is returned. If the URL has the POST parameters, they will be
375 // parsed into |post_params| which will be further replaced with real search
376 // terms data and encoded in "multipart/form-data" format to generate the
378 std::string
ParseURL(const std::string
& url
,
379 Replacements
* replacements
,
380 PostParams
* post_params
,
383 // If the url has not yet been parsed, ParseURL is invoked.
384 // NOTE: While this is const, it modifies parsed_, valid_, parsed_url_ and
386 void ParseIfNecessary(const SearchTermsData
& search_terms_data
) const;
388 // Extracts the query key and host from the url.
389 void ParseHostAndSearchTermKey(
390 const SearchTermsData
& search_terms_data
) const;
392 // Encode post parameters in "multipart/form-data" format and store it
393 // inside |post_content|. Returns false if errors are encountered during
394 // encoding. This method is called each time ReplaceSearchTerms gets called.
395 bool EncodeFormData(const PostParams
& post_params
,
396 PostContent
* post_content
) const;
398 // Handles a replacement by using real term data. If the replacement
399 // belongs to a PostParam, the PostParam will be replaced by the term data.
400 // Otherwise, the term data will be inserted at the place that the
401 // replacement points to.
402 void HandleReplacement(const std::string
& name
,
403 const std::string
& value
,
404 const Replacement
& replacement
,
405 std::string
* url
) const;
407 // Replaces all replacements in |parsed_url_| with their actual values and
408 // returns the result. This is the main functionality of
409 // ReplaceSearchTerms().
410 std::string
HandleReplacements(
411 const SearchTermsArgs
& search_terms_args
,
412 const SearchTermsData
& search_terms_data
,
413 PostContent
* post_content
) const;
415 // The TemplateURL that contains us. This should outlive us.
416 TemplateURL
* const owner_
;
418 // What kind of URL we are.
421 // If |type_| is |INDEXED|, this |index_in_owner_| is used instead to refer to
422 // a url within our owner.
423 const size_t index_in_owner_
;
425 // Whether the URL has been parsed.
426 mutable bool parsed_
;
428 // Whether the url was successfully parsed.
431 // The parsed URL. All terms have been stripped out of this with
432 // replacements_ giving the index of the terms to replace.
433 mutable std::string parsed_url_
;
435 // Do we support search term replacement?
436 mutable bool supports_replacements_
;
438 // The replaceable parts of url (parsed_url_). These are ordered by index
439 // into the string, and may be empty.
440 mutable Replacements replacements_
;
442 // Host, path, key and location of the search term. These are only set if the
443 // url contains one search term.
444 mutable std::string host_
;
445 mutable std::string path_
;
446 mutable std::string search_term_key_
;
447 mutable url::Parsed::ComponentType search_term_key_location_
;
449 mutable PostParams post_params_
;
451 // Whether the contained URL is a pre-populated URL.
454 DISALLOW_COPY_AND_ASSIGN(TemplateURLRef
);
458 // TemplateURL ----------------------------------------------------------------
460 // A TemplateURL represents a single "search engine", defined primarily as a
461 // subset of the Open Search Description Document
462 // (http://www.opensearch.org/Specifications/OpenSearch) plus some extensions.
463 // One TemplateURL contains several TemplateURLRefs, which correspond to various
464 // different capabilities (e.g. doing searches or getting suggestions), as well
465 // as a TemplateURLData containing other details like the name, keyword, etc.
467 // TemplateURLs are intended to be read-only for most users.
468 // The TemplateURLService, which handles storing and manipulating TemplateURLs,
469 // is made a friend so that it can be the exception to this pattern.
473 // Regular search engine.
475 // Installed by extension through Override Settings API.
476 NORMAL_CONTROLLED_BY_EXTENSION
,
477 // The keyword associated with an extension that uses the Omnibox API.
478 OMNIBOX_API_EXTENSION
,
481 // An AssociatedExtensionInfo represents information about the extension that
482 // added the search engine.
483 struct AssociatedExtensionInfo
{
484 AssociatedExtensionInfo(Type type
, const std::string
& extension_id
);
485 ~AssociatedExtensionInfo();
489 std::string extension_id
;
491 // Whether the search engine is supposed to be default.
492 bool wants_to_be_default_engine
;
494 // Used to resolve conflicts when there are multiple extensions specifying
495 // the default search engine. The most recently-installed wins.
496 base::Time install_time
;
499 explicit TemplateURL(const TemplateURLData
& data
);
502 // Generates a suitable keyword for the specified url, which must be valid.
503 // This is guaranteed not to return an empty string, since TemplateURLs should
504 // never have an empty keyword.
505 static base::string16
GenerateKeyword(const GURL
& url
);
507 // Generates a favicon URL from the specified url.
508 static GURL
GenerateFaviconURL(const GURL
& url
);
510 // Returns true if |t_url| and |data| are equal in all meaningful respects.
511 // Static to allow either or both params to be NULL.
512 static bool MatchesData(const TemplateURL
* t_url
,
513 const TemplateURLData
* data
,
514 const SearchTermsData
& search_terms_data
);
516 const TemplateURLData
& data() const { return data_
; }
518 const base::string16
& short_name() const { return data_
.short_name
; }
519 // An accessor for the short_name, but adjusted so it can be appropriately
520 // displayed even if it is LTR and the UI is RTL.
521 base::string16
AdjustedShortNameForLocaleDirection() const;
523 const base::string16
& keyword() const { return data_
.keyword(); }
525 const std::string
& url() const { return data_
.url(); }
526 const std::string
& suggestions_url() const { return data_
.suggestions_url
; }
527 const std::string
& instant_url() const { return data_
.instant_url
; }
528 const std::string
& image_url() const { return data_
.image_url
; }
529 const std::string
& new_tab_url() const { return data_
.new_tab_url
; }
530 const std::string
& contextual_search_url() const {
531 return data_
.contextual_search_url
;
533 const std::string
& search_url_post_params() const {
534 return data_
.search_url_post_params
;
536 const std::string
& suggestions_url_post_params() const {
537 return data_
.suggestions_url_post_params
;
539 const std::string
& instant_url_post_params() const {
540 return data_
.instant_url_post_params
;
542 const std::string
& image_url_post_params() const {
543 return data_
.image_url_post_params
;
545 const std::vector
<std::string
>& alternate_urls() const {
546 return data_
.alternate_urls
;
548 const GURL
& favicon_url() const { return data_
.favicon_url
; }
550 const GURL
& originating_url() const { return data_
.originating_url
; }
552 bool show_in_default_list() const { return data_
.show_in_default_list
; }
553 // Returns true if show_in_default_list() is true and this TemplateURL has a
554 // TemplateURLRef that supports replacement.
555 bool ShowInDefaultList(const SearchTermsData
& search_terms_data
) const;
557 bool safe_for_autoreplace() const { return data_
.safe_for_autoreplace
; }
559 const std::vector
<std::string
>& input_encodings() const {
560 return data_
.input_encodings
;
563 TemplateURLID
id() const { return data_
.id
; }
565 base::Time
date_created() const { return data_
.date_created
; }
566 base::Time
last_modified() const { return data_
.last_modified
; }
568 bool created_by_policy() const { return data_
.created_by_policy
; }
570 int usage_count() const { return data_
.usage_count
; }
572 int prepopulate_id() const { return data_
.prepopulate_id
; }
574 const std::string
& sync_guid() const { return data_
.sync_guid
; }
576 // TODO(beaudoin): Rename this when renaming HasSearchTermsReplacementKey().
577 const std::string
& search_terms_replacement_key() const {
578 return data_
.search_terms_replacement_key
;
581 const TemplateURLRef
& url_ref() const { return url_ref_
; }
582 const TemplateURLRef
& suggestions_url_ref() const {
583 return suggestions_url_ref_
;
585 const TemplateURLRef
& instant_url_ref() const { return instant_url_ref_
; }
586 const TemplateURLRef
& image_url_ref() const { return image_url_ref_
; }
587 const TemplateURLRef
& new_tab_url_ref() const { return new_tab_url_ref_
; }
588 const TemplateURLRef
& contextual_search_url_ref() const {
589 return contextual_search_url_ref_
;
592 // This setter shouldn't be used except by TemplateURLService and
593 // TemplateURLServiceClient implementations.
594 void set_extension_info(scoped_ptr
<AssociatedExtensionInfo
> extension_info
) {
595 extension_info_
= extension_info
.Pass();
598 // Returns true if |url| supports replacement.
599 bool SupportsReplacement(const SearchTermsData
& search_terms_data
) const;
601 // Returns true if any URLRefs use Googe base URLs.
602 bool HasGoogleBaseURLs(const SearchTermsData
& search_terms_data
) const;
604 // Returns true if this TemplateURL uses Google base URLs and has a keyword
605 // of "google.TLD". We use this to decide whether we can automatically
606 // update the keyword to reflect the current Google base URL TLD.
607 bool IsGoogleSearchURLWithReplaceableKeyword(
608 const SearchTermsData
& search_terms_data
) const;
610 // Returns true if the keywords match or if
611 // IsGoogleSearchURLWithReplaceableKeyword() is true for both |this| and
613 bool HasSameKeywordAs(const TemplateURLData
& other
,
614 const SearchTermsData
& search_terms_data
) const;
616 Type
GetType() const;
618 // Returns the id of the extension that added this search engine. Only call
619 // this for TemplateURLs of type NORMAL_CONTROLLED_BY_EXTENSION or
620 // OMNIBOX_API_EXTENSION.
621 std::string
GetExtensionId() const;
623 // Returns the total number of URLs comprised in this template, including
624 // search and alternate URLs.
625 size_t URLCount() const;
627 // Gets the search URL at the given index. The alternate URLs, if any, are
628 // numbered starting at 0, and the primary search URL follows. This is used
629 // to decode the search term given a search URL (see
630 // ExtractSearchTermsFromURL()).
631 const std::string
& GetURL(size_t index
) const;
633 // Use the alternate URLs and the search URL to match the provided |url|
634 // and extract |search_terms| from it. Returns false and an empty
635 // |search_terms| if no search terms can be matched. The order in which the
636 // alternate URLs are listed dictates their priority, the URL at index 0 is
637 // treated as the highest priority and the primary search URL is treated as
638 // the lowest priority (see GetURL()). For example, if a TemplateURL has
639 // alternate URL "http://foo/#q={searchTerms}" and search URL
640 // "http://foo/?q={searchTerms}", and the URL to be decoded is
641 // "http://foo/?q=a#q=b", the alternate URL will match first and the decoded
642 // search term will be "b".
643 bool ExtractSearchTermsFromURL(const GURL
& url
,
644 const SearchTermsData
& search_terms_data
,
645 base::string16
* search_terms
);
647 // Returns true if non-empty search terms could be extracted from |url| using
648 // ExtractSearchTermsFromURL(). In other words, this returns whether |url|
649 // could be the result of performing a search with |this|.
650 bool IsSearchURL(const GURL
& url
, const SearchTermsData
& search_terms_data
);
652 // Returns true if the specified |url| contains the search terms replacement
653 // key in either the query or the ref. This method does not verify anything
654 // else about the URL. In particular, it does not check that the domain
655 // matches that of this TemplateURL.
656 // TODO(beaudoin): Rename this to reflect that it really checks for an
657 // InstantExtended capable URL.
658 bool HasSearchTermsReplacementKey(const GURL
& url
) const;
660 // Given a |url| corresponding to this TemplateURL, identifies the search
661 // terms and replaces them with the ones in |search_terms_args|, leaving the
662 // other parameters untouched. If the replacement fails, returns false and
663 // leaves |result| untouched. This is used by mobile ports to perform query
665 bool ReplaceSearchTermsInURL(
667 const TemplateURLRef::SearchTermsArgs
& search_terms_args
,
668 const SearchTermsData
& search_terms_data
,
671 // Encodes the search terms from |search_terms_args| so that we know the
672 // |input_encoding|. Returns the |encoded_terms| and the
673 // |encoded_original_query|. |encoded_terms| may be escaped as path or query
674 // depending on |is_in_query|; |encoded_original_query| is always escaped as
676 void EncodeSearchTerms(
677 const TemplateURLRef::SearchTermsArgs
& search_terms_args
,
679 std::string
* input_encoding
,
680 base::string16
* encoded_terms
,
681 base::string16
* encoded_original_query
) const;
683 // Returns the search url for this template URL.
684 // Returns an empty GURL if this template URL has no url().
685 GURL
GenerateSearchURL(const SearchTermsData
& search_terms_data
) const;
688 friend class TemplateURLService
;
689 FRIEND_TEST_ALL_PREFIXES(TemplateURLTest
, ReflectsBookmarkBarPinned
);
691 void CopyFrom(const TemplateURL
& other
);
693 void SetURL(const std::string
& url
);
694 void SetPrepopulateId(int id
);
696 // Resets the keyword if IsGoogleSearchURLWithReplaceableKeyword() or |force|.
697 // The |force| parameter is useful when the existing keyword is known to be
698 // a placeholder. The resulting keyword is generated using
699 // GenerateSearchURL() and GenerateKeyword().
700 void ResetKeywordIfNecessary(const SearchTermsData
& search_terms_data
,
703 // Uses the alternate URLs and the search URL to match the provided |url|
704 // and extract |search_terms| from it as well as the |search_terms_component|
705 // (either REF or QUERY) and |search_terms_component| at which the
706 // |search_terms| are found in |url|. See also ExtractSearchTermsFromURL().
707 bool FindSearchTermsInURL(const GURL
& url
,
708 const SearchTermsData
& search_terms_data
,
709 base::string16
* search_terms
,
710 url::Parsed::ComponentType
* search_terms_component
,
711 url::Component
* search_terms_position
);
713 TemplateURLData data_
;
714 TemplateURLRef url_ref_
;
715 TemplateURLRef suggestions_url_ref_
;
716 TemplateURLRef instant_url_ref_
;
717 TemplateURLRef image_url_ref_
;
718 TemplateURLRef new_tab_url_ref_
;
719 TemplateURLRef contextual_search_url_ref_
;
720 scoped_ptr
<AssociatedExtensionInfo
> extension_info_
;
722 // TODO(sky): Add date last parsed OSD file.
724 DISALLOW_COPY_AND_ASSIGN(TemplateURL
);
727 #endif // COMPONENTS_SEARCH_ENGINES_TEMPLATE_URL_H_