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

Unified Diff: url/url_canon_relative.cc

Issue 23835019: Support URL fragment resolution againt non-hierarchical schemes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix net & webview tag tests Created 7 years, 2 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
Index: url/url_canon_relative.cc
diff --git a/url/url_canon_relative.cc b/url/url_canon_relative.cc
index 4edd6cedd68beed6d068fee1958ceae40929f1db..8ea9caf485d15edd47a6270f79275e0530af104e 100644
--- a/url/url_canon_relative.cc
+++ b/url/url_canon_relative.cc
@@ -100,11 +100,20 @@ 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) {
+ // No scheme. See if is a bare fragment.
+ if (url_parsed.ref.is_valid() &&
+ url_parsed.CountCharactersBefore(url_parse::Parsed::REF, true) ==
+ url_parsed.CountCharactersBefore(url_parse::Parsed::SCHEME, false)) {
+ // |url| is a bare fragement. This can be resolved against any base.
+ } 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;

Powered by Google App Engine
This is Rietveld 408576698