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 |