7
7
8
8
#include " FabricJSCBinding.h"
9
9
#include < fb/fbjni.h>
10
- #include < react/jni/ReadableNativeMap.h>
11
10
#include < jschelpers/JavaScriptCore.h>
12
11
#include < jschelpers/Unicode.h>
13
12
@@ -81,6 +80,15 @@ local_ref<ReadableNativeMap::jhybridobject> JSValueToReadableMapViaJSON(JSContex
81
80
return ReadableNativeMap::newObjectCxxArgs (std::move (dynamicValue));
82
81
}
83
82
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
+
84
92
JSValueRef createNode (JSContextRef ctx, JSObjectRef function, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception ) {
85
93
FabricJSCUIManager *managerWrapper = (FabricJSCUIManager *)JSC_JSObjectGetPrivate (useCustomJSC, function);
86
94
alias_ref<jobject> manager = managerWrapper->fabricUiManager ;
@@ -231,6 +239,21 @@ JSValueRef completeRoot(JSContextRef ctx, JSObjectRef function, JSObjectRef this
231
239
return JSC_JSValueMakeUndefined (ctx);
232
240
}
233
241
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
+
234
257
void finalizeJNIObject (JSObjectRef object) {
235
258
// Release whatever global ref object we're storing here.
236
259
jobject globalRef = (jobject)JSC_JSObjectGetPrivate (useCustomJSC, object);
@@ -291,6 +314,47 @@ void FabricJSCBinding::releaseEventTarget(
291
314
JSC_JSValueUnprotect (context, value);
292
315
}
293
316
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
+
294
358
void FabricJSCBinding::installFabric (jlong jsContextNativePointer,
295
359
jni::alias_ref<jobject> fabricModule) {
296
360
JSContextRef context = (JSContextRef)jsContextNativePointer;
@@ -308,11 +372,14 @@ void FabricJSCBinding::installFabric(jlong jsContextNativePointer,
308
372
addFabricMethod (context, fabricModule, classRef, module, " cloneNodeWithNewChildren" , cloneNodeWithNewChildren);
309
373
addFabricMethod (context, fabricModule, classRef, module, " cloneNodeWithNewProps" , cloneNodeWithNewProps);
310
374
addFabricMethod (context, fabricModule, classRef, module, " cloneNodeWithNewChildrenAndProps" , cloneNodeWithNewChildrenAndProps);
375
+
311
376
addFabricMethod (context, fabricModule, classRef, module, " appendChild" , appendChild);
312
377
addFabricMethod (context, fabricModule, classRef, module, " createChildSet" , createChildSet);
313
378
addFabricMethod (context, fabricModule, classRef, module, " appendChildToSet" , appendChildToSet);
314
379
addFabricMethod (context, fabricModule, classRef, module, " completeRoot" , completeRoot);
315
380
381
+ addFabricMethod (context, fabricModule, classRef, module, " registerEventHandler" , registerEventHandler);
382
+
316
383
JSC_JSClassRelease (useCustomJSC, classRef);
317
384
318
385
JSObjectRef globalObject = JSC_JSContextGetGlobalObject (context);
@@ -325,6 +392,10 @@ void FabricJSCBinding::registerNatives() {
325
392
registerHybrid ({
326
393
makeNativeMethod (" initHybrid" , FabricJSCBinding::initHybrid),
327
394
makeNativeMethod (" installFabric" , FabricJSCBinding::installFabric),
395
+ makeNativeMethod (" createEventTarget" , FabricJSCBinding::createEventTarget),
396
+ makeNativeMethod (" releaseEventTarget" , FabricJSCBinding::releaseEventTarget),
397
+ makeNativeMethod (" releaseEventHandler" , FabricJSCBinding::releaseEventHandler),
398
+ makeNativeMethod (" dispatchEventToTarget" , FabricJSCBinding::dispatchEventToTarget),
328
399
});
329
400
}
330
401
0 commit comments