Index: chrome/common/net/x509_certificate_model.cc |
=================================================================== |
--- chrome/common/net/x509_certificate_model.cc (revision 215936) |
+++ chrome/common/net/x509_certificate_model.cc (working copy) |
@@ -21,20 +21,34 @@ |
string16 output16; |
output16.resize(input.length()); |
+ // TODO(jungshik): Is this called from multiple threads? |
+ static UIDNA* uidna = NULL; // will be leaked. |
+ if (uidna == NULL) { |
+ UErrorCode status = U_ZERO_ERROR; |
+ // TODO(jungshik) : Review and change options as different |
+ // parties (browsers, registrars, search engines) converge toward |
+ // a consensus. Below is the most compatible with IDNA 2003 we used to use. |
+ int32_t options = UIDNA_CHECK_BIDI; |
+ uidna = uidna_openUTS46(options, &status); |
+ if (U_FAILURE(status)) |
+ return input; |
+ } |
+ |
UErrorCode status = U_ZERO_ERROR; |
- int output_chars = uidna_IDNToUnicode(input16.data(), input.length(), |
- &output16[0], output16.length(), |
- UIDNA_DEFAULT, NULL, &status); |
- if (status == U_ZERO_ERROR) { |
+ UIDNAInfo idna_info = UIDNA_INFO_INITIALIZER; |
+ int output_chars = uidna_nameToUnicode(uidna, input16.data(), input.length(), |
+ &output16[0], output16.length(), |
+ &idna_info, &status); |
+ if (U_SUCCESS(status) && idna_info.errors == 0) { |
output16.resize(output_chars); |
- } else if (status != U_BUFFER_OVERFLOW_ERROR) { |
+ } else if (status != U_BUFFER_OVERFLOW_ERROR || idna_info.errors != 0) { |
return input; |
} else { |
output16.resize(output_chars); |
- output_chars = uidna_IDNToUnicode(input16.data(), input.length(), |
- &output16[0], output16.length(), |
- UIDNA_DEFAULT, NULL, &status); |
- if (status != U_ZERO_ERROR) |
+ output_chars = uidna_nameToUnicode(uidna, input16.data(), input.length(), |
+ &output16[0], output16.length(), |
+ &idna_info, &status); |
+ if (U_FAILURE(status) || idna_info.errors != 0) |
return input; |
DCHECK_EQ(static_cast<size_t>(output_chars), output16.length()); |
output16.resize(output_chars); // Just to be safe. |
@@ -89,5 +103,5 @@ |
} |
#endif // USE_NSS |
-} // x509_certificate_model |
+} // namespace x509_certificate_model |