From 4198c2bcb6774976b32df90de5fdfc27706f21db Mon Sep 17 00:00:00 2001 From: Ramanpreet Nara Date: Tue, 4 May 2021 18:31:35 -0700 Subject: [PATCH] Migrate RCTDevMenu over to RCTBundleManager Summary: This diff gets rid of bridge usage in RCTDevMenu's _menuItemsToPresent method. Changelog: [Internal] Reviewed By: PeteTheHeat Differential Revision: D28164301 fbshipit-source-id: 6445c787519af887209ee312f1c2dbaef873e00d --- React/Base/RCTBridgeModule.h | 4 +++- React/Base/RCTBundleManager.m | 24 +++++++++++++++++++++++- React/CoreModules/RCTDevMenu.mm | 28 ++++++++++++++-------------- 3 files changed, 40 insertions(+), 16 deletions(-) diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index 8c96f4b9023..559c141e352 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -426,7 +426,9 @@ typedef NSURL * (^RCTBridgelessBundleURLGetter)(); @interface RCTBundleManager : NSObject - (void)setBridge:(RCTBridge *)bridge; - (void)setBridgelessBundleURLGetter:(RCTBridgelessBundleURLGetter)getter - andSetter:(RCTBridgelessBundleURLSetter)setter; + andSetter:(RCTBridgelessBundleURLSetter)setter + andDefaultGetter:(RCTBridgelessBundleURLGetter)defaultGetter; +- (void)resetBundleURL; @property NSURL *bundleURL; @end diff --git a/React/Base/RCTBundleManager.m b/React/Base/RCTBundleManager.m index b6423e9c559..b6c1b13652a 100644 --- a/React/Base/RCTBundleManager.m +++ b/React/Base/RCTBundleManager.m @@ -14,6 +14,7 @@ __weak RCTBridge *_bridge; RCTBridgelessBundleURLGetter _bridgelessBundleURLGetter; RCTBridgelessBundleURLSetter _bridgelessBundleURLSetter; + RCTBridgelessBundleURLGetter _bridgelessBundleURLDefaultGetter; } - (void)setBridge:(RCTBridge *)bridge @@ -21,10 +22,13 @@ _bridge = bridge; } -- (void)setBridgelessBundleURLGetter:(RCTBridgelessBundleURLGetter)getter andSetter:(RCTBridgelessBundleURLSetter)setter +- (void)setBridgelessBundleURLGetter:(RCTBridgelessBundleURLGetter)getter + andSetter:(RCTBridgelessBundleURLSetter)setter + andDefaultGetter:(RCTBridgelessBundleURLGetter)defaultGetter { _bridgelessBundleURLGetter = getter; _bridgelessBundleURLSetter = setter; + _bridgelessBundleURLDefaultGetter = defaultGetter; } - (void)setBundleURL:(NSURL *)bundleURL @@ -53,4 +57,22 @@ return _bridgelessBundleURLGetter(); } +- (void)resetBundleURL +{ + RCTBridge *strongBridge = _bridge; + if (strongBridge) { + strongBridge.bundleURL = [strongBridge.delegate sourceURLForBridge:strongBridge]; + return; + } + + RCTAssert( + _bridgelessBundleURLDefaultGetter != nil, + @"RCTBundleManager: In bridgeless mode, default RCTBridgelessBundleURLGetter must not be nil."); + RCTAssert( + _bridgelessBundleURLSetter != nil, + @"RCTBundleManager: In bridgeless mode, RCTBridgelessBundleURLSetter must not be nil."); + + _bridgelessBundleURLSetter(_bridgelessBundleURLDefaultGetter()); +} + @end diff --git a/React/CoreModules/RCTDevMenu.mm b/React/CoreModules/RCTDevMenu.mm index 3e0cf8d7883..fd6f46095f7 100644 --- a/React/CoreModules/RCTDevMenu.mm +++ b/React/CoreModules/RCTDevMenu.mm @@ -98,6 +98,7 @@ typedef void (^RCTDevMenuAlertActionHandler)(UIAlertAction *action); @synthesize bridge = _bridge; @synthesize moduleRegistry = _moduleRegistry; @synthesize invokeJS = _invokeJS; +@synthesize bundleManager = _bundleManager; RCT_EXPORT_MODULE() @@ -210,8 +211,8 @@ RCT_EXPORT_MODULE() - (void)setDefaultJSBundle { [[RCTBundleURLProvider sharedSettings] resetToDefaults]; - self->_bridge.bundleURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForFallbackResource:nil - fallbackExtension:nil]; + self->_bundleManager.bundleURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForFallbackResource:nil + fallbackExtension:nil]; RCTTriggerReloadCommandListeners(@"Dev menu - reset to default"); } @@ -220,9 +221,9 @@ RCT_EXPORT_MODULE() NSMutableArray *items = [NSMutableArray new]; // Add built-in items - __weak RCTBridge *bridge = _bridge; __weak RCTDevSettings *devSettings = [_moduleRegistry moduleForName:"DevSettings"]; __weak RCTDevMenu *weakSelf = self; + __weak RCTBundleManager *bundleManager = _bundleManager; [items addObject:[RCTDevMenuItem buttonItemWithTitle:@"Reload" handler:^{ @@ -242,7 +243,7 @@ RCT_EXPORT_MODULE() handler:^{ [RCTInspectorDevServerHelper openURL:@"flipper://null/Hermesdebuggerrn?device=React%20Native" - withBundleURL:bridge.bundleURL + withBundleURL:bundleManager.bundleURL withErrorMessage:@"Failed to open Flipper. Please check that Metro is runnning."]; }]]; @@ -253,7 +254,7 @@ RCT_EXPORT_MODULE() handler:^{ [RCTInspectorDevServerHelper openURL:@"flipper://null/React?device=React%20Native" - withBundleURL:bridge.bundleURL + withBundleURL:bundleManager.bundleURL withErrorMessage:@"Failed to open Flipper. Please check that Metro is runnning."]; }]]; } else if (devSettings.isRemoteDebuggingAvailable) { @@ -359,16 +360,15 @@ RCT_EXPORT_MODULE() } [RCTBundleURLProvider sharedSettings].jsLocation = [NSString stringWithFormat:@"%@:%d", ipTextField.text, portNumber.intValue]; - __strong RCTBridge *strongBridge = bridge; - if (strongBridge) { - NSURL *bundleURL = bundleRoot.length - ? [[RCTBundleURLProvider sharedSettings] - jsBundleURLForBundleRoot:bundleRoot - fallbackResource:nil] - : [strongBridge.delegate sourceURLForBridge:strongBridge]; - strongBridge.bundleURL = bundleURL; - RCTTriggerReloadCommandListeners(@"Dev menu - apply changes"); + if (bundleRoot.length == 0) { + [bundleManager resetBundleURL]; + } else { + bundleManager.bundleURL = [[RCTBundleURLProvider sharedSettings] + jsBundleURLForBundleRoot:bundleRoot + fallbackResource:nil]; } + + RCTTriggerReloadCommandListeners(@"Dev menu - apply changes"); }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"Reset to Default" style:UIAlertActionStyleDefault