| Index: url/url_util.cc
|
| diff --git a/url/url_util.cc b/url/url_util.cc
|
| index 279ab7e24b1f5203c4b63f812fa3d395d7371c2a..21bf3cc462ef871470302bc00ca2c033ec70c748 100644
|
| --- a/url/url_util.cc
|
| +++ b/url/url_util.cc
|
| @@ -19,21 +19,24 @@ namespace url {
|
| namespace {
|
|
|
| const int kNumStandardURLSchemes = 8;
|
| -const char* kStandardURLSchemes[kNumStandardURLSchemes] = {
|
| - kHttpScheme,
|
| - kHttpsScheme,
|
| - kFileScheme, // Yes, file URLs can have a hostname!
|
| - kFtpScheme,
|
| - kGopherScheme,
|
| - kWsScheme, // WebSocket.
|
| - kWssScheme, // WebSocket secure.
|
| - kFileSystemScheme,
|
| +const SchemeWithType kStandardURLSchemes[kNumStandardURLSchemes] = {
|
| + {kHttpScheme, SCHEME_WITH_PORT},
|
| + {kHttpsScheme, SCHEME_WITH_PORT},
|
| + // Yes, file URLs can have a hostname, so file URLs should be handled as
|
| + // "standard". File URLs never have a port as specified by the SchemeType
|
| + // field.
|
| + {kFileScheme, SCHEME_WITHOUT_PORT},
|
| + {kFtpScheme, SCHEME_WITH_PORT},
|
| + {kGopherScheme, SCHEME_WITH_PORT},
|
| + {kWsScheme, SCHEME_WITH_PORT}, // WebSocket.
|
| + {kWssScheme, SCHEME_WITH_PORT}, // WebSocket secure.
|
| + {kFileSystemScheme, SCHEME_WITHOUT_AUTHORITY},
|
| };
|
|
|
| // List of the currently installed standard schemes. This list is lazily
|
| // initialized by InitStandardSchemes and is leaked on shutdown to prevent
|
| // any destructors from being called that will slow us down or cause problems.
|
| -std::vector<const char*>* standard_schemes = NULL;
|
| +std::vector<SchemeWithType>* standard_schemes = NULL;
|
|
|
| // See the LockStandardSchemes declaration in the header.
|
| bool standard_schemes_locked = false;
|
| @@ -54,7 +57,7 @@ template<> struct CharToStringPiece<base::char16> {
|
| void InitStandardSchemes() {
|
| if (standard_schemes)
|
| return;
|
| - standard_schemes = new std::vector<const char*>;
|
| + standard_schemes = new std::vector<SchemeWithType>;
|
| for (int i = 0; i < kNumStandardURLSchemes; i++)
|
| standard_schemes->push_back(kStandardURLSchemes[i]);
|
| }
|
| @@ -73,10 +76,13 @@ inline bool DoCompareSchemeComponent(const CHAR* spec,
|
| compare_to);
|
| }
|
|
|
| -// Returns true if the given scheme identified by |scheme| within |spec| is one
|
| -// of the registered "standard" schemes.
|
| +// Returns true and sets |type| to the SchemeType of the given scheme
|
| +// identified by |scheme| within |spec| if the scheme is one of the registered
|
| +// "standard" schemes.
|
| template<typename CHAR>
|
| -bool DoIsStandard(const CHAR* spec, const Component& scheme) {
|
| +bool DoIsStandard(const CHAR* spec,
|
| + const Component& scheme,
|
| + SchemeType* type) {
|
| if (!scheme.is_nonempty())
|
| return false; // Empty or invalid schemes are non-standard.
|
|
|
| @@ -85,8 +91,10 @@ bool DoIsStandard(const CHAR* spec, const Component& scheme) {
|
| if (base::LowerCaseEqualsASCII(
|
| typename CharToStringPiece<CHAR>::Piece(
|
| &spec[scheme.begin], scheme.len),
|
| - standard_schemes->at(i)))
|
| + standard_schemes->at(i).scheme)) {
|
| + *type = standard_schemes->at(i).type;
|
| return true;
|
| + }
|
| }
|
| return false;
|
| }
|
| @@ -156,6 +164,7 @@ bool DoCanonicalize(const CHAR* in_spec,
|
| // This is the parsed version of the input URL, we have to canonicalize it
|
| // before storing it in our object.
|
| bool success;
|
| + SchemeType unused_scheme_type = SCHEME_WITH_PORT;
|
| if (DoCompareSchemeComponent(spec, scheme, url::kFileScheme)) {
|
| // File URLs are special.
|
| ParseFileURL(spec, spec_len, &parsed_input);
|
| @@ -168,7 +177,7 @@ bool DoCanonicalize(const CHAR* in_spec,
|
| charset_converter, output,
|
| output_parsed);
|
|
|
| - } else if (DoIsStandard(spec, scheme)) {
|
| + } else if (DoIsStandard(spec, scheme, &unused_scheme_type)) {
|
| // All "normal" URLs.
|
| ParseStandardURL(spec, spec_len, &parsed_input);
|
| success = CanonicalizeStandardURL(spec, spec_len, parsed_input,
|
| @@ -217,9 +226,10 @@ bool DoResolveRelative(const char* base_spec,
|
| base_is_hierarchical = num_slashes > 0;
|
| }
|
|
|
| + SchemeType unused_scheme_type = SCHEME_WITH_PORT;
|
| bool standard_base_scheme =
|
| base_parsed.scheme.is_nonempty() &&
|
| - DoIsStandard(base_spec, base_parsed.scheme);
|
| + DoIsStandard(base_spec, base_parsed.scheme, &unused_scheme_type);
|
|
|
| bool is_relative;
|
| Component relative_component;
|
| @@ -340,7 +350,8 @@ bool DoReplaceComponents(const char* spec,
|
| return ReplaceFileSystemURL(spec, parsed, replacements, charset_converter,
|
| output, out_parsed);
|
| }
|
| - if (DoIsStandard(spec, parsed.scheme)) {
|
| + SchemeType unused_scheme_type = SCHEME_WITH_PORT;
|
| + if (DoIsStandard(spec, parsed.scheme, &unused_scheme_type)) {
|
| return ReplaceStandardURL(spec, parsed, replacements, charset_converter,
|
| output, out_parsed);
|
| }
|
| @@ -365,7 +376,8 @@ void Shutdown() {
|
| }
|
| }
|
|
|
| -void AddStandardScheme(const char* new_scheme) {
|
| +void AddStandardScheme(const char* new_scheme,
|
| + SchemeType type) {
|
| // If this assert triggers, it means you've called AddStandardScheme after
|
| // LockStandardSchemes have been called (see the header file for
|
| // LockStandardSchemes for more).
|
| @@ -388,7 +400,10 @@ void AddStandardScheme(const char* new_scheme) {
|
| memcpy(dup_scheme, new_scheme, scheme_len + 1);
|
|
|
| InitStandardSchemes();
|
| - standard_schemes->push_back(dup_scheme);
|
| + SchemeWithType scheme_with_type;
|
| + scheme_with_type.scheme = dup_scheme;
|
| + scheme_with_type.type = type;
|
| + standard_schemes->push_back(scheme_with_type);
|
| }
|
|
|
| void LockStandardSchemes() {
|
| @@ -396,11 +411,19 @@ void LockStandardSchemes() {
|
| }
|
|
|
| bool IsStandard(const char* spec, const Component& scheme) {
|
| - return DoIsStandard(spec, scheme);
|
| + SchemeType unused_scheme_type;
|
| + return DoIsStandard(spec, scheme, &unused_scheme_type);
|
| +}
|
| +
|
| +bool GetStandardSchemeType(const char* spec,
|
| + const Component& scheme,
|
| + SchemeType* type) {
|
| + return DoIsStandard(spec, scheme, type);
|
| }
|
|
|
| bool IsStandard(const base::char16* spec, const Component& scheme) {
|
| - return DoIsStandard(spec, scheme);
|
| + SchemeType unused_scheme_type;
|
| + return DoIsStandard(spec, scheme, &unused_scheme_type);
|
| }
|
|
|
| bool FindAndCompareScheme(const char* str,
|
|
|