Index: url_util.cc |
diff --git a/url_util.cc b/url_util.cc |
index 008a5e48b687dddb0d14f62743ba201763f3d97d..279ab7e24b1f5203c4b63f812fa3d395d7371c2a 100644 |
--- a/url_util.cc |
+++ b/url_util.cc |
@@ -9,6 +9,7 @@ |
#include "base/debug/leak_annotations.h" |
#include "base/logging.h" |
+#include "base/strings/string_util.h" |
#include "url/url_canon_internal.h" |
#include "url/url_file.h" |
#include "url/url_util_internal.h" |
@@ -17,28 +18,11 @@ namespace url { |
namespace { |
-// ASCII-specific tolower. The standard library's tolower is locale sensitive, |
-// so we don't want to use it here. |
-template<class Char> |
-inline Char ToLowerASCII(Char c) { |
- return (c >= 'A' && c <= 'Z') ? (c + ('a' - 'A')) : c; |
-} |
- |
-// Backend for LowerCaseEqualsASCII. |
-template<typename Iter> |
-inline bool DoLowerCaseEqualsASCII(Iter a_begin, Iter a_end, const char* b) { |
- for (Iter it = a_begin; it != a_end; ++it, ++b) { |
- if (!*b || ToLowerASCII(*it) != *b) |
- return false; |
- } |
- return *b == 0; |
-} |
- |
const int kNumStandardURLSchemes = 8; |
const char* kStandardURLSchemes[kNumStandardURLSchemes] = { |
kHttpScheme, |
kHttpsScheme, |
- kFileScheme, // Yes, file urls can have a hostname! |
+ kFileScheme, // Yes, file URLs can have a hostname! |
kFtpScheme, |
kGopherScheme, |
kWsScheme, // WebSocket. |
@@ -54,6 +38,17 @@ std::vector<const char*>* standard_schemes = NULL; |
// See the LockStandardSchemes declaration in the header. |
bool standard_schemes_locked = false; |
+// This template converts a given character type to the corresponding |
+// StringPiece type. |
+template<typename CHAR> struct CharToStringPiece { |
+}; |
+template<> struct CharToStringPiece<char> { |
+ typedef base::StringPiece Piece; |
+}; |
+template<> struct CharToStringPiece<base::char16> { |
+ typedef base::StringPiece16 Piece; |
+}; |
+ |
// Ensures that the standard_schemes list is initialized, does nothing if it |
// already has values. |
void InitStandardSchemes() { |
@@ -72,9 +67,10 @@ inline bool DoCompareSchemeComponent(const CHAR* spec, |
const char* compare_to) { |
if (!component.is_nonempty()) |
return compare_to[0] == 0; // When component is empty, match empty scheme. |
- return LowerCaseEqualsASCII(&spec[component.begin], |
- &spec[component.end()], |
- compare_to); |
+ return base::LowerCaseEqualsASCII( |
+ typename CharToStringPiece<CHAR>::Piece( |
+ &spec[component.begin], component.len), |
+ compare_to); |
} |
// Returns true if the given scheme identified by |scheme| within |spec| is one |
@@ -86,8 +82,10 @@ bool DoIsStandard(const CHAR* spec, const Component& scheme) { |
InitStandardSchemes(); |
for (size_t i = 0; i < standard_schemes->size(); i++) { |
- if (LowerCaseEqualsASCII(&spec[scheme.begin], &spec[scheme.end()], |
- standard_schemes->at(i))) |
+ if (base::LowerCaseEqualsASCII( |
+ typename CharToStringPiece<CHAR>::Piece( |
+ &spec[scheme.begin], scheme.len), |
+ standard_schemes->at(i))) |
return true; |
} |
return false; |
@@ -134,7 +132,7 @@ bool DoCanonicalize(const CHAR* in_spec, |
Parsed parsed_input; |
#ifdef WIN32 |
// For Windows, we allow things that look like absolute Windows paths to be |
- // fixed up magically to file URLs. This is done for IE compatability. For |
+ // fixed up magically to file URLs. This is done for IE compatibility. For |
// example, this will change "c:/foo" into a file URL rather than treating |
// it as a URL with the protocol "c". It also works for UNC ("\\foo\bar.txt"). |
// There is similar logic in url_canon_relative.cc for |
@@ -177,13 +175,14 @@ bool DoCanonicalize(const CHAR* in_spec, |
charset_converter, output, output_parsed); |
} else if (DoCompareSchemeComponent(spec, scheme, url::kMailToScheme)) { |
- // Mailto are treated like a standard url with only a scheme, path, query |
+ // Mailto URLs are treated like standard URLs, with only a scheme, path, |
+ // and query. |
ParseMailtoURL(spec, spec_len, &parsed_input); |
success = CanonicalizeMailtoURL(spec, spec_len, parsed_input, output, |
output_parsed); |
} else { |
- // "Weird" URLs like data: and javascript: |
+ // "Weird" URLs like data: and javascript:. |
ParsePathURL(spec, spec_len, trim_path_end, &parsed_input); |
success = CanonicalizePathURL(spec, spec_len, parsed_input, output, |
output_parsed); |
@@ -273,7 +272,7 @@ bool DoReplaceComponents(const char* spec, |
CanonOutput* output, |
Parsed* out_parsed) { |
// If the scheme is overridden, just do a simple string substitution and |
- // reparse the whole thing. There are lots of edge cases that we really don't |
+ // re-parse the whole thing. There are lots of edge cases that we really don't |
// want to deal with. Like what happens if I replace "http://e:8080/foo" |
// with a file. Does it become "file:///E:/8080/foo" where the port number |
// becomes part of the path? Parsing that string as a file URL says "yes" |
@@ -320,7 +319,7 @@ bool DoReplaceComponents(const char* spec, |
// getting replaced here. If ReplaceComponents didn't re-check everything, |
// we wouldn't know if something *not* getting replaced is a problem. |
// If the scheme-specific replacers are made more intelligent so they don't |
- // re-check everything, we should instead recanonicalize the whole thing |
+ // re-check everything, we should instead re-canonicalize the whole thing |
// after this call to check validity (this assumes replacing the scheme is |
// much much less common than other types of replacements, like clearing the |
// ref). |
@@ -373,7 +372,7 @@ void AddStandardScheme(const char* new_scheme) { |
// |
// This normally means you're trying to set up a new standard scheme too late |
// in your application's init process. Locate where your app does this |
- // initialization and calls LockStandardScheme, and add your new standard |
+ // initialization and calls LockStandardSchemes, and add your new standard |
// scheme there. |
DCHECK(!standard_schemes_locked) << |
"Trying to add a standard scheme after the list has been locked."; |
@@ -382,7 +381,7 @@ void AddStandardScheme(const char* new_scheme) { |
if (scheme_len == 0) |
return; |
- // Dulicate the scheme into a new buffer and add it to the list of standard |
+ // Duplicate the scheme into a new buffer and add it to the list of standard |
// schemes. This pointer will be leaked on shutdown. |
char* dup_scheme = new char[scheme_len + 1]; |
ANNOTATE_LEAKING_OBJECT_PTR(dup_scheme); |
@@ -486,31 +485,6 @@ bool ReplaceComponents(const char* spec, |
charset_converter, output, out_parsed); |
} |
-// Front-ends for LowerCaseEqualsASCII. |
-bool LowerCaseEqualsASCII(const char* a_begin, |
- const char* a_end, |
- const char* b) { |
- return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
-} |
- |
-bool LowerCaseEqualsASCII(const char* a_begin, |
- const char* a_end, |
- const char* b_begin, |
- const char* b_end) { |
- while (a_begin != a_end && b_begin != b_end && |
- ToLowerASCII(*a_begin) == *b_begin) { |
- a_begin++; |
- b_begin++; |
- } |
- return a_begin == a_end && b_begin == b_end; |
-} |
- |
-bool LowerCaseEqualsASCII(const base::char16* a_begin, |
- const base::char16* a_end, |
- const char* b) { |
- return DoLowerCaseEqualsASCII(a_begin, a_end, b); |
-} |
- |
void DecodeURLEscapeSequences(const char* input, |
int length, |
CanonOutputW* output) { |