| OLD | NEW | 
|---|
| 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  Loading... | 
| 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  Loading... | 
| 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  Loading... | 
| 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 | 
| OLD | NEW | 
|---|