diff options
-rw-r--r-- | content/browser/renderer_host/java/java_bound_object.cc | 40 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_method.cc | 43 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_method.h | 29 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_type.cc | 35 | ||||
-rw-r--r-- | content/browser/renderer_host/java/java_type.h | 36 | ||||
-rw-r--r-- | content/content_browser.gypi | 15 |
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/'], ], }], ], |