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

Side by Side Diff: url/url_util.cc

Issue 2895953002: Update dangling markup mitigations. (Closed)
Patch Set: Test. Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 "url/url_util.h" 5 #include "url/url_util.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <string.h> 8 #include <string.h>
9 9
10 #include "base/debug/leak_annotations.h" 10 #include "base/debug/leak_annotations.h"
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 178
179 template<typename CHAR> 179 template<typename CHAR>
180 bool DoFindAndCompareScheme(const CHAR* str, 180 bool DoFindAndCompareScheme(const CHAR* str,
181 int str_len, 181 int str_len,
182 const char* compare, 182 const char* compare,
183 Component* found_scheme) { 183 Component* found_scheme) {
184 // Before extracting scheme, canonicalize the URL to remove any whitespace. 184 // Before extracting scheme, canonicalize the URL to remove any whitespace.
185 // This matches the canonicalization done in DoCanonicalize function. 185 // This matches the canonicalization done in DoCanonicalize function.
186 RawCanonOutputT<CHAR> whitespace_buffer; 186 RawCanonOutputT<CHAR> whitespace_buffer;
187 int spec_len; 187 int spec_len;
188 const CHAR* spec = RemoveURLWhitespace(str, str_len, 188 const CHAR* spec =
189 &whitespace_buffer, &spec_len); 189 RemoveURLWhitespace(str, str_len, &whitespace_buffer, &spec_len, nullptr);
190 190
191 Component our_scheme; 191 Component our_scheme;
192 if (!ExtractScheme(spec, spec_len, &our_scheme)) { 192 if (!ExtractScheme(spec, spec_len, &our_scheme)) {
193 // No scheme. 193 // No scheme.
194 if (found_scheme) 194 if (found_scheme)
195 *found_scheme = Component(); 195 *found_scheme = Component();
196 return false; 196 return false;
197 } 197 }
198 if (found_scheme) 198 if (found_scheme)
199 *found_scheme = our_scheme; 199 *found_scheme = our_scheme;
200 return DoCompareSchemeComponent(spec, our_scheme, compare); 200 return DoCompareSchemeComponent(spec, our_scheme, compare);
201 } 201 }
202 202
203 template <typename CHAR> 203 template <typename CHAR>
204 bool DoCanonicalize(const CHAR* spec, 204 bool DoCanonicalize(const CHAR* spec,
205 int spec_len, 205 int spec_len,
206 bool trim_path_end, 206 bool trim_path_end,
207 WhitespaceRemovalPolicy whitespace_policy, 207 WhitespaceRemovalPolicy whitespace_policy,
208 CharsetConverter* charset_converter, 208 CharsetConverter* charset_converter,
209 CanonOutput* output, 209 CanonOutput* output,
210 Parsed* output_parsed) { 210 Parsed* output_parsed) {
211 output->ReserveSizeIfNeeded(spec_len); 211 output->ReserveSizeIfNeeded(spec_len);
212 212
213 // Remove any whitespace from the middle of the relative URL if necessary. 213 // Remove any whitespace from the middle of the relative URL if necessary.
214 // Possibly this will result in copying to the new buffer. 214 // Possibly this will result in copying to the new buffer.
215 RawCanonOutputT<CHAR> whitespace_buffer; 215 RawCanonOutputT<CHAR> whitespace_buffer;
216 if (whitespace_policy == REMOVE_WHITESPACE) { 216 if (whitespace_policy == REMOVE_WHITESPACE) {
217 int original_len = spec_len; 217 spec = RemoveURLWhitespace(spec, spec_len, &whitespace_buffer, &spec_len,
218 spec = 218 &output_parsed->potentially_dangling_markup);
219 RemoveURLWhitespace(spec, original_len, &whitespace_buffer, &spec_len);
220 if (spec_len != original_len)
221 output_parsed->whitespace_removed = true;
222 } 219 }
223 220
224 Parsed parsed_input; 221 Parsed parsed_input;
225 #ifdef WIN32 222 #ifdef WIN32
226 // For Windows, we allow things that look like absolute Windows paths to be 223 // For Windows, we allow things that look like absolute Windows paths to be
227 // fixed up magically to file URLs. This is done for IE compatibility. For 224 // fixed up magically to file URLs. This is done for IE compatibility. For
228 // example, this will change "c:/foo" into a file URL rather than treating 225 // example, this will change "c:/foo" into a file URL rather than treating
229 // it as a URL with the protocol "c". It also works for UNC ("\\foo\bar.txt"). 226 // it as a URL with the protocol "c". It also works for UNC ("\\foo\bar.txt").
230 // There is similar logic in url_canon_relative.cc for 227 // There is similar logic in url_canon_relative.cc for
231 // 228 //
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 const Parsed& base_parsed, 286 const Parsed& base_parsed,
290 const CHAR* in_relative, 287 const CHAR* in_relative,
291 int in_relative_length, 288 int in_relative_length,
292 CharsetConverter* charset_converter, 289 CharsetConverter* charset_converter,
293 CanonOutput* output, 290 CanonOutput* output,
294 Parsed* output_parsed) { 291 Parsed* output_parsed) {
295 // Remove any whitespace from the middle of the relative URL, possibly 292 // Remove any whitespace from the middle of the relative URL, possibly
296 // copying to the new buffer. 293 // copying to the new buffer.
297 RawCanonOutputT<CHAR> whitespace_buffer; 294 RawCanonOutputT<CHAR> whitespace_buffer;
298 int relative_length; 295 int relative_length;
299 const CHAR* relative = RemoveURLWhitespace(in_relative, in_relative_length, 296 const CHAR* relative = RemoveURLWhitespace(
300 &whitespace_buffer, 297 in_relative, in_relative_length, &whitespace_buffer, &relative_length,
301 &relative_length); 298 &output_parsed->potentially_dangling_markup);
302 if (in_relative_length != relative_length)
303 output_parsed->whitespace_removed = true;
304 299
305 bool base_is_authority_based = false; 300 bool base_is_authority_based = false;
306 bool base_is_hierarchical = false; 301 bool base_is_hierarchical = false;
307 if (base_spec && 302 if (base_spec &&
308 base_parsed.scheme.is_nonempty()) { 303 base_parsed.scheme.is_nonempty()) {
309 int after_scheme = base_parsed.scheme.end() + 1; // Skip past the colon. 304 int after_scheme = base_parsed.scheme.end() + 1; // Skip past the colon.
310 int num_slashes = CountConsecutiveSlashes(base_spec, after_scheme, 305 int num_slashes = CountConsecutiveSlashes(base_spec, after_scheme,
311 base_spec_len); 306 base_spec_len);
312 base_is_authority_based = num_slashes > 1; 307 base_is_authority_based = num_slashes > 1;
313 base_is_hierarchical = num_slashes > 0; 308 base_is_hierarchical = num_slashes > 0;
(...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after
856 return DoCompareSchemeComponent(spec, component, compare_to); 851 return DoCompareSchemeComponent(spec, component, compare_to);
857 } 852 }
858 853
859 bool CompareSchemeComponent(const base::char16* spec, 854 bool CompareSchemeComponent(const base::char16* spec,
860 const Component& component, 855 const Component& component,
861 const char* compare_to) { 856 const char* compare_to) {
862 return DoCompareSchemeComponent(spec, component, compare_to); 857 return DoCompareSchemeComponent(spec, component, compare_to);
863 } 858 }
864 859
865 } // namespace url 860 } // namespace url
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698