Index: chrome/browser/net/url_fixer_upper.cc |
diff --git a/chrome/browser/net/url_fixer_upper.cc b/chrome/browser/net/url_fixer_upper.cc |
index 10d930b0fa6c2aeb71860d435f874d0b544d4326..370de2bdff7f10ae78cedb952481aee25289ffc0 100644 |
--- a/chrome/browser/net/url_fixer_upper.cc |
+++ b/chrome/browser/net/url_fixer_upper.cc |
@@ -407,9 +407,9 @@ std::string URLFixerUpper::SegmentURL(const std::string& text, |
} |
// Not segmenting file schemes or nonstandard schemes. |
- if ((scheme == chrome::kFileScheme) || |
- !url_util::IsStandard(scheme.c_str(), |
- url_parse::Component(0, static_cast<int>(scheme.length())))) |
+ if ((scheme != chrome::kAboutScheme) && (scheme != chrome::kChromeUIScheme) && |
+ ((scheme == chrome::kFileScheme) || !url_util::IsStandard(scheme.c_str(), |
+ url_parse::Component(0, static_cast<int>(scheme.length()))))) |
return scheme; |
if (parts->scheme.is_valid()) { |
@@ -427,7 +427,7 @@ std::string URLFixerUpper::SegmentURL(const std::string& text, |
// Construct the text to parse by inserting the scheme. |
std::string inserted_text(scheme); |
- inserted_text.append("://"); |
+ inserted_text.append(chrome::kStandardSchemeSeparator); |
std::string text_to_parse(text.begin(), first_nonwhite); |
text_to_parse.append(inserted_text); |
text_to_parse.append(first_nonwhite, text.end()); |
@@ -482,7 +482,7 @@ GURL URLFixerUpper::FixupURL(const std::string& text, |
if (url_util::IsStandard(scheme.c_str(), |
url_parse::Component(0, static_cast<int>(scheme.length())))) { |
std::string url(scheme); |
- url.append("://"); |
+ url.append(chrome::kStandardSchemeSeparator); |
// We need to check whether the |username| is valid because it is our |
// responsibility to append the '@' to delineate the user information from |
@@ -505,13 +505,43 @@ GURL URLFixerUpper::FixupURL(const std::string& text, |
// In the worst-case, we insert a scheme if the URL lacks one. |
if (!parts.scheme.is_valid()) { |
std::string fixed_scheme(scheme); |
- fixed_scheme.append("://"); |
+ fixed_scheme.append(chrome::kStandardSchemeSeparator); |
trimmed.insert(0, fixed_scheme); |
} |
return GURL(trimmed); |
} |
+GURL URLFixerUpper::FixupChromeURL(const GURL& url) { |
+ DCHECK(url.SchemeIs(chrome::kAboutScheme) || |
+ url.SchemeIs(chrome::kChromeUIScheme)); |
+ |
+ // Segment the URL. |
+ url_parse::Parsed parts; |
+ SegmentURL(url.spec(), &parts); |
+ std::string new_url(chrome::kChromeUIScheme); |
+ new_url.append(chrome::kStandardSchemeSeparator); |
+ |
+ // We need to check whether the |username| is valid because it is our |
+ // responsibility to append the '@' to delineate the user information from |
+ // the host portion of the URL. |
+ if (parts.username.is_valid()) { |
+ FixupUsername(url.spec(), parts.username, &new_url); |
+ FixupPassword(url.spec(), parts.password, &new_url); |
+ new_url.append("@"); |
+ } |
+ |
+ if (parts.host.is_valid()) |
+ FixupHost(url.spec(), parts.host, true, std::string(), &new_url); |
+ else |
+ new_url.append(chrome::kChromeUIVersionHost); |
+ FixupPort(url.spec(), parts.port, &new_url); |
+ FixupPath(url.spec(), parts.path, &new_url); |
+ FixupQuery(url.spec(), parts.query, &new_url); |
+ FixupRef(url.spec(), parts.ref, &new_url); |
+ return GURL(new_url); |
+} |
+ |
// The rules are different here than for regular fixup, since we need to handle |
// input like "hello.html" and know to look in the current directory. Regular |
// fixup will look for cues that it is actually a file path before trying to |