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: