Index: content/browser/android/java/java_type.cc |
diff --git a/content/browser/android/java/java_type.cc b/content/browser/android/java/java_type.cc |
index c2808fecca164614050f5340bee4bf3ce9336014..5cd9b5454358afc37ec12352a6d7a9c5a68c19c2 100644 |
--- a/content/browser/android/java/java_type.cc |
+++ b/content/browser/android/java/java_type.cc |
@@ -5,53 +5,62 @@ |
#include "content/browser/android/java/java_type.h" |
#include "base/logging.h" |
+#include "base/strings/string_util.h" // For ReplaceSubstringsAfterOffset |
namespace content { |
namespace { |
-JavaType JavaTypeFromJNIName(const std::string& jni_name) { |
- JavaType result; |
- DCHECK(!jni_name.empty()); |
- switch (jni_name[0]) { |
+// Array component type names are similar to JNI type names, except for using |
+// dots as namespace separators in class names. |
+scoped_ptr<JavaType> CreateFromArrayComponentTypeName( |
+ const std::string& type_name) { |
+ scoped_ptr<JavaType> result(new JavaType()); |
+ DCHECK(!type_name.empty()); |
+ switch (type_name[0]) { |
case 'Z': |
- result.type = JavaType::TypeBoolean; |
+ result->type = JavaType::TypeBoolean; |
break; |
case 'B': |
- result.type = JavaType::TypeByte; |
+ result->type = JavaType::TypeByte; |
break; |
case 'C': |
- result.type = JavaType::TypeChar; |
+ result->type = JavaType::TypeChar; |
break; |
case 'S': |
- result.type = JavaType::TypeShort; |
+ result->type = JavaType::TypeShort; |
break; |
case 'I': |
- result.type = JavaType::TypeInt; |
+ result->type = JavaType::TypeInt; |
break; |
case 'J': |
- result.type = JavaType::TypeLong; |
+ result->type = JavaType::TypeLong; |
break; |
case 'F': |
- result.type = JavaType::TypeFloat; |
+ result->type = JavaType::TypeFloat; |
break; |
case 'D': |
- result.type = JavaType::TypeDouble; |
+ result->type = JavaType::TypeDouble; |
break; |
case '[': |
- result.type = JavaType::TypeArray; |
- // LIVECONNECT_COMPLIANCE: We don't support multi-dimensional arrays, so |
- // there's no need to populate the inner types. |
+ result->type = JavaType::TypeArray; |
+ result->inner_type = |
+ CreateFromArrayComponentTypeName(type_name.substr(1)); |
break; |
case 'L': |
- result.type = jni_name == "Ljava.lang.String;" ? |
- JavaType::TypeString : |
- JavaType::TypeObject; |
+ if (type_name == "Ljava.lang.String;") { |
+ result->type = JavaType::TypeString; |
+ result->class_jni_name = "java/lang/String"; |
+ } else { |
+ result->type = JavaType::TypeObject; |
+ result->class_jni_name = type_name.substr(1, type_name.length() - 2); |
+ ReplaceSubstringsAfterOffset(&result->class_jni_name, 0, ".", "/"); |
+ } |
break; |
default: |
// Includes void (V). |
NOTREACHED(); |
} |
- return result; |
+ return result.Pass(); |
} |
} // namespace |
@@ -67,6 +76,8 @@ JavaType::~JavaType() { |
} |
JavaType& JavaType::operator=(const JavaType& other) { |
+ if (this == &other) |
+ return *this; |
type = other.type; |
if (other.inner_type) { |
DCHECK_EQ(JavaType::TypeArray, type); |
@@ -74,9 +85,11 @@ JavaType& JavaType::operator=(const JavaType& other) { |
} else { |
inner_type.reset(); |
} |
+ class_jni_name = other.class_jni_name; |
return *this; |
} |
+// static |
JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) { |
JavaType result; |
DCHECK(!binary_name.empty()); |
@@ -100,15 +113,53 @@ JavaType JavaType::CreateFromBinaryName(const std::string& binary_name) { |
result.type = JavaType::TypeVoid; |
} else if (binary_name[0] == '[') { |
result.type = JavaType::TypeArray; |
- // The inner type of an array is represented in JNI format. |
- result.inner_type.reset(new JavaType(JavaTypeFromJNIName( |
- binary_name.substr(1)))); |
+ result.inner_type = CreateFromArrayComponentTypeName(binary_name.substr(1)); |
} else if (binary_name == "java.lang.String") { |
result.type = JavaType::TypeString; |
+ result.class_jni_name = "java/lang/String"; |
} else { |
result.type = JavaType::TypeObject; |
+ result.class_jni_name = binary_name; |
+ ReplaceSubstringsAfterOffset(&result.class_jni_name, 0, ".", "/"); |
} |
return result; |
} |
+std::string JavaType::JNIName() const { |
+ switch (type) { |
+ case JavaType::TypeBoolean: |
+ return "Z"; |
+ case JavaType::TypeByte: |
+ return "B"; |
+ case JavaType::TypeChar: |
+ return "C"; |
+ case JavaType::TypeShort: |
+ return "S"; |
+ case JavaType::TypeInt: |
+ return "I"; |
+ case JavaType::TypeLong: |
+ return "J"; |
+ case JavaType::TypeFloat: |
+ return "F"; |
+ case JavaType::TypeDouble: |
+ return "D"; |
+ case JavaType::TypeVoid: |
+ return "V"; |
+ case JavaType::TypeArray: |
+ return "[" + inner_type->JNISignature(); |
+ case JavaType::TypeString: |
+ case JavaType::TypeObject: |
+ return class_jni_name; |
+ } |
+ NOTREACHED(); |
+ return std::string(); |
+} |
+ |
+std::string JavaType::JNISignature() const { |
+ if (type == JavaType::TypeString || type == JavaType::TypeObject) |
+ return "L" + JNIName() + ";"; |
+ else |
+ return JNIName(); |
+} |
+ |
} // namespace content |