From e5080e617129fc52e5cc4db53e8013ccef1f2a99 Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Fri, 30 Apr 2021 16:38:30 -0700 Subject: [PATCH] Pull RCTViewRegistry attachment out of TurboModuleManager Summary: ## Rationale The TurboModuleManager should only be concerned with modules. The bridge and RCTInstance integrate the TurboModuleManager with the rest of React Native. Therefore, abstractions used by TurboModules that reach into the rest of React Native should be attached by the bridge or by RCTInstance. ## Changes In this diff, we pull RCTViewRegistry attachment out of the TurboModuleManager. In bridge mode, it'll be attached to TurboModule by the bridge. In bridgeless mode, it'll be attached to TurboModules by the RCTInstance. Changelog: [Internal] Reviewed By: PeteTheHeat Differential Revision: D28086320 fbshipit-source-id: 9d99835bdbb66bb6a41fbd0d8a3970cefae16b81 --- React/Base/RCTBridge.h | 7 ++++ React/Base/RCTBridge.m | 5 +++ React/Base/RCTBridgeModule.h | 2 +- React/CxxBridge/RCTCxxBridge.mm | 15 ++++++++ .../core/platform/ios/RCTTurboModuleManager.h | 1 - .../platform/ios/RCTTurboModuleManager.mm | 37 ++++--------------- 6 files changed, 36 insertions(+), 31 deletions(-) diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 87c1a616bd1..49b355f2736 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -231,6 +231,13 @@ RCT_EXTERN void RCTEnableTurboModuleBlockGuard(BOOL enabled); */ - (void)setRCTTurboModuleRegistry:(id)turboModuleRegistry; +/** + * This hook is called by the TurboModule infra with every TurboModule that's created. + * It allows the bridge to attach properties to TurboModules that give TurboModules + * access to Bridge APIs. + */ +- (void)attachBridgeAPIsToTurboModule:(id)module; + /** * Convenience method for retrieving all modules conforming to a given protocol. * Modules will be synchronously instantiated if they haven't already been, diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index f036dfd3378..585aa00c831 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -230,6 +230,11 @@ RCT_NOT_IMPLEMENTED(-(instancetype)init) [self.batchedBridge setRCTTurboModuleRegistry:turboModuleRegistry]; } +- (void)attachBridgeAPIsToTurboModule:(id)module +{ + [self.batchedBridge attachBridgeAPIsToTurboModule:module]; +} + - (void)didReceiveReloadCommand { #if RCT_ENABLE_INSPECTOR diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index b8d3ea6ee71..c7a1888b0dd 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -133,7 +133,7 @@ RCT_EXTERN_C_END * viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED;`. If using Swift, add * `@objc var viewRegistry_DEPRECATED: RCTViewRegistry!` to your module. */ -@property (nonatomic, weak, readonly) RCTViewRegistry *viewRegistry_DEPRECATED; +@property (nonatomic, weak, readwrite) RCTViewRegistry *viewRegistry_DEPRECATED; /** * A reference to the RCTBridge. Useful for modules that require access diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index be1798f1939..bf8050a55b6 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -249,6 +249,21 @@ struct RCTInstanceCallback : public InstanceCallback { [_objCModuleRegistry setTurboModuleRegistry:_turboModuleRegistry]; } +- (void)attachBridgeAPIsToTurboModule:(id)module +{ + id bridgeModule = (id)module; + /** + * Attach the RCTViewRegistry to this TurboModule, which allows this TurboModule + * To query a React component's UIView, given its reactTag. + * + * Usage: In the NativeModule @implementation, include: + * `@synthesize viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED` + */ + if ([bridgeModule respondsToSelector:@selector(setViewRegistry_DEPRECATED:)]) { + bridgeModule.viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED; + } +} + - (std::shared_ptr)jsMessageThread { return _jsMessageThread; diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h index 5e112440b8c..2b9c4731940 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.h @@ -45,7 +45,6 @@ jsInvoker:(std::shared_ptr)jsInvoker; - (void)installJSBindingWithRuntimeExecutor:(facebook::react::RuntimeExecutor)runtimeExecutor; -- (void)setBridgelessComponentViewProvider:(RCTBridgelessComponentViewProvider)bridgelessComponentViewProvider; - (void)invalidate; diff --git a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm index 2b0c450b538..619e443440c 100644 --- a/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm +++ b/ReactCommon/react/nativemodule/core/platform/ios/RCTTurboModuleManager.mm @@ -174,7 +174,6 @@ static Class getFallbackClassFromName(const char *name) std::atomic _invalidating; RCTModuleRegistry *_moduleRegistry; - RCTViewRegistry *_viewRegistry_DEPRECATED; } - (instancetype)initWithBridge:(RCTBridge *)bridge @@ -190,9 +189,6 @@ static Class getFallbackClassFromName(const char *name) [_moduleRegistry setBridge:bridge]; [_moduleRegistry setTurboModuleRegistry:self]; - _viewRegistry_DEPRECATED = [RCTViewRegistry new]; - [_viewRegistry_DEPRECATED setBridge:bridge]; - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(bridgeWillInvalidateModules:) name:RCTBridgeWillInvalidateModulesNotification @@ -205,11 +201,6 @@ static Class getFallbackClassFromName(const char *name) return self; } -- (void)setBridgelessComponentViewProvider:(RCTBridgelessComponentViewProvider)viewProvider -{ - [_viewRegistry_DEPRECATED setBridgelessComponentViewProvider:viewProvider]; -} - - (void)notifyAboutTurboModuleSetup:(const char *)name { NSString *moduleName = [[NSString alloc] initWithUTF8String:name]; @@ -563,25 +554,6 @@ static Class getFallbackClassFromName(const char *name) } } - /** - * Attach the RCTViewRegistry to this TurboModule, which allows this TurboModule - * To query a React component's UIView, given its reactTag. - * - * Usage: In the NativeModule @implementation, include: - * `@synthesize viewRegistry_DEPRECATED = _viewRegistry_DEPRECATED` - */ - if ([module respondsToSelector:@selector(viewRegistry_DEPRECATED)] && _viewRegistry_DEPRECATED) { - @try { - [(id)module setValue:_viewRegistry_DEPRECATED forKey:@"viewRegistry_DEPRECATED"]; - } @catch (NSException *exception) { - RCTLogError( - @"%@ has no setter or ivar for its module registry, which is not " - "permitted. You must either @synthesize the viewRegistry_DEPRECATED property, " - "or provide your own setter method.", - RCTBridgeModuleNameForClass([module class])); - } - } - /** * Some modules need their own queues, but don't provide any, so we need to create it for them. * These modules typically have the following: @@ -626,6 +598,13 @@ static Class getFallbackClassFromName(const char *name) } } + /** + * Decorate TurboModules with bridgeless-compatible APIs that call into the bridge. + */ + if (_bridge) { + [_bridge attachBridgeAPIsToTurboModule:module]; + } + /** * Attach method queue to id object. * This is necessary because the id object can be eagerly created/initialized before the method @@ -645,7 +624,7 @@ static Class getFallbackClassFromName(const char *name) RCTModuleData *data = [[RCTModuleData alloc] initWithModuleInstance:(id)module bridge:_bridge moduleRegistry:_moduleRegistry - viewRegistry_DEPRECATED:_viewRegistry_DEPRECATED]; + viewRegistry_DEPRECATED:nil]; [_bridge registerModuleForFrameUpdates:(id)module withModuleData:data]; }