| 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,
 | 
| 
 |