Commit ed921a04 authored by mnaganov@chromium.org's avatar mnaganov@chromium.org

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

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
parent 3b466916
...@@ -8,13 +8,13 @@ ...@@ -8,13 +8,13 @@
#include "base/android/event_log.h" #include "base/android/event_log.h"
#include "base/android/jni_android.h" #include "base/android/jni_android.h"
#include "base/android/jni_string.h"
#include "base/float_util.h" #include "base/float_util.h"
#include "content/browser/android/java/gin_java_script_to_java_types_coercion.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/java_method.h"
#include "content/browser/android/java/jni_helper.h" #include "content/browser/android/java/jni_helper.h"
#include "content/common/android/gin_java_bridge_value.h" #include "content/common/android/gin_java_bridge_value.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "third_party/WebKit/public/platform/WebString.h"
using base::android::AttachCurrentThread; using base::android::AttachCurrentThread;
using base::android::ScopedJavaLocalRef; using base::android::ScopedJavaLocalRef;
...@@ -26,6 +26,15 @@ namespace { ...@@ -26,6 +26,15 @@ namespace {
// See frameworks/base/core/java/android/webkit/EventLogTags.logtags // See frameworks/base/core/java/android/webkit/EventLogTags.logtags
const int kObjectGetClassInvocationAttemptLogTag = 70151; 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 } // namespace
GinJavaMethodInvocationHelper::GinJavaMethodInvocationHelper( GinJavaMethodInvocationHelper::GinJavaMethodInvocationHelper(
...@@ -301,7 +310,7 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object, ...@@ -301,7 +310,7 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object,
break; break;
} }
result_wrapper.AppendString( result_wrapper.AppendString(
base::android::ConvertJavaStringToUTF8(scoped_java_string)); ConvertJavaStringToUTF8(env, scoped_java_string.obj()));
break; break;
} }
case JavaType::TypeObject: { case JavaType::TypeObject: {
......
...@@ -12,8 +12,7 @@ ...@@ -12,8 +12,7 @@
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "content/common/android/gin_java_bridge_value.h" #include "content/common/android/gin_java_bridge_value.h"
#include "third_party/WebKit/public/platform/WebString.h"
using base::android::ConvertUTF8ToJavaString;
namespace content { namespace content {
...@@ -22,6 +21,13 @@ namespace { ...@@ -22,6 +21,13 @@ namespace {
const char kJavaLangString[] = "java/lang/String"; const char kJavaLangString[] = "java/lang/String";
const char kUndefined[] = "undefined"; 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) { double RoundDoubleTowardsZero(const double& x) {
if (std::isnan(x)) { if (std::isnan(x)) {
return 0.0; return 0.0;
...@@ -100,8 +106,7 @@ jvalue CoerceJavaScriptIntegerToJavaValue(JNIEnv* env, ...@@ -100,8 +106,7 @@ jvalue CoerceJavaScriptIntegerToJavaValue(JNIEnv* env,
break; break;
case JavaType::TypeString: case JavaType::TypeString:
result.l = coerce_to_string result.l = coerce_to_string
? ConvertUTF8ToJavaString( ? ConvertUTF8ToJString(env, base::Int64ToString(int_value))
env, base::Int64ToString(int_value)).Release()
: NULL; : NULL;
break; break;
case JavaType::TypeBoolean: case JavaType::TypeBoolean:
...@@ -161,10 +166,9 @@ jvalue CoerceJavaScriptDoubleToJavaValue(JNIEnv* env, ...@@ -161,10 +166,9 @@ jvalue CoerceJavaScriptDoubleToJavaValue(JNIEnv* env,
result.l = NULL; result.l = NULL;
break; break;
case JavaType::TypeString: case JavaType::TypeString:
result.l = result.l = coerce_to_string
coerce_to_string ? ConvertUTF8ToJString(
? ConvertUTF8ToJavaString( env, base::StringPrintf("%.6lg", double_value))
env, base::StringPrintf("%.6lg", double_value)).Release()
: NULL; : NULL;
break; break;
case JavaType::TypeBoolean: case JavaType::TypeBoolean:
...@@ -203,9 +207,8 @@ jvalue CoerceJavaScriptBooleanToJavaValue(JNIEnv* env, ...@@ -203,9 +207,8 @@ jvalue CoerceJavaScriptBooleanToJavaValue(JNIEnv* env,
result.l = NULL; result.l = NULL;
break; break;
case JavaType::TypeString: case JavaType::TypeString:
result.l = coerce_to_string result.l = coerce_to_string ? ConvertUTF8ToJString(
? ConvertUTF8ToJavaString( env, boolean_value ? "true" : "false")
env, boolean_value ? "true" : "false").Release()
: NULL; : NULL;
break; break;
case JavaType::TypeByte: case JavaType::TypeByte:
...@@ -243,7 +246,7 @@ jvalue CoerceJavaScriptStringToJavaValue(JNIEnv* env, ...@@ -243,7 +246,7 @@ jvalue CoerceJavaScriptStringToJavaValue(JNIEnv* env,
case JavaType::TypeString: { case JavaType::TypeString: {
std::string string_result; std::string string_result;
value->GetAsString(&string_result); value->GetAsString(&string_result);
result.l = ConvertUTF8ToJavaString(env, string_result).Release(); result.l = ConvertUTF8ToJString(env, string_result);
break; break;
} }
case JavaType::TypeObject: case JavaType::TypeObject:
...@@ -397,7 +400,7 @@ jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(JNIEnv* env, ...@@ -397,7 +400,7 @@ jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(JNIEnv* env,
// LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to // LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to
// "undefined". Spec requires converting undefined to NULL. // "undefined". Spec requires converting undefined to NULL.
result.l = (coerce_to_string && is_undefined) result.l = (coerce_to_string && is_undefined)
? ConvertUTF8ToJavaString(env, kUndefined).Release() ? ConvertUTF8ToJString(env, kUndefined)
: NULL; : NULL;
break; break;
case JavaType::TypeByte: case JavaType::TypeByte:
...@@ -583,9 +586,8 @@ jvalue CoerceJavaScriptObjectToJavaValue(JNIEnv* env, ...@@ -583,9 +586,8 @@ jvalue CoerceJavaScriptObjectToJavaValue(JNIEnv* env,
case JavaType::TypeString: case JavaType::TypeString:
// LIVECONNECT_COMPLIANCE: Existing behavior is to convert to // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to
// "undefined". Spec requires calling toString() on the Java object. // "undefined". Spec requires calling toString() on the Java object.
result.l = coerce_to_string result.l =
? ConvertUTF8ToJavaString(env, kUndefined).Release() coerce_to_string ? ConvertUTF8ToJString(env, kUndefined) : NULL;
: NULL;
break; break;
case JavaType::TypeByte: case JavaType::TypeByte:
case JavaType::TypeShort: case JavaType::TypeShort:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment