Skip to content

Commit 5028d48

Browse files
sebmarkbagefacebook-github-bot
authored andcommitted
Wire up event handler bindings
Reviewed By: mdvacca Differential Revision: D8048409 fbshipit-source-id: 5706130607302b4be2287cc303def7c2fb398bc8
1 parent f180300 commit 5028d48

File tree

4 files changed

+98
-1
lines changed

4 files changed

+98
-1
lines changed

Diff for: ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java

+4
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ public FabricUIManager(
7171
mFabricReconciler = new FabricReconciler(mUIViewOperationQueue);
7272
}
7373

74+
public void registerEventHandler(long eventHandlerPointer) {
75+
// TODO: Release this event handler at some point.
76+
}
77+
7478
/** Creates a new {@link ReactShadowNode} */
7579
@Nullable
7680
public ReactShadowNode createNode(

Diff for: ReactAndroid/src/main/java/com/facebook/react/fabric/jsc/FabricJSCBinding.java

+11
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.facebook.react.bridge.JavaScriptContextHolder;
1313
import com.facebook.react.fabric.FabricBinding;
1414
import com.facebook.react.fabric.FabricUIManager;
15+
import com.facebook.react.bridge.NativeMap;
1516
import com.facebook.soloader.SoLoader;
1617

1718
@DoNotStrip
@@ -31,6 +32,16 @@ public class FabricJSCBinding implements FabricBinding {
3132

3233
private native void releaseEventTarget(long jsContextNativePointer, long eventTargetPointer);
3334

35+
private native void releaseEventHandler(long jsContextNativePointer, long eventHandlerPointer);
36+
37+
private native void dispatchEventToTarget(
38+
long jsContextNativePointer,
39+
long eventHandlerPointer,
40+
long eventTargetPointer,
41+
String type,
42+
NativeMap payload
43+
);
44+
3445
private native void installFabric(long jsContextNativePointer, Object fabricModule);
3546

3647
public FabricJSCBinding() {

Diff for: ReactAndroid/src/main/java/com/facebook/react/fabric/jsc/jni/FabricJSCBinding.cpp

+72-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
#include "FabricJSCBinding.h"
99
#include <fb/fbjni.h>
10-
#include <react/jni/ReadableNativeMap.h>
1110
#include <jschelpers/JavaScriptCore.h>
1211
#include <jschelpers/Unicode.h>
1312

@@ -81,6 +80,15 @@ local_ref<ReadableNativeMap::jhybridobject> JSValueToReadableMapViaJSON(JSContex
8180
return ReadableNativeMap::newObjectCxxArgs(std::move(dynamicValue));
8281
}
8382

83+
JSValueRef ReadableMapToJSValueViaJSON(JSContextRef ctx, NativeMap *map) {
84+
folly::dynamic dynamicValue = map->consume();
85+
auto json = folly::toJson(dynamicValue);
86+
JSStringRef jsonRef = JSC_JSStringCreateWithUTF8CString(ctx, json.c_str());
87+
auto value = JSC_JSValueMakeFromJSONString(ctx, jsonRef);
88+
JSC_JSStringRelease(ctx, jsonRef);
89+
return value;
90+
}
91+
8492
JSValueRef createNode(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) {
8593
FabricJSCUIManager *managerWrapper = (FabricJSCUIManager *)JSC_JSObjectGetPrivate(useCustomJSC, function);
8694
alias_ref<jobject> manager = managerWrapper->fabricUiManager;
@@ -231,6 +239,21 @@ JSValueRef completeRoot(JSContextRef ctx, JSObjectRef function, JSObjectRef this
231239
return JSC_JSValueMakeUndefined(ctx);
232240
}
233241

242+
JSValueRef registerEventHandler(JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) {
243+
FabricJSCUIManager *managerWrapper = (FabricJSCUIManager *)JSC_JSObjectGetPrivate(useCustomJSC, function);
244+
alias_ref<jobject> manager = managerWrapper->fabricUiManager;
245+
246+
static auto registerEventHandler =
247+
jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
248+
->getMethod<void(jlong)>("registerEventHandler");
249+
250+
auto eventHandler = arguments[0];
251+
JSC_JSValueProtect(ctx, eventHandler);
252+
registerEventHandler(manager, (jlong)eventHandler);
253+
254+
return JSC_JSValueMakeUndefined(ctx);
255+
}
256+
234257
void finalizeJNIObject(JSObjectRef object) {
235258
// Release whatever global ref object we're storing here.
236259
jobject globalRef = (jobject)JSC_JSObjectGetPrivate(useCustomJSC, object);
@@ -291,6 +314,47 @@ void FabricJSCBinding::releaseEventTarget(
291314
JSC_JSValueUnprotect(context, value);
292315
}
293316

317+
void FabricJSCBinding::releaseEventHandler(
318+
jlong jsContextNativePointer,
319+
jlong eventHandlerPointer
320+
) {
321+
JSContextRef context = (JSContextRef)jsContextNativePointer;
322+
JSValueRef value = (JSValueRef)((void *)eventHandlerPointer);
323+
// Release this function.
324+
JSC_JSValueUnprotect(context, value);
325+
}
326+
327+
void FabricJSCBinding::dispatchEventToTarget(
328+
jlong jsContextNativePointer,
329+
jlong eventHandlerPointer,
330+
jlong eventTargetPointer,
331+
std::string type,
332+
NativeMap *payloadMap
333+
) {
334+
JSContextRef context = (JSContextRef)jsContextNativePointer;
335+
JSObjectRef eventHandler = (JSObjectRef)((void *)eventHandlerPointer);
336+
JSObjectRef eventTarget = (JSObjectRef)((void *)eventTargetPointer);
337+
338+
JSObjectRef thisArg = (JSObjectRef)JSC_JSValueMakeUndefined(context);
339+
JSStringRef typeStr = JSC_JSStringCreateWithUTF8CString(context, type.c_str());
340+
JSValueRef typeRef = JSC_JSValueMakeString(context, typeStr);
341+
JSC_JSStringRelease(context, typeStr);
342+
JSValueRef payloadRef = ReadableMapToJSValueViaJSON(context, payloadMap);
343+
JSValueRef args[] = {eventTarget, typeRef, payloadRef};
344+
JSValueRef exn;
345+
JSValueRef result = JSC_JSObjectCallAsFunction(
346+
context,
347+
eventHandler,
348+
thisArg,
349+
3,
350+
args,
351+
&exn
352+
);
353+
if (!result) {
354+
// TODO: Handle error in exn
355+
}
356+
}
357+
294358
void FabricJSCBinding::installFabric(jlong jsContextNativePointer,
295359
jni::alias_ref<jobject> fabricModule) {
296360
JSContextRef context = (JSContextRef)jsContextNativePointer;
@@ -308,11 +372,14 @@ void FabricJSCBinding::installFabric(jlong jsContextNativePointer,
308372
addFabricMethod(context, fabricModule, classRef, module, "cloneNodeWithNewChildren", cloneNodeWithNewChildren);
309373
addFabricMethod(context, fabricModule, classRef, module, "cloneNodeWithNewProps", cloneNodeWithNewProps);
310374
addFabricMethod(context, fabricModule, classRef, module, "cloneNodeWithNewChildrenAndProps", cloneNodeWithNewChildrenAndProps);
375+
311376
addFabricMethod(context, fabricModule, classRef, module, "appendChild", appendChild);
312377
addFabricMethod(context, fabricModule, classRef, module, "createChildSet", createChildSet);
313378
addFabricMethod(context, fabricModule, classRef, module, "appendChildToSet", appendChildToSet);
314379
addFabricMethod(context, fabricModule, classRef, module, "completeRoot", completeRoot);
315380

381+
addFabricMethod(context, fabricModule, classRef, module, "registerEventHandler", registerEventHandler);
382+
316383
JSC_JSClassRelease(useCustomJSC, classRef);
317384

318385
JSObjectRef globalObject = JSC_JSContextGetGlobalObject(context);
@@ -325,6 +392,10 @@ void FabricJSCBinding::registerNatives() {
325392
registerHybrid({
326393
makeNativeMethod("initHybrid", FabricJSCBinding::initHybrid),
327394
makeNativeMethod("installFabric", FabricJSCBinding::installFabric),
395+
makeNativeMethod("createEventTarget", FabricJSCBinding::createEventTarget),
396+
makeNativeMethod("releaseEventTarget", FabricJSCBinding::releaseEventTarget),
397+
makeNativeMethod("releaseEventHandler", FabricJSCBinding::releaseEventHandler),
398+
makeNativeMethod("dispatchEventToTarget", FabricJSCBinding::dispatchEventToTarget),
328399
});
329400
}
330401

Diff for: ReactAndroid/src/main/java/com/facebook/react/fabric/jsc/jni/FabricJSCBinding.h

+11
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include <memory>
1111
#include <fb/fbjni.h>
12+
#include <react/jni/ReadableNativeMap.h>
1213

1314
namespace facebook {
1415
namespace react {
@@ -30,6 +31,16 @@ class FabricJSCBinding : public jni::HybridClass<FabricJSCBinding> {
3031

3132
void releaseEventTarget(jlong jsContextNativePointer, jlong eventTargetPointer);
3233

34+
void releaseEventHandler(jlong jsContextNativePointer, jlong eventHandlerPointer);
35+
36+
void dispatchEventToTarget(
37+
jlong jsContextNativePointer,
38+
jlong eventHandlerPointer,
39+
jlong eventTargetPointer,
40+
std::string type,
41+
NativeMap *payload
42+
);
43+
3344
void installFabric(jlong jsContextNativePointer, jni::alias_ref<jobject> fabricModule);
3445

3546
};

0 commit comments

Comments
 (0)