Index: url/url_canon_relative.cc |
diff --git a/url/url_canon_relative.cc b/url/url_canon_relative.cc |
index 4edd6cedd68beed6d068fee1958ceae40929f1db..33b814c0a998d04a9ac2291d3ac38d7f3b1e667d 100644 |
--- a/url/url_canon_relative.cc |
+++ b/url/url_canon_relative.cc |
@@ -101,10 +101,16 @@ bool DoIsRelativeURL(const char* base, |
// "http:foo.html" is a relative URL with path "foo.html". If the scheme is |
// empty, we treat it as relative (":foo") like IE does. |
url_parse::Component scheme; |
- if (!url_parse::ExtractScheme(url, url_len, &scheme) || scheme.len == 0) { |
- // Don't allow relative URLs if the base scheme doesn't support it. |
- if (!is_base_hierarchical) |
+ const bool scheme_is_empty = |
+ !url_parse::ExtractScheme(url, url_len, &scheme) || scheme.len == 0; |
+ if (scheme_is_empty) { |
+ if (url[begin] == '#') { |
+ // |url| is a bare fragement (e.g. "#foo"). This can be resolved against |
+ // any base. Fall-through. |
+ } else if (!is_base_hierarchical) { |
+ // Don't allow relative URLs if the base scheme doesn't support it. |
return false; |
+ } |
*relative_component = url_parse::MakeRange(begin, url_len); |
*is_relative = true; |