| Index: chrome/browser/search_engines/template_url.cc
|
| ===================================================================
|
| --- chrome/browser/search_engines/template_url.cc (revision 139570)
|
| +++ chrome/browser/search_engines/template_url.cc (working copy)
|
| @@ -21,61 +21,91 @@
|
| #include "net/base/escape.h"
|
| #include "ui/base/l10n/l10n_util.h"
|
|
|
| +namespace {
|
| +
|
| // The TemplateURLRef has any number of terms that need to be replaced. Each of
|
| // the terms is enclosed in braces. If the character preceeding the final
|
| // brace is a ?, it indicates the term is optional and can be replaced with
|
| // an empty string.
|
| -static const char kStartParameter = '{';
|
| -static const char kEndParameter = '}';
|
| -static const char kOptional = '?';
|
| +const char kStartParameter = '{';
|
| +const char kEndParameter = '}';
|
| +const char kOptional = '?';
|
|
|
| // Known parameters found in the URL.
|
| -static const char kSearchTermsParameter[] = "searchTerms";
|
| -static const char kSearchTermsParameterFull[] = "{searchTerms}";
|
| -static const char kCountParameter[] = "count";
|
| -static const char kStartIndexParameter[] = "startIndex";
|
| -static const char kStartPageParameter[] = "startPage";
|
| -static const char kLanguageParameter[] = "language";
|
| -static const char kInputEncodingParameter[] = "inputEncoding";
|
| -static const char kOutputEncodingParameter[] = "outputEncoding";
|
| +const char kSearchTermsParameter[] = "searchTerms";
|
| +const char kSearchTermsParameterFull[] = "{searchTerms}";
|
| +const char kCountParameter[] = "count";
|
| +const char kStartIndexParameter[] = "startIndex";
|
| +const char kStartPageParameter[] = "startPage";
|
| +const char kLanguageParameter[] = "language";
|
| +const char kInputEncodingParameter[] = "inputEncoding";
|
| +const char kOutputEncodingParameter[] = "outputEncoding";
|
|
|
| -static const char kGoogleAcceptedSuggestionParameter[] =
|
| - "google:acceptedSuggestion";
|
| +const char kGoogleAcceptedSuggestionParameter[] = "google:acceptedSuggestion";
|
| // Host/Domain Google searches are relative to.
|
| -static const char kGoogleBaseURLParameter[] = "google:baseURL";
|
| -static const char kGoogleBaseURLParameterFull[] = "{google:baseURL}";
|
| +const char kGoogleBaseURLParameter[] = "google:baseURL";
|
| +const char kGoogleBaseURLParameterFull[] = "{google:baseURL}";
|
| // Like google:baseURL, but for the Search Suggest capability.
|
| -static const char kGoogleBaseSuggestURLParameter[] =
|
| - "google:baseSuggestURL";
|
| -static const char kGoogleBaseSuggestURLParameterFull[] =
|
| - "{google:baseSuggestURL}";
|
| -static const char kGoogleInstantEnabledParameter[] =
|
| - "google:instantEnabledParameter";
|
| -static const char kGoogleOriginalQueryForSuggestionParameter[] =
|
| +const char kGoogleBaseSuggestURLParameter[] = "google:baseSuggestURL";
|
| +const char kGoogleBaseSuggestURLParameterFull[] = "{google:baseSuggestURL}";
|
| +const char kGoogleInstantEnabledParameter[] = "google:instantEnabledParameter";
|
| +const char kGoogleOriginalQueryForSuggestionParameter[] =
|
| "google:originalQueryForSuggestion";
|
| -static const char kGoogleRLZParameter[] = "google:RLZ";
|
| +const char kGoogleRLZParameter[] = "google:RLZ";
|
| // Same as kSearchTermsParameter, with no escaping.
|
| -static const char kGoogleSearchFieldtrialParameter[] =
|
| +const char kGoogleSearchFieldtrialParameter[] =
|
| "google:searchFieldtrialParameter";
|
| -static const char kGoogleUnescapedSearchTermsParameter[] =
|
| +const char kGoogleUnescapedSearchTermsParameter[] =
|
| "google:unescapedSearchTerms";
|
| -static const char kGoogleUnescapedSearchTermsParameterFull[] =
|
| +const char kGoogleUnescapedSearchTermsParameterFull[] =
|
| "{google:unescapedSearchTerms}";
|
|
|
| // Display value for kSearchTermsParameter.
|
| -static const char kDisplaySearchTerms[] = "%s";
|
| +const char kDisplaySearchTerms[] = "%s";
|
|
|
| // Display value for kGoogleUnescapedSearchTermsParameter.
|
| -static const char kDisplayUnescapedSearchTerms[] = "%S";
|
| +const char kDisplayUnescapedSearchTerms[] = "%S";
|
|
|
| // Used if the count parameter is not optional. Indicates we want 10 search
|
| // results.
|
| -static const char kDefaultCount[] = "10";
|
| +const char kDefaultCount[] = "10";
|
|
|
| // Used if the parameter kOutputEncodingParameter is required.
|
| -static const char kOutputEncodingType[] = "UTF-8";
|
| +const char kOutputEncodingType[] = "UTF-8";
|
|
|
| +// Attempts to encode |terms| and |original_query| in |encoding| and escape
|
| +// them. |terms| may be escaped as path or query depending on |is_in_query|;
|
| +// |original_query| is always escaped as query. Returns whether the encoding
|
| +// process succeeded.
|
| +bool TryEncoding(const string16& terms,
|
| + const string16& original_query,
|
| + const char* encoding,
|
| + bool is_in_query,
|
| + string16* escaped_terms,
|
| + string16* escaped_original_query) {
|
| + DCHECK(escaped_terms);
|
| + DCHECK(escaped_original_query);
|
| + std::string encoded_terms;
|
| + if (!base::UTF16ToCodepage(terms, encoding,
|
| + base::OnStringConversionError::SKIP, &encoded_terms))
|
| + return false;
|
| + *escaped_terms = UTF8ToUTF16(is_in_query ?
|
| + net::EscapeQueryParamValue(encoded_terms, true) :
|
| + net::EscapePath(encoded_terms));
|
| + if (original_query.empty())
|
| + return true;
|
| + std::string encoded_original_query;
|
| + if (!base::UTF16ToCodepage(original_query, encoding,
|
| + base::OnStringConversionError::SKIP, &encoded_original_query))
|
| + return false;
|
| + *escaped_original_query =
|
| + UTF8ToUTF16(net::EscapeQueryParamValue(encoded_original_query, true));
|
| + return true;
|
| +}
|
|
|
| +} // namespace
|
| +
|
| +
|
| // TemplateURLRef -------------------------------------------------------------
|
|
|
| TemplateURLRef::TemplateURLRef(TemplateURL* owner, Type type)
|
| @@ -152,23 +182,18 @@
|
| for (std::vector<std::string>::const_iterator i(
|
| owner_->input_encodings().begin());
|
| i != owner_->input_encodings().end(); ++i) {
|
| - if (net::EscapeQueryParamValue(terms, i->c_str(), is_in_query,
|
| - &encoded_terms)) {
|
| - if (is_in_query && !original_query_for_suggestion.empty()) {
|
| - net::EscapeQueryParamValue(original_query_for_suggestion, i->c_str(),
|
| - true, &encoded_original_query);
|
| - }
|
| + if (TryEncoding(terms, original_query_for_suggestion, i->c_str(),
|
| + is_in_query, &encoded_terms, &encoded_original_query)) {
|
| input_encoding = *i;
|
| break;
|
| }
|
| }
|
| if (input_encoding.empty()) {
|
| - encoded_terms = net::EscapeQueryParamValueUTF8(terms, is_in_query);
|
| - if (is_in_query && !original_query_for_suggestion.empty()) {
|
| - encoded_original_query =
|
| - net::EscapeQueryParamValueUTF8(original_query_for_suggestion, true);
|
| - }
|
| input_encoding = "UTF-8";
|
| + if (!TryEncoding(terms, original_query_for_suggestion,
|
| + input_encoding.c_str(), is_in_query, &encoded_terms,
|
| + &encoded_original_query))
|
| + NOTREACHED();
|
| }
|
|
|
| std::string url = parsed_url_;
|
|
|