| OLD | NEW |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/search_engines/template_url.h" | 5 #include "chrome/browser/search_engines/template_url.h" |
| 6 | 6 |
| 7 #include "app/gfx/favicon_size.h" | 7 #include "app/gfx/favicon_size.h" |
| 8 #include "app/l10n_util.h" | 8 #include "app/l10n_util.h" |
| 9 #include "base/i18n/icu_string_conversions.h" | 9 #include "base/i18n/icu_string_conversions.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 Replacements* replacements) const { | 90 Replacements* replacements) const { |
| 91 DCHECK(start != std::string::npos && | 91 DCHECK(start != std::string::npos && |
| 92 end != std::string::npos && end > start); | 92 end != std::string::npos && end > start); |
| 93 size_t length = end - start - 1; | 93 size_t length = end - start - 1; |
| 94 bool optional = false; | 94 bool optional = false; |
| 95 if ((*url)[end - 1] == kOptional) { | 95 if ((*url)[end - 1] == kOptional) { |
| 96 optional = true; | 96 optional = true; |
| 97 length--; | 97 length--; |
| 98 } | 98 } |
| 99 std::wstring parameter(url->substr(start + 1, length)); | 99 std::wstring parameter(url->substr(start + 1, length)); |
| 100 std::wstring full_parameter(url->substr(start, end - start + 1)); |
| 100 // Remove the parameter from the string. | 101 // Remove the parameter from the string. |
| 101 url->erase(start, end - start + 1); | 102 url->erase(start, end - start + 1); |
| 102 if (parameter == kSearchTermsParameter) { | 103 if (parameter == kSearchTermsParameter) { |
| 103 replacements->push_back(Replacement(SEARCH_TERMS, static_cast<int>(start))); | 104 replacements->push_back(Replacement(SEARCH_TERMS, static_cast<int>(start))); |
| 104 } else if (parameter == kCountParameter) { | 105 } else if (parameter == kCountParameter) { |
| 105 if (!optional) | 106 if (!optional) |
| 106 url->insert(start, kDefaultCount); | 107 url->insert(start, kDefaultCount); |
| 107 } else if (parameter == kStartIndexParameter) { | 108 } else if (parameter == kStartIndexParameter) { |
| 108 if (!optional) { | 109 if (!optional) { |
| 109 url->insert(start, IntToWString(index_offset_)); | 110 url->insert(start, IntToWString(index_offset_)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 130 replacements->push_back(Replacement(GOOGLE_BASE_SUGGEST_URL, | 131 replacements->push_back(Replacement(GOOGLE_BASE_SUGGEST_URL, |
| 131 static_cast<int>(start))); | 132 static_cast<int>(start))); |
| 132 } else if (parameter == kGoogleOriginalQueryForSuggestionParameter) { | 133 } else if (parameter == kGoogleOriginalQueryForSuggestionParameter) { |
| 133 replacements->push_back(Replacement(GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION, | 134 replacements->push_back(Replacement(GOOGLE_ORIGINAL_QUERY_FOR_SUGGESTION, |
| 134 static_cast<int>(start))); | 135 static_cast<int>(start))); |
| 135 } else if (parameter == kGoogleRLZParameter) { | 136 } else if (parameter == kGoogleRLZParameter) { |
| 136 replacements->push_back(Replacement(GOOGLE_RLZ, static_cast<int>(start))); | 137 replacements->push_back(Replacement(GOOGLE_RLZ, static_cast<int>(start))); |
| 137 } else if (parameter == kGoogleUnescapedSearchTermsParameter) { | 138 } else if (parameter == kGoogleUnescapedSearchTermsParameter) { |
| 138 replacements->push_back(Replacement(GOOGLE_UNESCAPED_SEARCH_TERMS, | 139 replacements->push_back(Replacement(GOOGLE_UNESCAPED_SEARCH_TERMS, |
| 139 static_cast<int>(start))); | 140 static_cast<int>(start))); |
| 140 } else if (!optional) { | 141 } else { |
| 141 // Unknown required parameter. No idea what to replace this with, | 142 // It can be some garbage but can also be a javascript block. Put it back. |
| 142 // so fail. | 143 url->insert(start, full_parameter); |
| 143 return false; | 144 return false; |
| 144 } | 145 } |
| 145 return true; | 146 return true; |
| 146 } | 147 } |
| 147 | 148 |
| 148 std::wstring TemplateURLRef::ParseURL(const std::wstring& url, | 149 std::wstring TemplateURLRef::ParseURL(const std::wstring& url, |
| 149 Replacements* replacements, | 150 Replacements* replacements, |
| 150 bool* valid) const { | 151 bool* valid) const { |
| 151 *valid = false; | 152 *valid = false; |
| 152 std::wstring parsed_url = url; | 153 std::wstring parsed_url = url; |
| 153 for (size_t last = 0; last != std::string::npos; ) { | 154 for (size_t last = 0; last != std::string::npos; ) { |
| 154 last = parsed_url.find(kStartParameter, last); | 155 last = parsed_url.find(kStartParameter, last); |
| 155 if (last != std::string::npos) { | 156 if (last != std::string::npos) { |
| 156 size_t endTemplate = parsed_url.find(kEndParameter, last); | 157 size_t template_end = parsed_url.find(kEndParameter, last); |
| 157 if (endTemplate != std::string::npos) { | 158 if (template_end != std::string::npos) { |
| 158 if (!ParseParameter(last, endTemplate, &parsed_url, replacements)) { | 159 // Since we allow Javascript in the URL, {} pairs could be nested. Match |
| 159 // Not a valid parameter, return. | 160 // only leaf pairs with supported parameters. |
| 160 return std::wstring(); | 161 size_t next_template_start = parsed_url.find(kStartParameter, last + 1); |
| 162 if (next_template_start == std::string::npos || |
| 163 next_template_start > template_end) { |
| 164 // If successful, ParseParameter erases from the string as such no |
| 165 // need to update |last|. If failed, move |last| to the end of pair. |
| 166 if (!ParseParameter(last, template_end, &parsed_url, replacements)) { |
| 167 // |template_end| + 1 may be beyond the end of the string. |
| 168 last = template_end; |
| 169 } |
| 170 } else { |
| 171 last = next_template_start; |
| 161 } | 172 } |
| 162 // ParseParamter erases from the string, as such we don't need | |
| 163 // to update last. | |
| 164 } else { | 173 } else { |
| 165 // Open brace without a closing brace, return. | 174 // Open brace without a closing brace, return. |
| 166 return std::wstring(); | 175 return std::wstring(); |
| 167 } | 176 } |
| 168 } | 177 } |
| 169 } | 178 } |
| 170 *valid = true; | 179 *valid = true; |
| 171 return parsed_url; | 180 return parsed_url; |
| 172 } | 181 } |
| 173 | 182 |
| (...skipping 423 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 597 } | 606 } |
| 598 return GURL(); | 607 return GURL(); |
| 599 } | 608 } |
| 600 | 609 |
| 601 void TemplateURL::InvalidateCachedValues() const { | 610 void TemplateURL::InvalidateCachedValues() const { |
| 602 url_.InvalidateCachedValues(); | 611 url_.InvalidateCachedValues(); |
| 603 suggestions_url_.InvalidateCachedValues(); | 612 suggestions_url_.InvalidateCachedValues(); |
| 604 if (autogenerate_keyword_) | 613 if (autogenerate_keyword_) |
| 605 keyword_.clear(); | 614 keyword_.clear(); |
| 606 } | 615 } |
| OLD | NEW |