diff options
author | Zeno Albisser <zeno.albisser@theqtcompany.com> | 2014-12-05 15:04:29 +0100 |
---|---|---|
committer | Andras Becsi <andras.becsi@theqtcompany.com> | 2014-12-09 10:49:28 +0100 |
commit | af6588f8d723931a298c995fa97259bb7f7deb55 (patch) | |
tree | 060ca707847ba1735f01af2372e0d5e494dc0366 /chromium/content/browser/android/java/gin_java_method_invocation_helper.h | |
parent | 2fff84d821cc7b1c785f6404e0f8091333283e74 (diff) | |
download | qtwebengine-chromium-af6588f8d723931a298c995fa97259bb7f7deb55.tar.gz |
BASELINE: Update chromium to 40.0.2214.28 and ninja to 1.5.3.
Change-Id: I759465284fd64d59ad120219cbe257f7402c4181
Reviewed-by: Andras Becsi <andras.becsi@theqtcompany.com>
Diffstat (limited to 'chromium/content/browser/android/java/gin_java_method_invocation_helper.h')
-rw-r--r-- | chromium/content/browser/android/java/gin_java_method_invocation_helper.h | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/chromium/content/browser/android/java/gin_java_method_invocation_helper.h b/chromium/content/browser/android/java/gin_java_method_invocation_helper.h new file mode 100644 index 00000000000..014e3113194 --- /dev/null +++ b/chromium/content/browser/android/java/gin_java_method_invocation_helper.h @@ -0,0 +1,117 @@ +// 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. + +#ifndef CONTENT_BROWSER_ANDROID_JAVA_GIN_JAVA_METHOD_INVOCATION_HELPER_H_ +#define CONTENT_BROWSER_ANDROID_JAVA_GIN_JAVA_METHOD_INVOCATION_HELPER_H_ + +#include <map> + +#include "base/android/jni_weak_ref.h" +#include "base/android/scoped_java_ref.h" +#include "base/memory/ref_counted.h" +#include "base/values.h" +#include "content/browser/android/java/gin_java_bound_object.h" +#include "content/browser/android/java/java_type.h" +#include "content/common/android/gin_java_bridge_errors.h" +#include "content/common/content_export.h" + +namespace content { + +class JavaMethod; + +// Instances of this class are created and initialized on the UI thread, do +// their work on the background thread, and then again examined on the UI +// thread. They don't work on both threads simultaneously, though. +class CONTENT_EXPORT GinJavaMethodInvocationHelper + : public base::RefCountedThreadSafe<GinJavaMethodInvocationHelper> { + public: + // DispatcherDelegate is used on the UI thread + class DispatcherDelegate { + public: + DispatcherDelegate() {} + virtual ~DispatcherDelegate() {} + virtual JavaObjectWeakGlobalRef GetObjectWeakRef( + GinJavaBoundObject::ObjectID object_id) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(DispatcherDelegate); + }; + + // ObjectDelegate is used in the background thread + class ObjectDelegate { + public: + ObjectDelegate() {} + virtual ~ObjectDelegate() {} + virtual base::android::ScopedJavaLocalRef<jobject> GetLocalRef( + JNIEnv* env) = 0; + virtual base::android::ScopedJavaLocalRef<jclass> GetLocalClassRef( + JNIEnv* env) = 0; + virtual const JavaMethod* FindMethod(const std::string& method_name, + size_t num_parameters) = 0; + virtual bool IsObjectGetClassMethod(const JavaMethod* method) = 0; + virtual const base::android::JavaRef<jclass>& GetSafeAnnotationClass() = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(ObjectDelegate); + }; + + GinJavaMethodInvocationHelper(scoped_ptr<ObjectDelegate> object, + const std::string& method_name, + const base::ListValue& arguments); + void Init(DispatcherDelegate* dispatcher); + + // Called on the background thread + void Invoke(); + + // Called on the UI thread + bool HoldsPrimitiveResult(); + const base::ListValue& GetPrimitiveResult(); + const base::android::JavaRef<jobject>& GetObjectResult(); + const base::android::JavaRef<jclass>& GetSafeAnnotationClass(); + const GinJavaBridgeError GetInvocationError(); + + private: + friend class base::RefCountedThreadSafe<GinJavaMethodInvocationHelper>; + ~GinJavaMethodInvocationHelper(); + + // Called on the UI thread + void BuildObjectRefsFromListValue(DispatcherDelegate* dispatcher, + const base::Value* list_value); + void BuildObjectRefsFromDictionaryValue(DispatcherDelegate* dispatcher, + const base::Value* dict_value); + + bool AppendObjectRef(DispatcherDelegate* dispatcher, + const base::Value* raw_value); + + // Called on the background thread. + void InvokeMethod(jobject object, + jclass clazz, + const JavaType& return_type, + jmethodID id, + jvalue* parameters); + void SetInvocationError(GinJavaBridgeError error); + void SetPrimitiveResult(const base::ListValue& result_wrapper); + void SetObjectResult( + const base::android::JavaRef<jobject>& object, + const base::android::JavaRef<jclass>& safe_annotation_clazz); + + typedef std::map<GinJavaBoundObject::ObjectID, + JavaObjectWeakGlobalRef> ObjectRefs; + + scoped_ptr<ObjectDelegate> object_; + const std::string method_name_; + scoped_ptr<base::ListValue> arguments_; + ObjectRefs object_refs_; + bool holds_primitive_result_; + scoped_ptr<base::ListValue> primitive_result_; + GinJavaBridgeError invocation_error_; + base::android::ScopedJavaGlobalRef<jobject> object_result_; + base::android::ScopedJavaGlobalRef<jclass> safe_annotation_clazz_; + + DISALLOW_COPY_AND_ASSIGN(GinJavaMethodInvocationHelper); +}; + +} // namespace content + +#endif // CONTENT_BROWSER_ANDROID_JAVA_GIN_JAVA_METHOD_INVOCATION_HELPER_H_ |