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

Unified Diff: url/url_canon_relative.cc

Issue 23526048: Support URL fragment resolution againt non-hierarchical schemes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: clea Created 7 years, 3 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « url/url_canon_pathurl.cc ('k') | url/url_canon_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: url/url_canon_relative.cc
diff --git a/url/url_canon_relative.cc b/url/url_canon_relative.cc
index 30956a633f7b3ee79ca3a74292ec77026c73a609..0abef40ff860b285b6a36d73b988e02db3e709b8 100644
--- a/url/url_canon_relative.cc
+++ b/url/url_canon_relative.cc
@@ -100,11 +100,19 @@ bool DoIsRelativeURL(const char* base,
// BUT: Just because we have a scheme, doesn't make it absolute.
// "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)
+ url_parse::Parsed url_parsed;
+ url_parse::ParsePathURL(url, url_len, &url_parsed);
+ const url_parse::Component& scheme = url_parsed.scheme;
+ const bool scheme_is_empty = !scheme.is_nonempty();
+ if (scheme_is_empty) {
+ // |url| has no scheme. Check the other extreme: is it a bare fragment.
+ bool url_is_ref_only = url_parsed.ref.is_valid() &&
+ url_parsed.CountCharactersBefore(url_parse::Parsed::REF, true) ==
+ url_parsed.CountCharactersBefore(url_parse::Parsed::SCHEME, false);
+ if (!url_is_ref_only && !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;
« no previous file with comments | « url/url_canon_pathurl.cc ('k') | url/url_canon_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698