| Index: components/ssl_errors/error_classification.cc | 
| diff --git a/components/ssl_errors/error_classification.cc b/components/ssl_errors/error_classification.cc | 
| index 572b5729528089c583738fe485b8f51de6e4c999..52827fe15654c630acefe88f08410118a5f42872 100644 | 
| --- a/components/ssl_errors/error_classification.cc | 
| +++ b/components/ssl_errors/error_classification.cc | 
| @@ -38,32 +38,13 @@ using base::TimeDelta; | 
| namespace ssl_errors { | 
| namespace { | 
|  | 
| -// Events for UMA. Do not reorder or change! | 
| -enum SSLInterstitialCause { | 
| -  CLOCK_PAST, | 
| -  CLOCK_FUTURE, | 
| -  WWW_SUBDOMAIN_MATCH, | 
| -  SUBDOMAIN_MATCH, | 
| -  SUBDOMAIN_INVERSE_MATCH, | 
| -  SUBDOMAIN_OUTSIDE_WILDCARD, | 
| -  HOST_NAME_NOT_KNOWN_TLD, | 
| -  LIKELY_MULTI_TENANT_HOSTING, | 
| -  LOCALHOST, | 
| -  PRIVATE_URL, | 
| -  AUTHORITY_ERROR_CAPTIVE_PORTAL,  // Deprecated in M47. | 
| -  SELF_SIGNED, | 
| -  EXPIRED_RECENTLY, | 
| -  LIKELY_SAME_DOMAIN, | 
| -  UNUSED_INTERSTITIAL_CAUSE_ENTRY, | 
| -}; | 
| - | 
| void RecordSSLInterstitialCause(bool overridable, SSLInterstitialCause event) { | 
| if (overridable) { | 
| UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.cause.overridable", event, | 
| -                              UNUSED_INTERSTITIAL_CAUSE_ENTRY); | 
| +                              SSL_INTERSTITIAL_CAUSE_MAX); | 
| } else { | 
| UMA_HISTOGRAM_ENUMERATION("interstitial.ssl.cause.nonoverridable", event, | 
| -                              UNUSED_INTERSTITIAL_CAUSE_ENTRY); | 
| +                              SSL_INTERSTITIAL_CAUSE_MAX); | 
| } | 
| } | 
|  | 
| @@ -109,7 +90,7 @@ bool IsWWWSubDomainMatch(const GURL& request_url, | 
| const net::X509Certificate& cert) { | 
| std::string www_host; | 
| std::vector<std::string> dns_names; | 
| -  cert.GetDNSNames(&dns_names); | 
| +  cert.GetSubjectAltName(&dns_names, nullptr); | 
| return GetWWWSubDomainMatch(request_url, dns_names, &www_host); | 
| } | 
|  | 
| @@ -148,24 +129,28 @@ void RecordUMAStatistics(bool overridable, | 
| } | 
| case ssl_errors::ErrorInfo::CERT_COMMON_NAME_INVALID: { | 
| std::string host_name = request_url.host(); | 
| +      std::vector<std::string> dns_names; | 
| +      cert.GetSubjectAltName(&dns_names, nullptr); | 
| +      std::vector<HostnameTokens> dns_name_tokens = | 
| +          GetTokenizedDNSNames(dns_names); | 
| + | 
| +      if (dns_names.empty()) | 
| +        RecordSSLInterstitialCause(overridable, NO_SUBJECT_ALT_NAME); | 
| + | 
| if (HostNameHasKnownTLD(host_name)) { | 
| HostnameTokens host_name_tokens = Tokenize(host_name); | 
| if (IsWWWSubDomainMatch(request_url, cert)) | 
| -          RecordSSLInterstitialCause(overridable, WWW_SUBDOMAIN_MATCH); | 
| +          RecordSSLInterstitialCause(overridable, WWW_SUBDOMAIN_MATCH2); | 
| if (IsSubDomainOutsideWildcard(request_url, cert)) | 
| -          RecordSSLInterstitialCause(overridable, SUBDOMAIN_OUTSIDE_WILDCARD); | 
| -        std::vector<std::string> dns_names; | 
| -        cert.GetDNSNames(&dns_names); | 
| -        std::vector<HostnameTokens> dns_name_tokens = | 
| -            GetTokenizedDNSNames(dns_names); | 
| +          RecordSSLInterstitialCause(overridable, SUBDOMAIN_OUTSIDE_WILDCARD2); | 
| if (NameUnderAnyNames(host_name_tokens, dns_name_tokens)) | 
| -          RecordSSLInterstitialCause(overridable, SUBDOMAIN_MATCH); | 
| +          RecordSSLInterstitialCause(overridable, SUBDOMAIN_MATCH2); | 
| if (AnyNamesUnderName(dns_name_tokens, host_name_tokens)) | 
| -          RecordSSLInterstitialCause(overridable, SUBDOMAIN_INVERSE_MATCH); | 
| +          RecordSSLInterstitialCause(overridable, SUBDOMAIN_INVERSE_MATCH2); | 
| if (IsCertLikelyFromMultiTenantHosting(request_url, cert)) | 
| -          RecordSSLInterstitialCause(overridable, LIKELY_MULTI_TENANT_HOSTING); | 
| +          RecordSSLInterstitialCause(overridable, LIKELY_MULTI_TENANT_HOSTING2); | 
| if (IsCertLikelyFromSameDomain(request_url, cert)) | 
| -          RecordSSLInterstitialCause(overridable, LIKELY_SAME_DOMAIN); | 
| +          RecordSSLInterstitialCause(overridable, LIKELY_SAME_DOMAIN2); | 
| } else { | 
| RecordSSLInterstitialCause(overridable, HOST_NAME_NOT_KNOWN_TLD); | 
| } | 
| @@ -382,7 +367,7 @@ bool IsSubDomainOutsideWildcard(const GURL& request_url, | 
| std::string host_name = request_url.host(); | 
| HostnameTokens host_name_tokens = Tokenize(host_name); | 
| std::vector<std::string> dns_names; | 
| -  cert.GetDNSNames(&dns_names); | 
| +  cert.GetSubjectAltName(&dns_names, nullptr); | 
| bool result = false; | 
|  | 
| // This method requires that the host name be longer than the dns name on | 
| @@ -410,7 +395,7 @@ bool IsCertLikelyFromMultiTenantHosting(const GURL& request_url, | 
| std::string host_name = request_url.host(); | 
| std::vector<std::string> dns_names; | 
| std::vector<std::string> dns_names_domain; | 
| -  cert.GetDNSNames(&dns_names); | 
| +  cert.GetSubjectAltName(&dns_names, nullptr); | 
| size_t dns_names_size = dns_names.size(); | 
|  | 
| // If there is only 1 DNS name then it is definitely not a shared certificate. | 
| @@ -457,7 +442,9 @@ bool IsCertLikelyFromSameDomain(const GURL& request_url, | 
| const net::X509Certificate& cert) { | 
| std::string host_name = request_url.host(); | 
| std::vector<std::string> dns_names; | 
| -  cert.GetDNSNames(&dns_names); | 
| +  cert.GetSubjectAltName(&dns_names, nullptr); | 
| +  if (dns_names.empty()) | 
| +    return false; | 
|  | 
| dns_names.push_back(host_name); | 
| std::vector<std::string> dns_names_domain; | 
|  |