summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/browser/renderer_host/java/java_bound_object.cc40
-rw-r--r--content/browser/renderer_host/java/java_method.cc43
-rw-r--r--content/browser/renderer_host/java/java_method.h29
-rw-r--r--content/browser/renderer_host/java/java_type.cc35
-rw-r--r--content/browser/renderer_host/java/java_type.h36
-rw-r--r--content/content_browser.gypi15
6 files changed, 103 insertions, 95 deletions
diff --git a/content/browser/renderer_host/java/java_bound_object.cc b/content/browser/renderer_host/java/java_bound_object.cc
index ff113d4..a65506c 100644
--- a/content/browser/renderer_host/java/java_bound_object.cc
+++ b/content/browser/renderer_host/java/java_bound_object.cc
@@ -9,6 +9,7 @@
#include "base/memory/singleton.h"
#include "base/string_number_conversions.h"
#include "base/stringprintf.h"
+#include "content/browser/renderer_host/java/java_type.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebBindings.h"
using base::StringPrintf;
@@ -30,15 +31,6 @@ using WebKit::WebBindings;
namespace {
-std::string NPIdentifierToString(NPIdentifier identifier) {
- const NPUTF8* string;
- int32_t number;
- bool is_string;
- WebBindings::extractIdentifierData(identifier, string, number, is_string);
- DCHECK(is_string);
- return string;
-}
-
// Our special NPObject type. We extend an NPObject with a pointer to a
// JavaBoundObject. We also add static methods for each of the NPObject
// callbacks, which are registered by our NPClass. These methods simply
@@ -85,7 +77,7 @@ void JavaNPObject::Deallocate(NPObject* np_object) {
}
bool JavaNPObject::HasMethod(NPObject* np_object, NPIdentifier np_identifier) {
- std::string name = NPIdentifierToString(np_identifier);
+ std::string name(WebBindings::utf8FromIdentifier(np_identifier));
JavaNPObject* obj = reinterpret_cast<JavaNPObject*>(np_object);
return obj->bound_object->HasMethod(name);
}
@@ -93,7 +85,7 @@ bool JavaNPObject::HasMethod(NPObject* np_object, NPIdentifier np_identifier) {
bool JavaNPObject::Invoke(NPObject* np_object, NPIdentifier np_identifier,
const NPVariant* args, uint32_t arg_count,
NPVariant* result) {
- std::string name = NPIdentifierToString(np_identifier);
+ std::string name(WebBindings::utf8FromIdentifier(np_identifier));
JavaNPObject* obj = reinterpret_cast<JavaNPObject*>(np_object);
return obj->bound_object->Invoke(name, args, arg_count, result);
}
@@ -116,11 +108,11 @@ bool JavaNPObject::GetProperty(NPObject* np_object,
// Calls a Java method through JNI and returns the result as an NPVariant. Note
// that this method does not do any type coercion. The Java return value is
// simply converted to the corresponding NPAPI type.
-NPVariant CallJNIMethod(jobject object, JavaType::Type return_type,
+NPVariant CallJNIMethod(jobject object, const JavaType& return_type,
jmethodID id, jvalue* parameters) {
JNIEnv* env = AttachCurrentThread();
NPVariant result;
- switch (return_type) {
+ switch (return_type.type) {
case JavaType::TypeBoolean:
BOOLEAN_TO_NPVARIANT(env->CallBooleanMethodA(object, id, parameters),
result);
@@ -191,13 +183,13 @@ NPVariant CallJNIMethod(jobject object, JavaType::Type return_type,
}
jvalue CoerceJavaScriptNumberToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// See http://jdk6.java.net/plugin2/liveconnect/#JS_NUMBER_VALUES.
jvalue result;
DCHECK(variant.type == NPVariantType_Int32 ||
variant.type == NPVariantType_Double);
bool is_double = variant.type == NPVariantType_Double;
- switch (target_type) {
+ switch (target_type.type) {
case JavaType::TypeByte:
result.b = is_double ? static_cast<jbyte>(NPVARIANT_TO_DOUBLE(variant)) :
static_cast<jbyte>(NPVARIANT_TO_INT32(variant));
@@ -258,12 +250,12 @@ jvalue CoerceJavaScriptNumberToJavaValue(const NPVariant& variant,
}
jvalue CoerceJavaScriptBooleanToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// See http://jdk6.java.net/plugin2/liveconnect/#JS_BOOLEAN_VALUES.
DCHECK_EQ(NPVariantType_Bool, variant.type);
bool boolean_value = NPVARIANT_TO_BOOLEAN(variant);
jvalue result;
- switch (target_type) {
+ switch (target_type.type) {
case JavaType::TypeBoolean:
result.z = boolean_value ? JNI_TRUE : JNI_FALSE;
break;
@@ -303,11 +295,11 @@ jvalue CoerceJavaScriptBooleanToJavaValue(const NPVariant& variant,
}
jvalue CoerceJavaScriptStringToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// See http://jdk6.java.net/plugin2/liveconnect/#JS_STRING_VALUES.
DCHECK_EQ(NPVariantType_String, variant.type);
jvalue result;
- switch (target_type) {
+ switch (target_type.type) {
case JavaType::TypeString:
result.l = ConvertUTF8ToJavaString(
AttachCurrentThread(),
@@ -355,7 +347,7 @@ jvalue CoerceJavaScriptStringToJavaValue(const NPVariant& variant,
}
jvalue CoerceJavaScriptObjectToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// We only handle Java objects. See
// http://jdk6.java.net/plugin2/liveconnect/#JS_JAVA_OBJECTS.
// TODO(steveblock): Handle arrays.
@@ -371,7 +363,7 @@ jvalue CoerceJavaScriptObjectToJavaValue(const NPVariant& variant,
DCHECK_EQ(&JavaNPObject::kNPClass, object->_class);
jvalue result;
- switch (target_type) {
+ switch (target_type.type) {
case JavaType::TypeObject:
// LIVECONNECT_COMPLIANCE: Pass all Java objects to maintain existing
// behavior. We should pass only Java objects which are
@@ -416,12 +408,12 @@ jvalue CoerceJavaScriptObjectToJavaValue(const NPVariant& variant,
}
jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// See http://jdk6.java.net/plugin2/liveconnect/#JS_NULL.
DCHECK(variant.type == NPVariantType_Null ||
variant.type == NPVariantType_Void);
jvalue result;
- switch (target_type) {
+ switch (target_type.type) {
case JavaType::TypeObject:
result.l = NULL;
break;
@@ -462,7 +454,7 @@ jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(const NPVariant& variant,
}
jvalue CoerceJavaScriptValueToJavaValue(const NPVariant& variant,
- JavaType::Type target_type) {
+ const JavaType& target_type) {
// Note that in all these conversions, the relevant field of the jvalue must
// always be explicitly set, as jvalue does not initialize its fields.
diff --git a/content/browser/renderer_host/java/java_method.cc b/content/browser/renderer_host/java/java_method.cc
index d65bd0c..c236940 100644
--- a/content/browser/renderer_host/java/java_method.cc
+++ b/content/browser/renderer_host/java/java_method.cc
@@ -16,41 +16,11 @@ using base::android::ScopedJavaLocalRef;
namespace {
-// Java's reflection API represents types as a string using an extended 'binary
-// name'. This converts to an enum which we store in place of the binary name
-// for simplicity.
-JavaType::Type BinaryNameToType(const std::string& binary_name) {
- if (binary_name == "boolean") {
- return JavaType::TypeBoolean;
- } else if (binary_name == "byte") {
- return JavaType::TypeByte;
- } else if (binary_name == "char") {
- return JavaType::TypeChar;
- } else if (binary_name == "short") {
- return JavaType::TypeShort;
- } else if (binary_name == "int") {
- return JavaType::TypeInt;
- } else if (binary_name == "long") {
- return JavaType::TypeLong;
- } else if (binary_name == "float") {
- return JavaType::TypeFloat;
- } else if (binary_name == "double") {
- return JavaType::TypeDouble;
- } else if (binary_name == "void") {
- return JavaType::TypeVoid;
- } else if (binary_name[0] == '[') {
- return JavaType::TypeArray;
- } else if (binary_name == "java.lang.String") {
- return JavaType::TypeString;
- }
- return JavaType::TypeObject;
-}
-
std::string BinaryNameToJNIName(const std::string& binary_name,
- JavaType::Type* type) {
+ JavaType* type) {
DCHECK(type);
- *type = BinaryNameToType(binary_name);
- switch (*type) {
+ *type = JavaType::CreateFromBinaryName(binary_name);
+ switch (type->type) {
case JavaType::TypeBoolean:
return "Z";
case JavaType::TypeByte:
@@ -72,7 +42,8 @@ std::string BinaryNameToJNIName(const std::string& binary_name,
case JavaType::TypeArray:
return "[";
default:
- DCHECK (*type == JavaType::TypeString || *type == JavaType::TypeObject);
+ DCHECK(type->type == JavaType::TypeString ||
+ type->type == JavaType::TypeObject);
std::string jni_name = "L" + binary_name + ";";
ReplaceSubstringsAfterOffset(&jni_name, 0, ".", "/");
return jni_name;
@@ -172,12 +143,12 @@ size_t JavaMethod::num_parameters() const {
return num_parameters_;
}
-JavaType::Type JavaMethod::parameter_type(size_t index) const {
+const JavaType& JavaMethod::parameter_type(size_t index) const {
EnsureTypesAndIDAreSetUp();
return parameter_types_[index];
}
-JavaType::Type JavaMethod::return_type() const {
+const JavaType& JavaMethod::return_type() const {
EnsureTypesAndIDAreSetUp();
return return_type_;
}
diff --git a/content/browser/renderer_host/java/java_method.h b/content/browser/renderer_host/java/java_method.h
index fc6bcef..7599617 100644
--- a/content/browser/renderer_host/java/java_method.h
+++ b/content/browser/renderer_host/java/java_method.h
@@ -10,26 +10,7 @@
#include <vector>
#include "base/android/scoped_java_ref.h"
-
-namespace JavaType {
-enum Type {
- TypeBoolean,
- TypeByte,
- TypeChar,
- TypeShort,
- TypeInt,
- TypeLong,
- TypeFloat,
- TypeDouble,
- // This is only used as a return type, so we should never convert from
- // JavaScript with this type.
- TypeVoid,
- TypeArray,
- // We special-case strings, as they get special handling when coercing.
- TypeString,
- TypeObject,
-};
-} // namespace JavaType
+#include "content/browser/renderer_host/java/java_type.h"
// Wrapper around java.lang.reflect.Method. This class must be used on a single
// thread only.
@@ -40,8 +21,8 @@ class JavaMethod {
const std::string& name() const { return name_; }
size_t num_parameters() const;
- JavaType::Type parameter_type(size_t index) const;
- JavaType::Type return_type() const;
+ const JavaType& parameter_type(size_t index) const;
+ const JavaType& return_type() const;
jmethodID id() const;
private:
@@ -52,8 +33,8 @@ class JavaMethod {
mutable base::android::ScopedJavaGlobalRef<jobject> java_method_;
mutable bool have_calculated_num_parameters_;
mutable size_t num_parameters_;
- mutable std::vector<JavaType::Type> parameter_types_;
- mutable JavaType::Type return_type_;
+ mutable std::vector<JavaType> parameter_types_;
+ mutable JavaType return_type_;
mutable jmethodID id_;
DISALLOW_IMPLICIT_CONSTRUCTORS(JavaMethod);
diff --git a/content/browser/renderer_host/java/java_type.cc b/content/browser/renderer_host/java/java_type.cc
new file mode 100644
index 0000000..f3ada3c
--- /dev/null
+++ b/content/browser/renderer_host/java/java_type.cc
@@ -0,0 +1,35 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/java/java_type.h"
+
+JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) {
+ JavaType result;
+ if (binary_name == "boolean") {
+ result.type = JavaType::TypeBoolean;
+ } else if (binary_name == "byte") {
+ result.type = JavaType::TypeByte;
+ } else if (binary_name == "char") {
+ result.type = JavaType::TypeChar;
+ } else if (binary_name == "short") {
+ result.type = JavaType::TypeShort;
+ } else if (binary_name == "int") {
+ result.type = JavaType::TypeInt;
+ } else if (binary_name == "long") {
+ result.type = JavaType::TypeLong;
+ } else if (binary_name == "float") {
+ result.type = JavaType::TypeFloat;
+ } else if (binary_name == "double") {
+ result.type = JavaType::TypeDouble;
+ } else if (binary_name == "void") {
+ result.type = JavaType::TypeVoid;
+ } else if (binary_name[0] == '[') {
+ result.type = JavaType::TypeArray;
+ } else if (binary_name == "java.lang.String") {
+ result.type = JavaType::TypeString;
+ } else {
+ result.type = JavaType::TypeObject;
+ }
+ return result;
+}
diff --git a/content/browser/renderer_host/java/java_type.h b/content/browser/renderer_host/java/java_type.h
new file mode 100644
index 0000000..f4975c2
--- /dev/null
+++ b/content/browser/renderer_host/java/java_type.h
@@ -0,0 +1,36 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_JAVA_JAVA_TYPE_H_
+#define CONTENT_BROWSER_RENDERER_HOST_JAVA_JAVA_TYPE_H_
+
+#include <string>
+
+struct JavaType {
+ // Java's reflection API represents types as a string using an extended
+ // 'binary name'.
+ static JavaType CreateFromBinaryName(const std::string& binary_name);
+
+ enum Type {
+ TypeBoolean,
+ TypeByte,
+ TypeChar,
+ TypeShort,
+ TypeInt,
+ TypeLong,
+ TypeFloat,
+ TypeDouble,
+ // This is only used as a return type, so we should never convert from
+ // JavaScript with this type.
+ TypeVoid,
+ TypeArray,
+ // We special-case strings, as they get special handling when coercing.
+ TypeString,
+ TypeObject,
+ };
+
+ Type type;
+};
+
+#endif // CONTENT_BROWSER_RENDERER_HOST_JAVA_JAVA_TYPE_H_
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 8950974..048d10f 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -393,6 +393,8 @@
'browser/renderer_host/java/java_bridge_dispatcher_host.h',
'browser/renderer_host/java/java_method.cc',
'browser/renderer_host/java/java_method.h',
+ 'browser/renderer_host/java/java_type.cc',
+ 'browser/renderer_host/java/java_type.h',
'browser/renderer_host/media/audio_common.cc',
'browser/renderer_host/media/audio_common.h',
'browser/renderer_host/media/audio_input_device_manager.cc',
@@ -780,17 +782,8 @@
'ENABLE_JAVA_BRIDGE',
],
}, {
- 'sources!': [
- 'browser/renderer_host/java/java_bound_object.cc',
- 'browser/renderer_host/java/java_bound_object.h',
- 'browser/renderer_host/java/java_bridge_channel_host.cc',
- 'browser/renderer_host/java/java_bridge_channel_host.h',
- 'browser/renderer_host/java/java_bridge_dispatcher_host_manager.cc',
- 'browser/renderer_host/java/java_bridge_dispatcher_host_manager.h',
- 'browser/renderer_host/java/java_bridge_dispatcher_host.cc',
- 'browser/renderer_host/java/java_bridge_dispatcher_host.h',
- 'browser/renderer_host/java/java_method.cc',
- 'browser/renderer_host/java/java_method.h',
+ 'sources/': [
+ ['exclude', '^browser/renderer_host/java/'],
],
}],
],