summaryrefslogtreecommitdiff
path: root/chromium/content/browser/android/java/gin_java_method_invocation_helper.h
diff options
context:
space:
mode:
authorZeno Albisser <zeno.albisser@theqtcompany.com>2014-12-05 15:04:29 +0100
committerAndras Becsi <andras.becsi@theqtcompany.com>2014-12-09 10:49:28 +0100
commitaf6588f8d723931a298c995fa97259bb7f7deb55 (patch)
tree060ca707847ba1735f01af2372e0d5e494dc0366 /chromium/content/browser/android/java/gin_java_method_invocation_helper.h
parent2fff84d821cc7b1c785f6404e0f8091333283e74 (diff)
downloadqtwebengine-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.h117
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_