172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector>
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/gtest_prod_util.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/time.h"
14513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/browser/search_engines/search_engine_type.h"
153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/browser/search_engines/template_url_id.h"
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "googleurl/src/gurl.h"
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18513209b27ff55e2841eac0e4120199c23acce758Ben Murdochclass PrefService;
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass SearchTermsData;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURL;
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass WebDataService;
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickstruct WDKeywordsResult;
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURL represents the relevant portions of the Open Search Description
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Document (http://www.opensearch.org/Specifications/OpenSearch).
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The main use case for TemplateURL is to use the TemplateURLRef returned by
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// suggestions_url or url for keyword/suggestion expansion:
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . suggestions_url describes a URL that is ideal for as you type suggestions.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   The returned results are in the mime type application/x-suggestions+json.
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// . url describes a URL that may be used as a shortcut. Returned results are
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//   are text/html.
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Before using either one, make sure it's non-NULL, and if you intend to use
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// it to replace search terms, make sure SupportsReplacement returns true.
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// To use either URL invoke the ReplaceSearchTerms method on the corresponding
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// TemplateURLRef.
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// For files parsed from the Web, be sure and invoke IsValid. IsValid returns
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// true if the URL could be parsed.
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Both TemplateURL and TemplateURLRef have value semantics. This allows the
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// UI to create a copy while the user modifies the values.
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURLRef {
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Magic numbers to pass to ReplaceSearchTerms() for the |accepted_suggestion|
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parameter.  Most callers aren't using Suggest capabilities and should just
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // pass NO_SUGGESTIONS_AVAILABLE.
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: Because positive values are meaningful, make sure these are negative!
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum AcceptedSuggestion {
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NO_SUGGESTION_CHOSEN = -1,
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    NO_SUGGESTIONS_AVAILABLE = -2,
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLRef();
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
553345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURLRef(const std::string& url, int index_offset, int page_offset);
563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~TemplateURLRef();
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if this URL supports replacement.
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool SupportsReplacement() const;
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Like SupportsReplacement but usable on threads other than the UI thread.
633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool SupportsReplacementUsingTermsData(
643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data) const;
653345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a string that is the result of replacing the search terms in
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the url with the specified value.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this TemplateURLRef does not support replacement (SupportsReplacement
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returns false), an empty string is returned.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The TemplateURL is used to determine the input encoding for the term.
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ReplaceSearchTerms(
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      const TemplateURL& host,
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& terms,
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      int accepted_suggestion,
7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& original_query_for_suggestion) const;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Just like ReplaceSearchTerms except that it takes SearchTermsData to supply
803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the data for some search terms. Most of the time ReplaceSearchTerms should
813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // be called.
823345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  std::string ReplaceSearchTermsUsingTermsData(
833345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const TemplateURL& host,
8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& terms,
853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      int accepted_suggestion,
8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      const string16& original_query_for_suggestion,
873345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data) const;
883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the raw URL. None of the parameters will have been replaced.
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& url() const { return url_; }
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the index number of the first search result.
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index_offset() const { return index_offset_; }
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the page number of the first search results.
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int page_offset() const { return page_offset_; }
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if the TemplateURLRef is valid. An invalid TemplateURLRef is
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // one that contains unknown terms, or invalid characters.
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsValid() const;
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1023345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Like IsValid but usable on threads other than the UI thread.
1033345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool IsValidUsingTermsData(const SearchTermsData& search_terms_data) const;
1043345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns a string representation of this TemplateURLRef suitable for
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // display. The display format is the same as the format used by Firefox.
10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 DisplayURL() const;
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts a string as returned by DisplayURL back into a string as
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // understood by TemplateURLRef.
11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  static std::string DisplayURLToURLRef(const string16& display_url);
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this TemplateURLRef is valid and contains one search term, this returns
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the host/path of the URL, otherwise this returns an empty string.
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& GetHost() const;
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& GetPath() const;
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this TemplateURLRef is valid and contains one search term, this returns
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the key of the search term, otherwise this returns an empty string.
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::string& GetSearchTermKey() const;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Converts the specified term in the encoding of the host TemplateURL to a
12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // string16.
12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 SearchTermToString16(const TemplateURL& host,
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                const std::string& term) const;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if this TemplateURLRef has a replacement term of
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // {google:baseURL} or {google:baseSuggestURL}.
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool HasGoogleBaseURLs() const;
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns true if both refs are NULL or have the same values.
132731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  static bool SameUrlRefs(const TemplateURLRef* ref1,
133731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick                          const TemplateURLRef* ref2);
134731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Collects metrics whether searches through Google are sent with RLZ string.
13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void CollectRLZMetrics() const;
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
1393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class SearchHostToURLsMapTest;
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class TemplateURL;
1413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class TemplateURLModelTestUtil;
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  friend class TemplateURLTest;
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseParameterKnown);
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseParameterUnknown);
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLEmpty);
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNoTemplateEnd);
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNoKnownParameters);
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLTwoParameters);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FRIEND_TEST_ALL_PREFIXES(TemplateURLTest, ParseURLNestedParameter);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Enumeration of the known types.
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum ReplacementType {
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ENCODING,
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_ACCEPTED_SUGGESTION,
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_BASE_URL,
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_BASE_SUGGEST_URL,
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION,
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_RLZ,
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GOOGLE_UNESCAPED_SEARCH_TERMS,
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    LANGUAGE,
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    SEARCH_TERMS,
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Used to identify an element of the raw url that can be replaced.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct Replacement {
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    Replacement(ReplacementType type, size_t index)
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : type(type), index(index) {}
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ReplacementType type;
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    size_t index;
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The list of elements to replace.
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  typedef std::vector<struct Replacement> Replacements;
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TemplateURLRef internally caches values to make replacement quick. This
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // method invalidates any cached values.
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InvalidateCachedValues() const;
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Resets the url.
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Set(const std::string& url, int index_offset, int page_offset);
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parses the parameter in url at the specified offset. start/end specify the
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // range of the parameter in the url, including the braces. If the parameter
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is valid, url is updated to reflect the appropriate parameter. If
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the parameter is one of the known parameters an element is added to
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replacements indicating the type and range of the element. The original
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parameter is erased from the url.
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the parameter is not a known parameter, it's not erased and false is
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returned.
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ParseParameter(size_t start,
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      size_t end,
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      std::string* url,
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                      Replacements* replacements) const;
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parses the specified url, replacing parameters as necessary. If
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // successful, valid is set to true, and the parsed url is returned. For all
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // known parameters that are encountered an entry is added to replacements.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If there is an error parsing the url, valid is set to false, and an empty
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // string is returned.
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string ParseURL(const std::string& url,
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       Replacements* replacements,
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       bool* valid) const;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If the url has not yet been parsed, ParseURL is invoked.
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: While this is const, it modifies parsed_, valid_, parsed_url_ and
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // search_offset_.
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ParseIfNecessary() const;
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Like ParseIfNecessary but usable on threads other than the UI thread.
2113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ParseIfNecessaryUsingTermsData(
2123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data) const;
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Extracts the query key and host from the url.
2153345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void ParseHostAndSearchTermKey(
2163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data) const;
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Used by tests to set the value for the Google base url. This takes
2193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // ownership of the given std::string.
2203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static void SetGoogleBaseURL(std::string* google_base_url);
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The raw URL. Where as this contains all the terms (such as {searchTerms}),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // parsed_url_ has them all stripped out.
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string url_;
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // indexOffset defined for the Url element.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int index_offset_;
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // searchOffset defined for the Url element.
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int page_offset_;
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the URL has been parsed.
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable bool parsed_;
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether the url was successfully parsed.
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable bool valid_;
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The parsed URL. All terms have been stripped out of this with
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replacements_ giving the index of the terms to replace.
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable std::string parsed_url_;
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Do we support replacement?
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable bool supports_replacements_;
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The replaceable parts of url (parsed_url_). These are ordered by index
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // into the string, and may be empty.
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable Replacements replacements_;
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Host, path and key of the search term. These are only set if the url
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // contains one search term.
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable std::string host_;
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable std::string path_;
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable std::string search_term_key_;
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Describes the relevant portions of a single OSD document.
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass TemplateURL {
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Describes a single image reference. Each TemplateURL may have
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // any number (including 0) of ImageRefs.
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If a TemplateURL has no images, the favicon for the generated URL
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // should be used.
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  struct ImageRef {
26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ImageRef(const std::string& type, int width, int height)
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        : type(type), width(width), height(height) {
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
26972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    ImageRef(const std::string& type, int width, int height, const GURL& url)
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      : type(type), width(width), height(height), url(url) {
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Mime type for the image.
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // ICO image will have the format: image/x-icon or image/vnd.microsoft.icon
27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    std::string type;
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // Size of the image
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int width;
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    int height;
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    // URL of the image.
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    GURL url;
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Generates a favicon URL from the specified url.
286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static GURL GenerateFaviconURL(const GURL& url);
287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2883345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Returns true if |turl| is non-null and has a search URL that supports
289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // replacement.
290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  static bool SupportsReplacement(const TemplateURL* turl);
291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
2923345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Like SupportsReplacement but usable on threads other than the UI thread.
2933345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  static bool SupportsReplacementUsingTermsData(
2943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const TemplateURL* turl,
2953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const SearchTermsData& search_terms_data);
2963345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
2973345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURL();
2983345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  ~TemplateURL();
299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A short description of the template. This is the name we show to the user
301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // in various places that use keywords. For example, the location bar shows
302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // this when the user selects the keyword.
30372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void set_short_name(const string16& short_name) {
304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    short_name_ = short_name;
305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
30672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 short_name() const { return short_name_; }
307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // An accessor for the short_name, but adjusted so it can be appropriately
309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // displayed even if it is LTR and the UI is RTL.
31072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 AdjustedShortNameForLocaleDirection() const;
311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
312c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // A description of the template; this may be empty.
31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void set_description(const string16& description) {
314c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    description_ = description;
315c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 description() const { return description_; }
317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL providing JSON results. This is typically used to provide suggestions
319c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // as your type. If NULL, this url does not support suggestions.
320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Be sure and check the resulting TemplateURLRef for SupportsReplacement
321c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // before using.
322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetSuggestionsURL(const std::string& suggestions_url,
323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         int index_offset,
324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                         int page_offset);
325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TemplateURLRef* suggestions_url() const {
326731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return suggestions_url_.url().empty() ? NULL : &suggestions_url_;
327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Parameterized URL for providing the results. This may be NULL.
330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Be sure and check the resulting TemplateURLRef for SupportsReplacement
331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // before using.
332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void SetURL(const std::string& url, int index_offset, int page_offset);
333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the TemplateURLRef that may be used for search results. This
334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // returns NULL if a url element was not specified.
335c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const TemplateURLRef* url() const {
336731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return url_.url().empty() ? NULL : &url_;
337731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  }
338731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick
339731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Parameterized URL for instant results. This may be NULL.  Be sure and check
340731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // the resulting TemplateURLRef for SupportsReplacement before using. See
341731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // TemplateURLRef for a description of |index_offset| and |page_offset|.
342731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  void SetInstantURL(const std::string& url, int index_offset, int page_offset);
343731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // Returns the TemplateURLRef that may be used for search results. This
344731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  // returns NULL if a url element was not specified.
345731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  const TemplateURLRef* instant_url() const {
346731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick    return instant_url_.url().empty() ? NULL : &instant_url_;
347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // URL to the OSD file this came from. May be empty.
350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_originating_url(const GURL& url) {
351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    originating_url_ = url;
352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const GURL& originating_url() const { return originating_url_; }
354c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The shortcut for this template url. May be empty.
35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void set_keyword(const string16& keyword);
35772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 keyword() const;
358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether to autogenerate a keyword from the url() in GetKeyword().  Most
360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // consumers should not need this.
361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: Calling set_keyword() turns this back off.  Manual and automatic
362c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // keywords are mutually exclusive.
363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_autogenerate_keyword(bool autogenerate_keyword) {
364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    autogenerate_keyword_ = autogenerate_keyword;
365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    if (autogenerate_keyword_) {
366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      keyword_.clear();
367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      keyword_generated_ = false;
368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool autogenerate_keyword() const {
371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return autogenerate_keyword_;
372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
3743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Ensures that the keyword is generated.  Most consumers should not need this
3753345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // because it is done automatically.  Use this method on the UI thread, so
3763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // the keyword may be accessed on another thread.
3773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void EnsureKeyword() const;
3783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether this keyword is shown in the default list of search providers. This
380c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // is just a property and does not indicate whether this TemplateURL has
381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // a TemplateURLRef that supports replacement. Use ShowInDefaultList to
382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // test both.
383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The default value is false.
384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_show_in_default_list(bool show_in_default_list) {
385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    show_in_default_list_ = show_in_default_list;
386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool show_in_default_list() const { return show_in_default_list_; }
388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns true if show_in_default_list() is true and this TemplateURL has a
390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TemplateURLRef that supports replacement.
391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool ShowInDefaultList() const;
392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Whether it's safe for auto-modification code (the autogenerator and the
394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // code that imports data from other browsers) to replace the TemplateURL.
395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // This should be set to false for any keyword the user edits, or any keyword
396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // that the user clearly manually edited in the past, like a bookmark keyword
397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // from another browser.
398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_safe_for_autoreplace(bool safe_for_autoreplace) {
399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    safe_for_autoreplace_ = safe_for_autoreplace;
400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
401c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool safe_for_autoreplace() const { return safe_for_autoreplace_; }
402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Images for this URL. May be empty.
404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void add_image_ref(const ImageRef& ref) { image_refs_.push_back(ref); }
405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::vector<ImageRef>& image_refs() const { return image_refs_; }
406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Convenience methods for getting/setting an ImageRef that points to a
408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // favicon. A TemplateURL need not have an ImageRef for a favicon. In such
409ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // a situation GetFaviconURL returns an invalid url.
410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If url is empty and there is an image ref for a favicon, it is removed.
412ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void SetFaviconURL(const GURL& url);
413ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  GURL GetFaviconURL() const;
414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
415c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Set of languages supported. This may be empty.
41672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  void add_language(const string16& language) {
417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    languages_.push_back(language);
418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
41972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<string16> languages() const { return languages_; }
420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Date this keyword was created.
422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  //
423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NOTE: this may be 0, which indicates the keyword was created before we
424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // started tracking creation time.
425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_date_created(base::Time time) { date_created_ = time; }
426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time date_created() const { return date_created_; }
427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // True if this TemplateURL was automatically created by the administrator via
4293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // group policy.
4303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_created_by_policy(bool created_by_policy) {
4313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick     created_by_policy_ = created_by_policy;
4323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool created_by_policy() const { return created_by_policy_; }
4343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Number of times this keyword has been explicitly used to load a URL.  We
436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // don't increment this for uses as the "default search engine" since that's
437c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // not really "explicit" usage and incrementing would result in pinning the
438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // user's default search engine(s) to the top of the list of searches on the
439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // New Tab page, de-emphasizing the omnibox as "where you go to search".
440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_usage_count(int count) { usage_count_ = count; }
441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int usage_count() const { return usage_count_; }
442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // The list of supported encodings for the search terms. This may be empty,
444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // which indicates the terms should be encoded with UTF-8.
445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_input_encodings(const std::vector<std::string>& encodings) {
446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_encodings_ = encodings;
447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
448c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void add_input_encoding(const std::string& encoding) {
449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    input_encodings_.push_back(encoding);
450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const std::vector<std::string>& input_encodings() const {
452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return input_encodings_;
453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
455513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  void set_search_engine_type(SearchEngineType search_engine_type) {
4563345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    search_engine_type_ = search_engine_type;
4573345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
458513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SearchEngineType search_engine_type() const {
4593345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return search_engine_type_;
4603345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
4613345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
4623345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  void set_logo_id(int logo_id) { logo_id_ = logo_id; }
4633345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int logo_id() const { return logo_id_; }
4643345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Returns the unique identifier of this TemplateURL. The unique ID is set
466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // by the TemplateURLModel when the TemplateURL is added to it.
4673345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURLID id() const { return id_; }
468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
469c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // If this TemplateURL comes from prepopulated data the prepopulate_id is > 0.
470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void set_prepopulate_id(int id) { prepopulate_id_ = id; }
471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int prepopulate_id() const { return prepopulate_id_; }
472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string GetExtensionId() const;
474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool IsExtensionKeyword() const;
475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
4773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend void MergeEnginesFromPrepopulateData(
4783345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      PrefService* prefs,
4793345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      WebDataService* service,
4803345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      std::vector<TemplateURL*>* template_urls,
4813345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      const TemplateURL** default_search_provider);
482ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class KeywordTable;
483ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  friend class KeywordTableTest;
4843345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class SearchHostToURLsMap;
4853345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  friend class TemplateURLModel;
486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Invalidates cached values on this object and its child TemplateURLRefs.
488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void InvalidateCachedValues() const;
489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Unique identifier, used when archived to the database.
491ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  void set_id(TemplateURLID id) { id_ = id; }
492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
49372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 short_name_;
49472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  string16 description_;
495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLRef suggestions_url_;
496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  TemplateURLRef url_;
497731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  TemplateURLRef instant_url_;
498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GURL originating_url_;
49972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  mutable string16 keyword_;
500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool autogenerate_keyword_;  // If this is set, |keyword_| holds the cached
501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                               // generated keyword if available.
502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  mutable bool keyword_generated_;  // True if the keyword was generated. This
503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    // is used to avoid multiple attempts if
504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    // generating a keyword failed.
505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool show_in_default_list_;
506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool safe_for_autoreplace_;
507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<ImageRef> image_refs_;
50872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  std::vector<string16> languages_;
509c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // List of supported input encodings.
510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::vector<std::string> input_encodings_;
5113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TemplateURLID id_;
512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  base::Time date_created_;
5133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  bool created_by_policy_;
514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int usage_count_;
515513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  SearchEngineType search_engine_type_;
5163345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int logo_id_;
517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int prepopulate_id_;
518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // TODO(sky): Add date last parsed OSD file.
520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_SEARCH_ENGINES_TEMPLATE_URL_H_
523