From 5f48bd84aa7c9c36d3b3c403fd55441eed952572 Mon Sep 17 00:00:00 2001 From: Kevin Gozali Date: Tue, 13 Feb 2018 22:26:43 -0800 Subject: [PATCH] iOS: allow getting an instance of a js-bound module via the bridge Reviewed By: sebmarkbage Differential Revision: D6982785 fbshipit-source-id: 7bbcc5416e1d1a3a577328349a7c18af5c0f8577 --- React/Base/RCTBridge.h | 5 +++++ React/Base/RCTBridge.m | 5 +++++ React/CxxBridge/RCTCxxBridge.mm | 12 ++++++++++++ React/CxxBridge/RCTCxxBridgeDelegate.h | 5 +++++ React/Fabric/RCTFabricUIManager.h | 6 ++++++ React/Fabric/RCTFabricUIManager.mm | 9 +++++++++ 6 files changed, 42 insertions(+) diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 4944ce711c2..0ddce95bec1 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -168,6 +168,11 @@ RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass); */ - (BOOL)moduleIsInitialized:(Class)moduleClass; +/** + * Retrieve an extra module that gets bound to the JS context, if any. + */ +- (id)jsBoundExtraModuleForClass:(Class)moduleClass; + /** * All registered bridge module classes. */ diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 0b02e238036..da8e40b6c43 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -251,6 +251,11 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) return [self.batchedBridge moduleIsInitialized:moduleClass]; } +- (id)jsBoundExtraModuleForClass:(Class)moduleClass +{ + return [self.batchedBridge jsBoundExtraModuleForClass:moduleClass]; +} + - (void)reload { #if RCT_ENABLE_INSPECTOR diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index 4b2a8917510..4c958b83b54 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -454,6 +454,18 @@ struct RCTInstanceCallback : public InstanceCallback { return _moduleDataByName[RCTBridgeModuleNameForClass(moduleClass)].hasInstance; } +- (id)jsBoundExtraModuleForClass:(Class)moduleClass +{ + if ([self.delegate conformsToProtocol:@protocol(RCTCxxBridgeDelegate)]) { + id cxxDelegate = (id) self.delegate; + if ([cxxDelegate respondsToSelector:@selector(jsBoundExtraModuleForClass:)]) { + return [cxxDelegate jsBoundExtraModuleForClass:moduleClass]; + } + } + + return nil; +} + - (std::shared_ptr)_buildModuleRegistry { if (!self.valid) { diff --git a/React/CxxBridge/RCTCxxBridgeDelegate.h b/React/CxxBridge/RCTCxxBridgeDelegate.h index 55bff5adadc..9c24ee21611 100644 --- a/React/CxxBridge/RCTCxxBridgeDelegate.h +++ b/React/CxxBridge/RCTCxxBridgeDelegate.h @@ -40,4 +40,9 @@ class JSExecutorFactory; */ - (void)installExtraJSBinding:(JSGlobalContextRef)jsContextRef; +/** + * Experimental: Get the instance of the extra module/class which gets bound via `installExtraJSBinding:` + */ +- (id)jsBoundExtraModuleForClass:(Class)moduleClass; + @end diff --git a/React/Fabric/RCTFabricUIManager.h b/React/Fabric/RCTFabricUIManager.h index a1e5b5ed762..4a22c96144b 100644 --- a/React/Fabric/RCTFabricUIManager.h +++ b/React/Fabric/RCTFabricUIManager.h @@ -42,3 +42,9 @@ childSet:(NSArray *)childSet; @end + +@interface RCTBridge (RCTFabricUIManager) + +@property (nonatomic, readonly) RCTFabricUIManager *fabricUIManager; + +@end diff --git a/React/Fabric/RCTFabricUIManager.mm b/React/Fabric/RCTFabricUIManager.mm index d8a754b061d..2aca771d324 100644 --- a/React/Fabric/RCTFabricUIManager.mm +++ b/React/Fabric/RCTFabricUIManager.mm @@ -72,3 +72,12 @@ } @end + +@implementation RCTBridge (RCTFabricUIManager) + +- (RCTFabricUIManager *)fabricUIManager +{ + return [self jsBoundExtraModuleForClass:[RCTFabricUIManager class]]; +} + +@end