diff options
author | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-15 19:54:56 +0000 |
---|---|---|
committer | ben@chromium.org <ben@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-01-15 19:54:56 +0000 |
commit | d82443b8abc227bd9aa383bfc62702cf36c97476 (patch) | |
tree | 2aa9125983c41369ed92ef78837919853145ca2e /chrome/browser/template_url.h | |
parent | 0063a45b4515ead768e917a4f62f8fe96574a02d (diff) | |
download | chromium_src-d82443b8abc227bd9aa383bfc62702cf36c97476.zip chromium_src-d82443b8abc227bd9aa383bfc62702cf36c97476.tar.gz chromium_src-d82443b8abc227bd9aa383bfc62702cf36c97476.tar.bz2 |
Fie.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@8111 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/template_url.h')
-rw-r--r-- | chrome/browser/template_url.h | 436 |
1 files changed, 436 insertions, 0 deletions
diff --git a/chrome/browser/template_url.h b/chrome/browser/template_url.h new file mode 100644 index 0000000..a675eec --- /dev/null +++ b/chrome/browser/template_url.h @@ -0,0 +1,436 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_TEMPLATE_URL_H__ +#define CHROME_BROWSER_TEMPLATE_URL_H__ + +#include <vector> + +#include "base/basictypes.h" +#include "base/time.h" +#include "googleurl/src/gurl.h" + +class TemplateURL; + +// TemplateURL represents the relevant portions of the Open Search Description +// Document (http://www.opensearch.org/Specifications/OpenSearch). +// The main use case for TemplateURL is to use the TemplateURLRef returned by +// suggestions_url or url for keyword/suggestion expansion: +// . suggestions_url describes a URL that is ideal for as you type suggestions. +// The returned results are in the mime type application/x-suggestions+json. +// . url describes a URL that may be used as a shortcut. Returned results are +// are text/html. +// Before using either one, make sure it's non-NULL, and if you intend to use +// it to replace search terms, make sure SupportsReplacement returns true. +// To use either URL invoke the ReplaceSearchTerms method on the corresponding +// TemplateURLRef. +// +// For files parsed from the Web, be sure and invoke IsValid. IsValid returns +// true if the URL could be parsed. +// +// Both TemplateURL and TemplateURLRef have value semantics. This allows the +// UI to create a copy while the user modifies the values. +class TemplateURLRef { + public: + // Magic numbers to pass to ReplaceSearchTerms() for the |accepted_suggestion| + // parameter. Most callers aren't using Suggest capabilities and should just + // pass NO_SUGGESTIONS_AVAILABLE. + // NOTE: Because positive values are meaningful, make sure these are negative! + enum AcceptedSuggestion { + NO_SUGGESTION_CHOSEN = -1, + NO_SUGGESTIONS_AVAILABLE = -2, + }; + + TemplateURLRef(); + + TemplateURLRef(const std::wstring& url, int index_offset, int page_offset) + : url_(url), + index_offset_(index_offset), + page_offset_(page_offset), + parsed_(false), + valid_(false), + supports_replacements_(false) { + } + + // Returns true if this URL supports replacement. + bool SupportsReplacement() const; + + // Returns a string that is the result of replacing the search terms in + // the url with the specified value. + // + // If this TemplateURLRef does not support replacement (SupportsReplacement + // returns false), an empty string is returned. + // + // The TemplateURL is used to determine the input encoding for the term. + GURL ReplaceSearchTerms( + const TemplateURL& host, + const std::wstring& terms, + int accepted_suggestion, + const std::wstring& original_query_for_suggestion) const; + + // Returns the raw URL. None of the parameters will have been replaced. + const std::wstring& url() const { return url_; } + + // Returns the index number of the first search result. + int index_offset() const { return index_offset_; } + + // Returns the page number of the first search results. + int page_offset() const { return page_offset_; } + + // Returns true if the TemplateURLRef is valid. An invalid TemplateURLRef is + // one that contains unknown terms, or invalid characters. + bool IsValid() const; + + // Returns a string representation of this TemplateURLRef suitable for + // display. The display format is the same as the format used by Firefox. + std::wstring DisplayURL() const; + + // Converts a string as returned by DisplayURL back into a string as + // understood by TemplateURLRef. + static std::wstring DisplayURLToURLRef(const std::wstring& display_url); + + // If this TemplateURLRef is valid and contains one search term, this returns + // the host/path of the URL, otherwise this returns an empty string. + const std::string& GetHost() const; + const std::string& GetPath() const; + + // If this TemplateURLRef is valid and contains one search term, this returns + // the key of the search term, otherwise this returns an empty string. + const std::string& GetSearchTermKey() const; + + // Converts the specified term in the encoding of the host TemplateURL to a + // wide string. + std::wstring SearchTermToWide(const TemplateURL& host, + const std::string& term) const; + + // Returns true if this TemplateURLRef has a replacement term of + // {google:baseURL} or {google:baseSuggestURL}. + bool HasGoogleBaseURLs() const; + + private: + friend class TemplateURL; + friend class TemplateURLModelTest; + friend class TemplateURLTest; + + // Enumeration of the known types. + enum ReplacementType { + ENCODING, + GOOGLE_ACCEPTED_SUGGESTION, + GOOGLE_BASE_URL, + GOOGLE_BASE_SUGGEST_URL, + GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION, + GOOGLE_RLZ, + GOOGLE_UNESCAPED_SEARCH_TERMS, + LANGUAGE, + SEARCH_TERMS, + }; + + // Used to identify an element of the raw url that can be replaced. + struct Replacement { + Replacement(ReplacementType type, int index) : type(type), index(index) {} + ReplacementType type; + int index; + }; + + // The list of elements to replace. + typedef std::vector<struct Replacement> Replacements; + + // TemplateURLRef internally caches values to make replacement quick. This + // method invalidates any cached values. + void InvalidateCachedValues() const; + + // Resets the url. + void Set(const std::wstring& url, int index_offset, int page_offset); + + // Parses the parameter in url at the specified offset. start/end specify the + // range of the parameter in the url, including the braces. If the parameter + // is valid, url is updated to reflect the appropriate parameter. If + // the parameter is one of the known parameters an element is added to + // replacements indicating the type and range of the element. + // + // If the parameter is not a known parameter, false is returned. + bool ParseParameter(size_t start, + size_t end, + std::wstring* url, + Replacements* replacements) const; + + // Parses the specified url, replacing parameters as necessary. If + // successful, valid is set to true, and the parsed url is returned. For all + // known parameters that are encountered an entry is added to replacements. + // If there is an error parsing (unknown parameter, or bogus url), valid is + // set to false, and an empty string is returned. + std::wstring ParseURL(const std::wstring& url, + Replacements* replacements, + bool* valid) const; + + // If the url has not yet been parsed, ParseURL is invoked. + // NOTE: While this is const, it modifies parsed_, valid_, parsed_url_ and + // search_offset_. + void ParseIfNecessary() const; + + // Extracts the query key and host from the url. + void ParseHostAndSearchTermKey() const; + + // Returns the value for the GOOGLE_BASE_URL term. + static std::wstring GoogleBaseURLValue(); + + // Returns the value for the GOOGLE_BASE_SUGGEST_URL term. + static std::wstring GoogleBaseSuggestURLValue(); + + // The raw URL. Where as this contains all the terms (such as {searchTerms}), + // parsed_url_ has them all stripped out. + std::wstring url_; + + // indexOffset defined for the Url element. + int index_offset_; + + // searchOffset defined for the Url element. + int page_offset_; + + // Whether the URL has been parsed. + mutable bool parsed_; + + // Whether the url was successfully parsed. + mutable bool valid_; + + // The parsed URL. All terms have been stripped out of this with + // replacements_ giving the index of the terms to replace. + mutable std::wstring parsed_url_; + + // Do we support replacement? + mutable bool supports_replacements_; + + // The replaceable parts of url (parsed_url_). These are ordered by index + // into the string, and may be empty. + mutable Replacements replacements_; + + // Host, path and key of the search term. These are only set if the url + // contains one search term. + mutable std::string host_; + mutable std::string path_; + mutable std::string search_term_key_; + + // For testing. If non-null this is the replacement value for GOOGLE_BASE_URL + // terms. + static std::wstring* google_base_url_; +}; + +// Describes the relevant portions of a single OSD document. +class TemplateURL { + public: + typedef int64 IDType; + + // Describes a single image reference. Each TemplateURL may have + // any number (including 0) of ImageRefs. + // + // If a TemplateURL has no images, the favicon for the generated URL + // should be used. + struct ImageRef { + ImageRef(const std::wstring& type, int width, int height) + : type(type), width(width), height(height) { + } + + ImageRef(const std::wstring& type, int width, int height, const GURL& url) + : type(type), width(width), height(height), url(url) { + } + + // Mime type for the image. + // ICO image will have the format: image/x-icon or image/vnd.microsoft.icon + std::wstring type; + + // Size of the image + int width; + int height; + + // URL of the image. + GURL url; + }; + + // Generates a favicon URL from the specified url. + static GURL GenerateFaviconURL(const GURL& url); + + TemplateURL() + : autogenerate_keyword_(false), + show_in_default_list_(false), + safe_for_autoreplace_(false), + id_(0), + date_created_(base::Time::Now()), + usage_count_(0), + prepopulate_id_(0) {} + ~TemplateURL() {} + + // A short description of the template. This is the name we show to the user + // in various places that use keywords. For example, the location bar shows + // this when the user selects the keyword. + void set_short_name(const std::wstring& short_name) { + short_name_ = short_name; + } + const std::wstring& short_name() const { return short_name_; } + + // A description of the template; this may be empty. + void set_description(const std::wstring& description) { + description_ = description; + } + const std::wstring& description() const { return description_; } + + // URL providing JSON results. This is typically used to provide suggestions + // as your type. If NULL, this url does not support suggestions. + // Be sure and check the resulting TemplateURLRef for SupportsReplacement + // before using. + void SetSuggestionsURL(const std::wstring& suggestions_url, + int index_offset, + int page_offset); + const TemplateURLRef* suggestions_url() const { + if (suggestions_url_.url().empty()) + return NULL; + return &suggestions_url_; + } + + // Parameterized URL for providing the results. This may be NULL. + // Be sure and check the resulting TemplateURLRef for SupportsReplacement + // before using. + void SetURL(const std::wstring& url, int index_offset, int page_offset); + // Returns the TemplateURLRef that may be used for search results. This + // returns NULL if a url element was not specified. + const TemplateURLRef* url() const { + if (url_.url().empty()) + return NULL; + return &url_; + } + + // URL to the OSD file this came from. May be empty. + void set_originating_url(const GURL& url) { + originating_url_ = url; + } + const GURL& originating_url() const { return originating_url_; } + + // The shortcut for this template url. May be empty. + void set_keyword(const std::wstring& keyword); + const std::wstring& keyword() const; + + // Whether to autogenerate a keyword from the url() in GetKeyword(). Most + // consumers should not need this. + // NOTE: Calling set_keyword() turns this back off. Manual and automatic + // keywords are mutually exclusive. + void set_autogenerate_keyword(bool autogenerate_keyword) { + autogenerate_keyword_ = autogenerate_keyword; + if (autogenerate_keyword_) + keyword_.clear(); + } + bool autogenerate_keyword() const { + return autogenerate_keyword_; + } + + // Whether this keyword is shown in the default list of search providers. This + // is just a property and does not indicate whether this TemplateURL has + // a TemplateURLRef that supports replacement. Use ShowInDefaultList to + // test both. + // The default value is false. + void set_show_in_default_list(bool show_in_default_list) { + show_in_default_list_ = show_in_default_list; + } + bool show_in_default_list() const { return show_in_default_list_; } + + // Returns true if show_in_default_list() is true and this TemplateURL has a + // TemplateURLRef that supports replacement. + bool ShowInDefaultList() const; + + // Whether it's safe for auto-modification code (the autogenerator and the + // code that imports data from other browsers) to replace the TemplateURL. + // This should be set to false for any keyword the user edits, or any keyword + // that the user clearly manually edited in the past, like a bookmark keyword + // from another browser. + void set_safe_for_autoreplace(bool safe_for_autoreplace) { + safe_for_autoreplace_ = safe_for_autoreplace; + } + bool safe_for_autoreplace() const { return safe_for_autoreplace_; } + + // Images for this URL. May be empty. + void add_image_ref(const ImageRef& ref) { image_refs_.push_back(ref); } + const std::vector<ImageRef>& image_refs() const { return image_refs_; } + + // Convenience methods for getting/setting an ImageRef that points to a + // favicon. A TemplateURL need not have an ImageRef for a favicon. In such + // a situation GetFavIconURL returns an invalid url. + // + // If url is empty and there is an image ref for a favicon, it is removed. + void SetFavIconURL(const GURL& url); + GURL GetFavIconURL() const; + + // Set of languages supported. This may be empty. + void add_language(const std::wstring& language) { + languages_.push_back(language); + } + const std::vector<std::wstring>& languages() const { return languages_; } + + // Date this keyword was created. + // + // NOTE: this may be 0, which indicates the keyword was created before we + // started tracking creation time. + void set_date_created(base::Time time) { date_created_ = time; } + base::Time date_created() const { return date_created_; } + + // Number of times this keyword has been explicitly used to load a URL. We + // don't increment this for uses as the "default search engine" since that's + // not really "explicit" usage and incrementing would result in pinning the + // user's default search engine(s) to the top of the list of searches on the + // New Tab page, de-emphasizing the omnibox as "where you go to search". + void set_usage_count(int count) { usage_count_ = count; } + int usage_count() const { return usage_count_; } + + // The list of supported encodings for the search terms. This may be empty, + // which indicates the terms should be encoded with UTF-8. + void set_input_encodings(const std::vector<std::string>& encodings) { + input_encodings_ = encodings; + } + void add_input_encoding(const std::string& encoding) { + input_encodings_.push_back(encoding); + } + const std::vector<std::string>& input_encodings() const { + return input_encodings_; + } + + // Returns the unique identifier of this TemplateURL. The unique ID is set + // by the TemplateURLModel when the TemplateURL is added to it. + IDType id() const { return id_; } + + // If this TemplateURL comes from prepopulated data the prepopulate_id is > 0. + void set_prepopulate_id(int id) { prepopulate_id_ = id; } + int prepopulate_id() const { return prepopulate_id_; } + + private: + friend class WebDatabaseTest; + friend class WebDatabase; + friend class TemplateURLModel; + + // Invalidates cached values on this object and its child TemplateURLRefs. + void InvalidateCachedValues() const; + + // Unique identifier, used when archived to the database. + void set_id(IDType id) { id_ = id;} + + std::wstring short_name_; + std::wstring description_; + TemplateURLRef suggestions_url_; + TemplateURLRef url_; + GURL originating_url_; + mutable std::wstring keyword_; + bool autogenerate_keyword_; // If this is set, |keyword_| holds the cached + // generated keyword if available. + bool show_in_default_list_; + bool safe_for_autoreplace_; + std::vector<ImageRef> image_refs_; + std::vector<std::wstring> languages_; + // List of supported input encodings. + std::vector<std::string> input_encodings_; + IDType id_; + base::Time date_created_; + int usage_count_; + int prepopulate_id_; + + // TODO(sky): Add date last parsed OSD file. +}; + +#endif // CHROME_BROWSER_TEMPLATE_URL_PARSER_H__ + |