diff options
author | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-21 09:58:47 +0000 |
---|---|---|
committer | avayvod@chromium.org <avayvod@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-01-21 09:58:47 +0000 |
commit | 81c6ef6f1ef71822b08703962f5b260d00f734e2 (patch) | |
tree | 8ec1b964b6aa6b08ae586830c3a4b1833a699615 /chrome/browser/search_engines/template_url.cc | |
parent | 6b9540882ccacb7f9a41f84f2e8fb221ec6e1406 (diff) | |
download | chromium_src-81c6ef6f1ef71822b08703962f5b260d00f734e2.zip chromium_src-81c6ef6f1ef71822b08703962f5b260d00f734e2.tar.gz chromium_src-81c6ef6f1ef71822b08703962f5b260d00f734e2.tar.bz2 |
Removed restriction for {} so that javascript blocks can be used in the url.
Added unittests for TemplateURLRef::ParseParameter and TemplateURLRef::ParseURL methods.
BUG=2238
TEST=Try adding urls with different combinations of {}, they all should work.
Review URL: http://codereview.chromium.org/555012
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@36743 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/search_engines/template_url.cc')
-rw-r--r-- | chrome/browser/search_engines/template_url.cc | 29 |
1 files changed, 19 insertions, 10 deletions
diff --git a/chrome/browser/search_engines/template_url.cc b/chrome/browser/search_engines/template_url.cc index 26da6fa..9ff827c 100644 --- a/chrome/browser/search_engines/template_url.cc +++ b/chrome/browser/search_engines/template_url.cc @@ -97,6 +97,7 @@ bool TemplateURLRef::ParseParameter(size_t start, length--; } std::wstring parameter(url->substr(start + 1, length)); + std::wstring full_parameter(url->substr(start, end - start + 1)); // Remove the parameter from the string. url->erase(start, end - start + 1); if (parameter == kSearchTermsParameter) { @@ -137,9 +138,9 @@ bool TemplateURLRef::ParseParameter(size_t start, } else if (parameter == kGoogleUnescapedSearchTermsParameter) { replacements->push_back(Replacement(GOOGLE_UNESCAPED_SEARCH_TERMS, static_cast<int>(start))); - } else if (!optional) { - // Unknown required parameter. No idea what to replace this with, - // so fail. + } else { + // It can be some garbage but can also be a javascript block. Put it back. + url->insert(start, full_parameter); return false; } return true; @@ -153,14 +154,22 @@ std::wstring TemplateURLRef::ParseURL(const std::wstring& url, for (size_t last = 0; last != std::string::npos; ) { last = parsed_url.find(kStartParameter, last); if (last != std::string::npos) { - size_t endTemplate = parsed_url.find(kEndParameter, last); - if (endTemplate != std::string::npos) { - if (!ParseParameter(last, endTemplate, &parsed_url, replacements)) { - // Not a valid parameter, return. - return std::wstring(); + size_t template_end = parsed_url.find(kEndParameter, last); + if (template_end != std::string::npos) { + // Since we allow Javascript in the URL, {} pairs could be nested. Match + // only leaf pairs with supported parameters. + size_t next_template_start = parsed_url.find(kStartParameter, last + 1); + if (next_template_start == std::string::npos || + next_template_start > template_end) { + // If successful, ParseParameter erases from the string as such no + // need to update |last|. If failed, move |last| to the end of pair. + if (!ParseParameter(last, template_end, &parsed_url, replacements)) { + // |template_end| + 1 may be beyond the end of the string. + last = template_end; + } + } else { + last = next_template_start; } - // ParseParamter erases from the string, as such we don't need - // to update last. } else { // Open brace without a closing brace, return. return std::wstring(); |