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