Index: android_webview/native/callback_jni_bridge.h |
diff --git a/android_webview/native/callback_jni_bridge.h b/android_webview/native/callback_jni_bridge.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..c8b14dea5d754cf03b2f70e660a59dc3f696da51 |
--- /dev/null |
+++ b/android_webview/native/callback_jni_bridge.h |
@@ -0,0 +1,119 @@ |
+// Copyright 2013 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 ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_ |
+#define ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_ |
+ |
+#include "base/android/jni_android.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "base/bind.h" |
+#include "base/callback.h" |
+ |
+namespace android_webview { |
+ |
+// This class facilitates delegating callback method invocations across the JNI |
+// boundary. |
+// For more details and examples please see the Java class documentation. |
+class CallbackJNIBridge { |
+ private: |
mkosiba (inactive)
2013/02/25 23:43:44
uh.. torn between this and an 'internal' namespace
|
+ typedef base::android::ScopedJavaLocalRef<jobject> ScopedJobject; |
+ |
+ template <typename TTO, typename TFROM> |
+ static void CallbackConverterHelper(base::Callback<void(TTO)> callback, |
+ base::Callback<TTO(TFROM)> converter, |
+ TFROM value) { |
+ callback.Run(converter.Run(value)); |
+ } |
+ |
+ public: |
+ // Creates a base::Callback the Run() method of which will delegate to the |
+ // onReceiveValue method of the Java-side |jvalue_callback| object. |
+ // The argument passed to the Java |jvalue_callback| onReceiveValue method |
+ // will be derived by running the |converter| on the value supplied to the |
+ // Run() method of the returned callback. |
+ // |
+ // NOTES: |
+ // |
+ // The returned callback will hold a global reference to the Java object, so |
+ // the return value should not be stored for as short a time as possible. |
+ // |
+ // The |converter| callback's .Run method will be invoked at the same time as |
+ // the returned callback's .Run method. |
+ template <typename N, typename J> |
mkosiba (inactive)
2013/02/25 23:43:44
as you'll see in the unittest code converting to a
joth
2013/02/26 00:13:45
Name N and J something more descriptive like above
|
+ static base::Callback<void(N)> FromJavaCallback( |
+ JNIEnv* env, |
+ const ScopedJobject& jvalue_callback, |
+ base::Callback<base::android::ScopedJavaLocalRef<J>(N)> converter) { |
+ return base::Bind(&CallbackJNIBridge::CallbackConverterHelper< |
+ base::android::ScopedJavaLocalRef<J>, |
+ N>, |
+ FromJavaCallbackObj(env, jvalue_callback), |
+ converter); |
+ } |
+ |
+ // Specializations for basic JNI types. |
+ static base::Callback<void(int)> FromJavaCallbackInt( |
+ JNIEnv* env, |
+ const ScopedJobject& jvalue_callback); |
+ static base::Callback<void(long)> FromJavaCallbackLong( |
+ JNIEnv* env, |
+ const ScopedJobject& jvalue_callback); |
+ static base::Callback<void(bool)> FromJavaCallbackBool( |
+ JNIEnv* env, |
+ const ScopedJobject& jvalue_callback); |
+ static base::Callback<void(ScopedJobject)> FromJavaCallbackObj( |
+ JNIEnv* env, |
+ const ScopedJobject& jvalue_callback); |
+ |
+ // Creates a Java object (an instance that implements the ValueCallback |
+ // interface) the onReceiveValue method of which will delegate to the |
+ // supplied |callback|. The input value provided to |callback|.Run is derived |
+ // by applying |covnerter| to the Java object. |
+ // |
+ // NOTES: |
+ // |
+ // The |callback| will normally be deleted after onReceiveValue is called |
+ // Java-side meaning that the returned ValueCallback is "one-shot". |
+ // |
+ // If the Java-side callback's onReceiveValue method is never invoked |
+ // and the Java-side callback is GC'd |callback| will be deleted as a |
+ // consequence of that. |
+ template <typename N> |
+ static ScopedJobject ToJavaCallback( |
+ JNIEnv* env, |
+ const base::Callback<void(N)>& callback, |
+ base::Callback<N(ScopedJobject)> converter) { |
mkosiba (inactive)
2013/02/25 23:43:44
now this is going to be fun - since we always get
|
+ return ToJavaCallbackObj( |
+ env, |
+ base::Bind(&CallbackJNIBridge::CallbackConverterHelper<N, |
+ ScopedJobject>, |
+ callback, |
+ converter)); |
+ } |
+ |
+ // Specializations for basic JNI types. |
+ static ScopedJobject ToJavaCallbackInt( |
+ JNIEnv* env, |
+ const base::Callback<void(int)>& callback); |
+ static ScopedJobject ToJavaCallbackLong( |
+ JNIEnv* env, |
+ const base::Callback<void(long)>& callback); |
+ static ScopedJobject ToJavaCallbackBool( |
+ JNIEnv* env, |
+ const base::Callback<void(bool)>& callback); |
+ static ScopedJobject ToJavaCallbackObj( |
+ JNIEnv* env, |
+ const base::Callback<void(ScopedJobject)>& callback); |
+ |
+ private: |
+ CallbackJNIBridge(); |
+ |
+ DISALLOW_COPY_AND_ASSIGN(CallbackJNIBridge); |
+}; |
+ |
+bool RegisterCallbackJNIBridge(JNIEnv* env); |
+ |
+} // namespace android_webview |
+ |
+#endif // ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_ |