Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(266)

Side by Side Diff: android_webview/native/callback_jni_bridge.h

Issue 12313042: [android_webview] Add a generic callback JNI bridge. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_
6 #define ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_
7
8 #include "base/android/jni_android.h"
9 #include "base/android/scoped_java_ref.h"
10 #include "base/bind.h"
11 #include "base/callback.h"
12
13 namespace android_webview {
14
15 // This class facilitates delegating callback method invocations across the JNI
16 // boundary.
17 // For more details and examples please see the Java class documentation.
18 class CallbackJNIBridge {
19 private:
mkosiba (inactive) 2013/02/25 23:43:44 uh.. torn between this and an 'internal' namespace
20 typedef base::android::ScopedJavaLocalRef<jobject> ScopedJobject;
21
22 template <typename TTO, typename TFROM>
23 static void CallbackConverterHelper(base::Callback<void(TTO)> callback,
24 base::Callback<TTO(TFROM)> converter,
25 TFROM value) {
26 callback.Run(converter.Run(value));
27 }
28
29 public:
30 // Creates a base::Callback the Run() method of which will delegate to the
31 // onReceiveValue method of the Java-side |jvalue_callback| object.
32 // The argument passed to the Java |jvalue_callback| onReceiveValue method
33 // will be derived by running the |converter| on the value supplied to the
34 // Run() method of the returned callback.
35 //
36 // NOTES:
37 //
38 // The returned callback will hold a global reference to the Java object, so
39 // the return value should not be stored for as short a time as possible.
40 //
41 // The |converter| callback's .Run method will be invoked at the same time as
42 // the returned callback's .Run method.
43 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
44 static base::Callback<void(N)> FromJavaCallback(
45 JNIEnv* env,
46 const ScopedJobject& jvalue_callback,
47 base::Callback<base::android::ScopedJavaLocalRef<J>(N)> converter) {
48 return base::Bind(&CallbackJNIBridge::CallbackConverterHelper<
49 base::android::ScopedJavaLocalRef<J>,
50 N>,
51 FromJavaCallbackObj(env, jvalue_callback),
52 converter);
53 }
54
55 // Specializations for basic JNI types.
56 static base::Callback<void(int)> FromJavaCallbackInt(
57 JNIEnv* env,
58 const ScopedJobject& jvalue_callback);
59 static base::Callback<void(long)> FromJavaCallbackLong(
60 JNIEnv* env,
61 const ScopedJobject& jvalue_callback);
62 static base::Callback<void(bool)> FromJavaCallbackBool(
63 JNIEnv* env,
64 const ScopedJobject& jvalue_callback);
65 static base::Callback<void(ScopedJobject)> FromJavaCallbackObj(
66 JNIEnv* env,
67 const ScopedJobject& jvalue_callback);
68
69 // Creates a Java object (an instance that implements the ValueCallback
70 // interface) the onReceiveValue method of which will delegate to the
71 // supplied |callback|. The input value provided to |callback|.Run is derived
72 // by applying |covnerter| to the Java object.
73 //
74 // NOTES:
75 //
76 // The |callback| will normally be deleted after onReceiveValue is called
77 // Java-side meaning that the returned ValueCallback is "one-shot".
78 //
79 // If the Java-side callback's onReceiveValue method is never invoked
80 // and the Java-side callback is GC'd |callback| will be deleted as a
81 // consequence of that.
82 template <typename N>
83 static ScopedJobject ToJavaCallback(
84 JNIEnv* env,
85 const base::Callback<void(N)>& callback,
86 base::Callback<N(ScopedJobject)> converter) {
mkosiba (inactive) 2013/02/25 23:43:44 now this is going to be fun - since we always get
87 return ToJavaCallbackObj(
88 env,
89 base::Bind(&CallbackJNIBridge::CallbackConverterHelper<N,
90 ScopedJobject>,
91 callback,
92 converter));
93 }
94
95 // Specializations for basic JNI types.
96 static ScopedJobject ToJavaCallbackInt(
97 JNIEnv* env,
98 const base::Callback<void(int)>& callback);
99 static ScopedJobject ToJavaCallbackLong(
100 JNIEnv* env,
101 const base::Callback<void(long)>& callback);
102 static ScopedJobject ToJavaCallbackBool(
103 JNIEnv* env,
104 const base::Callback<void(bool)>& callback);
105 static ScopedJobject ToJavaCallbackObj(
106 JNIEnv* env,
107 const base::Callback<void(ScopedJobject)>& callback);
108
109 private:
110 CallbackJNIBridge();
111
112 DISALLOW_COPY_AND_ASSIGN(CallbackJNIBridge);
113 };
114
115 bool RegisterCallbackJNIBridge(JNIEnv* env);
116
117 } // namespace android_webview
118
119 #endif // ANDROID_WEBVIEW_NATIVE_JAVA_CALLBACK_BRIDGE_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698