url_idna_icu_alternatives_android.cc 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <string.h>
  5. #include <string>
  6. #include "base/android/jni_android.h"
  7. #include "base/android/jni_string.h"
  8. #include "base/strings/string_piece.h"
  9. #include "url/url_canon_internal.h"
  10. #include "url/url_jni_headers/IDNStringUtil_jni.h"
  11. using base::android::ScopedJavaLocalRef;
  12. namespace url {
  13. // This uses the JDK's conversion function, which uses IDNA 2003, unlike the
  14. // ICU implementation.
  15. bool IDNToASCII(const char16_t* src, int src_len, CanonOutputW* output) {
  16. DCHECK_EQ(0u, output->length()); // Output buffer is assumed empty.
  17. JNIEnv* env = base::android::AttachCurrentThread();
  18. base::android::ScopedJavaLocalRef<jstring> java_src =
  19. base::android::ConvertUTF16ToJavaString(
  20. env, base::StringPiece16(src, src_len));
  21. ScopedJavaLocalRef<jstring> java_result =
  22. android::Java_IDNStringUtil_idnToASCII(env, java_src);
  23. // NULL indicates failure.
  24. if (java_result.is_null())
  25. return false;
  26. std::u16string utf16_result =
  27. base::android::ConvertJavaStringToUTF16(java_result);
  28. output->Append(utf16_result.data(), utf16_result.size());
  29. return true;
  30. }
  31. } // namespace url