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 // Canonicalizer functions for working with and resolving relative URLs. | 5 // Canonicalizer functions for working with and resolving relative URLs. |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "url/url_canon.h" | 8 #include "url/url_canon.h" |
9 #include "url/url_canon_internal.h" | 9 #include "url/url_canon_internal.h" |
10 #include "url/url_file.h" | 10 #include "url/url_file.h" |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 if (url_parse::DoesBeginWindowsDriveSpec(url, begin, url_len) || | 94 if (url_parse::DoesBeginWindowsDriveSpec(url, begin, url_len) || |
95 url_parse::DoesBeginUNCPath(url, begin, url_len, true)) | 95 url_parse::DoesBeginUNCPath(url, begin, url_len, true)) |
96 return true; | 96 return true; |
97 #endif // WIN32 | 97 #endif // WIN32 |
98 | 98 |
99 // See if we've got a scheme, if not, we know this is a relative URL. | 99 // See if we've got a scheme, if not, we know this is a relative URL. |
100 // BUT: Just because we have a scheme, doesn't make it absolute. | 100 // BUT: Just because we have a scheme, doesn't make it absolute. |
101 // "http:foo.html" is a relative URL with path "foo.html". If the scheme is | 101 // "http:foo.html" is a relative URL with path "foo.html". If the scheme is |
102 // empty, we treat it as relative (":foo") like IE does. | 102 // empty, we treat it as relative (":foo") like IE does. |
103 url_parse::Component scheme; | 103 url_parse::Component scheme; |
104 if (!url_parse::ExtractScheme(url, url_len, &scheme) || scheme.len == 0) { | 104 const bool scheme_is_empty = |
105 // Don't allow relative URLs if the base scheme doesn't support it. | 105 !url_parse::ExtractScheme(url, url_len, &scheme) || scheme.len == 0; |
106 if (!is_base_hierarchical) | 106 if (scheme_is_empty) { |
| 107 if (url[begin] == '#') { |
| 108 // |url| is a bare fragement (e.g. "#foo"). This can be resolved against |
| 109 // any base. Fall-through. |
| 110 } else if (!is_base_hierarchical) { |
| 111 // Don't allow relative URLs if the base scheme doesn't support it. |
107 return false; | 112 return false; |
| 113 } |
108 | 114 |
109 *relative_component = url_parse::MakeRange(begin, url_len); | 115 *relative_component = url_parse::MakeRange(begin, url_len); |
110 *is_relative = true; | 116 *is_relative = true; |
111 return true; | 117 return true; |
112 } | 118 } |
113 | 119 |
114 // If the scheme isn't valid, then it's relative. | 120 // If the scheme isn't valid, then it's relative. |
115 int scheme_end = scheme.end(); | 121 int scheme_end = scheme.end(); |
116 for (int i = scheme.begin; i < scheme_end; i++) { | 122 for (int i = scheme.begin; i < scheme_end; i++) { |
117 if (!CanonicalSchemeChar(url[i])) { | 123 if (!CanonicalSchemeChar(url[i])) { |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
547 const url_parse::Component& relative_component, | 553 const url_parse::Component& relative_component, |
548 CharsetConverter* query_converter, | 554 CharsetConverter* query_converter, |
549 CanonOutput* output, | 555 CanonOutput* output, |
550 url_parse::Parsed* out_parsed) { | 556 url_parse::Parsed* out_parsed) { |
551 return DoResolveRelativeURL<base::char16>( | 557 return DoResolveRelativeURL<base::char16>( |
552 base_url, base_parsed, base_is_file, relative_url, | 558 base_url, base_parsed, base_is_file, relative_url, |
553 relative_component, query_converter, output, out_parsed); | 559 relative_component, query_converter, output, out_parsed); |
554 } | 560 } |
555 | 561 |
556 } // namespace url_canon | 562 } // namespace url_canon |
OLD | NEW |