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 @@
#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 @@ namespace {
// 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 @@ void GinJavaMethodInvocationHelper::InvokeMethod(jobject object,
break;
}
result_wrapper.AppendString(
base::android::ConvertJavaStringToUTF8(scoped_java_string));
ConvertJavaStringToUTF8(env, scoped_java_string.obj()));
break;
}
case JavaType::TypeObject: {
......
......@@ -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 @@ namespace {
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 @@ jvalue CoerceJavaScriptIntegerToJavaValue(JNIEnv* env,
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 @@ jvalue CoerceJavaScriptDoubleToJavaValue(JNIEnv* env,
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 @@ jvalue CoerceJavaScriptBooleanToJavaValue(JNIEnv* env,
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 @@ jvalue CoerceJavaScriptStringToJavaValue(JNIEnv* env,
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 @@ jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(JNIEnv* env,
// 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 @@ jvalue CoerceJavaScriptObjectToJavaValue(JNIEnv* env,
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:
......
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