| Index: content/browser/renderer_host/java/gin_java_bound_object.cc
|
| diff --git a/content/browser/renderer_host/java/gin_java_bound_object.cc b/content/browser/renderer_host/java/gin_java_bound_object.cc
|
| deleted file mode 100644
|
| index 70abba842c90bbc2497cc50cec74512abc0a56de..0000000000000000000000000000000000000000
|
| --- a/content/browser/renderer_host/java/gin_java_bound_object.cc
|
| +++ /dev/null
|
| @@ -1,192 +0,0 @@
|
| -// Copyright 2014 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/gin_java_bound_object.h"
|
| -
|
| -#include "base/android/jni_android.h"
|
| -#include "base/android/jni_string.h"
|
| -#include "base/android/scoped_java_ref.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "content/browser/renderer_host/java/jni_helper.h"
|
| -
|
| -using base::android::AttachCurrentThread;
|
| -using base::android::ScopedJavaLocalRef;
|
| -
|
| -namespace content {
|
| -
|
| -namespace {
|
| -
|
| -const char kJavaLangClass[] = "java/lang/Class";
|
| -const char kJavaLangObject[] = "java/lang/Object";
|
| -const char kJavaLangReflectMethod[] = "java/lang/reflect/Method";
|
| -const char kGetClass[] = "getClass";
|
| -const char kGetMethods[] = "getMethods";
|
| -const char kIsAnnotationPresent[] = "isAnnotationPresent";
|
| -const char kReturningJavaLangClass[] = "()Ljava/lang/Class;";
|
| -const char kReturningJavaLangReflectMethodArray[] =
|
| - "()[Ljava/lang/reflect/Method;";
|
| -const char kTakesJavaLangClassReturningBoolean[] = "(Ljava/lang/Class;)Z";
|
| -
|
| -} // namespace
|
| -
|
| -
|
| -// static
|
| -GinJavaBoundObject* GinJavaBoundObject::CreateNamed(
|
| - const JavaObjectWeakGlobalRef& ref,
|
| - const base::android::JavaRef<jclass>& safe_annotation_clazz) {
|
| - return new GinJavaBoundObject(ref, safe_annotation_clazz);
|
| -}
|
| -
|
| -// static
|
| -GinJavaBoundObject* GinJavaBoundObject::CreateTransient(
|
| - const JavaObjectWeakGlobalRef& ref,
|
| - const base::android::JavaRef<jclass>& safe_annotation_clazz,
|
| - RenderFrameHost* holder) {
|
| - std::set<RenderFrameHost*> holders;
|
| - holders.insert(holder);
|
| - return new GinJavaBoundObject(ref, safe_annotation_clazz, holders);
|
| -}
|
| -
|
| -GinJavaBoundObject::GinJavaBoundObject(
|
| - const JavaObjectWeakGlobalRef& ref,
|
| - const base::android::JavaRef<jclass>& safe_annotation_clazz)
|
| - : ref_(ref),
|
| - names_count_(1),
|
| - object_get_class_method_id_(NULL),
|
| - are_methods_set_up_(false),
|
| - safe_annotation_clazz_(safe_annotation_clazz) {
|
| -}
|
| -
|
| -GinJavaBoundObject::GinJavaBoundObject(
|
| - const JavaObjectWeakGlobalRef& ref,
|
| - const base::android::JavaRef<jclass>& safe_annotation_clazz,
|
| - const std::set<RenderFrameHost*> holders)
|
| - : ref_(ref),
|
| - names_count_(0),
|
| - holders_(holders),
|
| - object_get_class_method_id_(NULL),
|
| - are_methods_set_up_(false),
|
| - safe_annotation_clazz_(safe_annotation_clazz) {
|
| -}
|
| -
|
| -GinJavaBoundObject::~GinJavaBoundObject() {
|
| -}
|
| -
|
| -std::set<std::string> GinJavaBoundObject::GetMethodNames() {
|
| - EnsureMethodsAreSetUp();
|
| - std::set<std::string> result;
|
| - for (JavaMethodMap::const_iterator it = methods_.begin();
|
| - it != methods_.end();
|
| - ++it) {
|
| - result.insert(it->first);
|
| - }
|
| - return result;
|
| -}
|
| -
|
| -bool GinJavaBoundObject::HasMethod(const std::string& method_name) {
|
| - EnsureMethodsAreSetUp();
|
| - return methods_.find(method_name) != methods_.end();
|
| -}
|
| -
|
| -const JavaMethod* GinJavaBoundObject::FindMethod(
|
| - const std::string& method_name,
|
| - size_t num_parameters) {
|
| - EnsureMethodsAreSetUp();
|
| -
|
| - // Get all methods with the correct name.
|
| - std::pair<JavaMethodMap::const_iterator, JavaMethodMap::const_iterator>
|
| - iters = methods_.equal_range(method_name);
|
| - if (iters.first == iters.second) {
|
| - return NULL;
|
| - }
|
| -
|
| - // LIVECONNECT_COMPLIANCE: We just take the first method with the correct
|
| - // number of arguments, while the spec proposes using cost-based algorithm:
|
| - // https://jdk6.java.net/plugin2/liveconnect/#OVERLOADED_METHODS
|
| - for (JavaMethodMap::const_iterator iter = iters.first; iter != iters.second;
|
| - ++iter) {
|
| - if (iter->second->num_parameters() == num_parameters) {
|
| - return iter->second.get();
|
| - }
|
| - }
|
| -
|
| - return NULL;
|
| -}
|
| -
|
| -bool GinJavaBoundObject::IsObjectGetClassMethod(const JavaMethod* method) {
|
| - EnsureMethodsAreSetUp();
|
| - // As java.lang.Object.getClass is declared to be final, it is sufficient to
|
| - // compare methodIDs.
|
| - return method->id() == object_get_class_method_id_;
|
| -}
|
| -
|
| -const base::android::JavaRef<jclass>&
|
| -GinJavaBoundObject::GetSafeAnnotationClass() {
|
| - return safe_annotation_clazz_;
|
| -}
|
| -
|
| -base::android::ScopedJavaLocalRef<jclass> GinJavaBoundObject::GetLocalClassRef(
|
| - JNIEnv* env) {
|
| - if (!object_get_class_method_id_) {
|
| - object_get_class_method_id_ = GetMethodIDFromClassName(
|
| - env, kJavaLangObject, kGetClass, kReturningJavaLangClass);
|
| - }
|
| - ScopedJavaLocalRef<jobject> obj = GetLocalRef(env);
|
| - if (obj.obj()) {
|
| - return base::android::ScopedJavaLocalRef<jclass>(
|
| - env,
|
| - static_cast<jclass>(
|
| - env->CallObjectMethod(obj.obj(), object_get_class_method_id_)));
|
| - } else {
|
| - return base::android::ScopedJavaLocalRef<jclass>();
|
| - }
|
| -}
|
| -
|
| -void GinJavaBoundObject::EnsureMethodsAreSetUp() {
|
| - if (are_methods_set_up_)
|
| - return;
|
| - are_methods_set_up_ = true;
|
| -
|
| - JNIEnv* env = AttachCurrentThread();
|
| -
|
| - ScopedJavaLocalRef<jclass> clazz = GetLocalClassRef(env);
|
| - if (clazz.is_null()) {
|
| - return;
|
| - }
|
| -
|
| - ScopedJavaLocalRef<jobjectArray> methods(env, static_cast<jobjectArray>(
|
| - env->CallObjectMethod(clazz.obj(), GetMethodIDFromClassName(
|
| - env,
|
| - kJavaLangClass,
|
| - kGetMethods,
|
| - kReturningJavaLangReflectMethodArray))));
|
| -
|
| - size_t num_methods = env->GetArrayLength(methods.obj());
|
| - // Java objects always have public methods.
|
| - DCHECK(num_methods);
|
| -
|
| - for (size_t i = 0; i < num_methods; ++i) {
|
| - ScopedJavaLocalRef<jobject> java_method(
|
| - env,
|
| - env->GetObjectArrayElement(methods.obj(), i));
|
| -
|
| - if (!safe_annotation_clazz_.is_null()) {
|
| - jboolean safe = env->CallBooleanMethod(java_method.obj(),
|
| - GetMethodIDFromClassName(
|
| - env,
|
| - kJavaLangReflectMethod,
|
| - kIsAnnotationPresent,
|
| - kTakesJavaLangClassReturningBoolean),
|
| - safe_annotation_clazz_.obj());
|
| -
|
| - if (!safe)
|
| - continue;
|
| - }
|
| -
|
| - JavaMethod* method = new JavaMethod(java_method);
|
| - methods_.insert(std::make_pair(method->name(), method));
|
| - }
|
| -}
|
| -
|
| -} // namespace content
|
|
|