Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Unified Diff: chrome/browser/search_engines/template_url.cc

Issue 10444117: Escape search terms correctly in the path portion of a custom search engine. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | chrome/browser/search_engines/template_url_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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_;
« no previous file with comments | « no previous file | chrome/browser/search_engines/template_url_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698