Cherrypick: [Android] Use Blink UTF8<->UTF16 strings conversion in Gin Java Bridge

Original description:

> This patch is mainly for merging into M37. In trunk, we should fix
> base:: conversion routines instead.
>
> Blink UTF conversion routines are considerably faster than the ones
> from base::, especially on strings that only contain Latin-1 characters,
> so use them instead. This gives a 9% speed gain on Cordova's "exec"
> benchmark.
>
> BUG=391492
>
> Review URL: https://codereview.chromium.org/377173002
>
> git-svn-id: svn://svn.chromium.org/chrome/trunk/src@282017 0039d316-1c4b-4281-b951-d872f2087c98

Bug: 10146351

Change-Id: I22ec2f7aea742f403763801526a15239b5580b1e
diff --git a/content/browser/android/java/gin_java_method_invocation_helper.cc b/content/browser/android/java/gin_java_method_invocation_helper.cc
index ae7d643..254296f 100644
--- a/content/browser/android/java/gin_java_method_invocation_helper.cc
+++ b/content/browser/android/java/gin_java_method_invocation_helper.cc
@@ -8,13 +8,13 @@
 
 #include "base/android/event_log.h"
 #include "base/android/jni_android.h"
-#include "base/android/jni_string.h"
 #include "base/float_util.h"
 #include "content/browser/android/java/gin_java_script_to_java_types_coercion.h"
 #include "content/browser/android/java/java_method.h"
 #include "content/browser/android/java/jni_helper.h"
 #include "content/common/android/gin_java_bridge_value.h"
 #include "content/public/browser/browser_thread.h"
+#include "third_party/WebKit/public/platform/WebString.h"
 
 using base::android::AttachCurrentThread;
 using base::android::ScopedJavaLocalRef;
@@ -26,6 +26,15 @@
 // See frameworks/base/core/java/android/webkit/EventLogTags.logtags
 const int kObjectGetClassInvocationAttemptLogTag = 70151;
 
+// This is an intermediate solution until we fix http://crbug.com/391492.
+std::string ConvertJavaStringToUTF8(JNIEnv* env, jstring str) {
+  const jchar* chars = env->GetStringChars(str, NULL);
+  DCHECK(chars);
+  blink::WebString utf16(chars, env->GetStringLength(str));
+  env->ReleaseStringChars(str, chars);
+  return utf16.utf8();
+}
+
 }  // namespace
 
 GinJavaMethodInvocationHelper::GinJavaMethodInvocationHelper(
@@ -301,7 +310,7 @@
         break;
       }
       result_wrapper.AppendString(
-          base::android::ConvertJavaStringToUTF8(scoped_java_string));
+          ConvertJavaStringToUTF8(env, scoped_java_string.obj()));
       break;
     }
     case JavaType::TypeObject: {
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
index 1a80813..75f902f 100644
--- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
@@ -12,8 +12,7 @@
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
 #include "content/common/android/gin_java_bridge_value.h"
-
-using base::android::ConvertUTF8ToJavaString;
+#include "third_party/WebKit/public/platform/WebString.h"
 
 namespace content {
 
@@ -22,6 +21,13 @@
 const char kJavaLangString[] = "java/lang/String";
 const char kUndefined[] = "undefined";
 
+// This is an intermediate solution until we fix http://crbug.com/391492.
+jstring ConvertUTF8ToJString(JNIEnv* env, const std::string& string) {
+  base::string16 utf16(
+      blink::WebString::fromUTF8(string.c_str(), string.size()));
+  return env->NewString(utf16.data(), utf16.length());
+}
+
 double RoundDoubleTowardsZero(const double& x) {
   if (std::isnan(x)) {
     return 0.0;
@@ -100,8 +106,7 @@
       break;
     case JavaType::TypeString:
       result.l = coerce_to_string
-                     ? ConvertUTF8ToJavaString(
-                           env, base::Int64ToString(int_value)).Release()
+                     ? ConvertUTF8ToJString(env, base::Int64ToString(int_value))
                      : NULL;
       break;
     case JavaType::TypeBoolean:
@@ -161,11 +166,10 @@
       result.l = NULL;
       break;
     case JavaType::TypeString:
-      result.l =
-          coerce_to_string
-              ? ConvertUTF8ToJavaString(
-                    env, base::StringPrintf("%.6lg", double_value)).Release()
-              : NULL;
+      result.l = coerce_to_string
+                     ? ConvertUTF8ToJString(
+                           env, base::StringPrintf("%.6lg", double_value))
+                     : NULL;
       break;
     case JavaType::TypeBoolean:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec
@@ -203,10 +207,9 @@
       result.l = NULL;
       break;
     case JavaType::TypeString:
-      result.l = coerce_to_string
-                     ? ConvertUTF8ToJavaString(
-                           env, boolean_value ? "true" : "false").Release()
-                     : NULL;
+      result.l = coerce_to_string ? ConvertUTF8ToJString(
+                                        env, boolean_value ? "true" : "false")
+                                  : NULL;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeChar:
@@ -243,7 +246,7 @@
     case JavaType::TypeString: {
       std::string string_result;
       value->GetAsString(&string_result);
-      result.l = ConvertUTF8ToJavaString(env, string_result).Release();
+      result.l = ConvertUTF8ToJString(env, string_result);
       break;
     }
     case JavaType::TypeObject:
@@ -397,7 +400,7 @@
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to
       // "undefined". Spec requires converting undefined to NULL.
       result.l = (coerce_to_string && is_undefined)
-                     ? ConvertUTF8ToJavaString(env, kUndefined).Release()
+                     ? ConvertUTF8ToJString(env, kUndefined)
                      : NULL;
       break;
     case JavaType::TypeByte:
@@ -583,9 +586,8 @@
     case JavaType::TypeString:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to
       // "undefined". Spec requires calling toString() on the Java object.
-      result.l = coerce_to_string
-                     ? ConvertUTF8ToJavaString(env, kUndefined).Release()
-                     : NULL;
+      result.l =
+          coerce_to_string ? ConvertUTF8ToJString(env, kUndefined) : NULL;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeShort: