diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 969035b5a9..804b4092f6 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -254,12 +254,17 @@ RCT_EXTERN void RCTEnableTurboModule(BOOL enabled); /** * Reload the bundle and reset executor & modules. Safe to call from any thread. */ -- (void)reload; +- (void)reload __deprecated_msg("Call reloadWithReason instead"); + +/** + * Reload the bundle and reset executor & modules. Safe to call from any thread. + */ +- (void)reloadWithReason:(NSString *)reason; /** * Inform the bridge, and anything subscribing to it, that it should reload. */ -- (void)requestReload __deprecated_msg("Call reload instead"); +- (void)requestReload __deprecated_msg("Call reloadWithReason instead"); /** * Says whether bridge has started receiving calls from javascript. diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index fd4801f272..04398f884f 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -244,7 +244,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) - (void)didReceiveReloadCommand { - [self reload]; + [self reloadWithReason:@"Command"]; } - (NSArray *)moduleClasses @@ -290,14 +290,22 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) return [self.batchedBridge moduleIsInitialized:moduleClass]; } +/** + * Legacy reload, please use reloadWithReason and provide a reason for stats. + */ - (void)reload +{ + [self reloadWithReason:@"Unknown from bridge"]; +} + +- (void)reloadWithReason:(NSString *)reason { #if RCT_ENABLE_INSPECTOR && !TARGET_OS_UIKITFORMAC // Disable debugger to resume the JsVM & avoid thread locks while reloading [RCTInspectorDevServerHelper disableDebugger]; #endif - [[NSNotificationCenter defaultCenter] postNotificationName:RCTBridgeWillReloadNotification object:self]; + [[NSNotificationCenter defaultCenter] postNotificationName:RCTBridgeWillReloadNotification object:self userInfo:@{@"reason": reason} ]; /** * Any thread @@ -314,7 +322,7 @@ RCT_NOT_IMPLEMENTED(- (instancetype)init) - (void)requestReload { - [self reload]; + [self reloadWithReason:@"Requested from bridge"]; } - (Class)bridgeClass diff --git a/React/CxxBridge/RCTCxxBridge.mm b/React/CxxBridge/RCTCxxBridge.mm index f1daad54b4..864e4d366d 100644 --- a/React/CxxBridge/RCTCxxBridge.mm +++ b/React/CxxBridge/RCTCxxBridge.mm @@ -487,7 +487,7 @@ struct RCTInstanceCallback : public InstanceCallback { } return moduleData.instance; } - + static NSSet *ignoredModuleLoadFailures = [NSSet setWithArray: @[@"UIManager"]]; // Module may not be loaded yet, so attempt to force load it here. @@ -1009,7 +1009,15 @@ RCT_NOT_IMPLEMENTED(- (instancetype)initWithBundleURL:(__unused NSURL *)bundleUR if (!_valid) { RCTLogWarn(@"Attempting to reload bridge before it's valid: %@. Try restarting the development server if connected.", self); } - [_parentBridge reload]; + [_parentBridge reloadWithReason:@"Unknown from cxx bridge"]; +} + +- (void)reloadWithReason:(NSString *)reason +{ + if (!_valid) { + RCTLogWarn(@"Attempting to reload bridge before it's valid: %@. Try restarting the development server if connected.", self); + } + [_parentBridge reloadWithReason:reason]; } - (Class)executorClass diff --git a/React/DevSupport/RCTDevMenu.m b/React/DevSupport/RCTDevMenu.m index d6ba1f6ee2..e0dc7a7b94 100644 --- a/React/DevSupport/RCTDevMenu.m +++ b/React/DevSupport/RCTDevMenu.m @@ -200,7 +200,7 @@ RCT_EXPORT_MODULE() [[RCTBundleURLProvider sharedSettings] resetToDefaults]; self->_bridge.bundleURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForFallbackResource:nil fallbackExtension:nil]; - [self->_bridge reload]; + [self->_bridge reloadWithReason:@"Dev menu - reset to default"]; } - (NSArray *)_menuItemsToPresent @@ -214,7 +214,7 @@ RCT_EXPORT_MODULE() [items addObject:[RCTDevMenuItem buttonItemWithTitle:@"Reload" handler:^{ - [bridge reload]; + [bridge reloadWithReason:@"Dev menu - reload"]; }]]; if (!devSettings.isProfilingEnabled) { @@ -373,7 +373,7 @@ RCT_EXPORT_MODULE() fallbackResource:nil] : [strongBridge.delegate sourceURLForBridge:strongBridge]; strongBridge.bundleURL = bundleURL; - [strongBridge reload]; + [strongBridge reloadWithReason:@"Dev menu - apply changes"]; } }]]; [alertController addAction:[UIAlertAction actionWithTitle:@"Reset to Default" @@ -455,7 +455,7 @@ RCT_EXPORT_METHOD(show) RCT_EXPORT_METHOD(reload) { WARN_DEPRECATED_DEV_MENU_EXPORT(); - [_bridge reload]; + [_bridge reloadWithReason:@"Unknown from JS"]; } RCT_EXPORT_METHOD(debugRemotely : (BOOL)enableDebug) diff --git a/React/Modules/RCTDevSettings.mm b/React/Modules/RCTDevSettings.mm index 2328ac721d..32373e036a 100644 --- a/React/Modules/RCTDevSettings.mm +++ b/React/Modules/RCTDevSettings.mm @@ -161,7 +161,7 @@ RCT_EXPORT_MODULE() if (params != (id)kCFNull && [params[@"debug"] boolValue]) { weakBridge.executorClass = objc_lookUpClass("RCTWebSocketExecutor"); } - [weakBridge reload]; + [weakBridge reloadWithReason:@"Global hotkey"]; } queue:dispatch_get_main_queue() forMethod:@"reload"]; @@ -236,7 +236,13 @@ RCT_EXPORT_MODULE() RCT_EXPORT_METHOD(reload) { - [self.bridge reload]; + [self.bridge reloadWithReason:@"Unknown From JS"]; +} + +RCT_EXPORT_METHOD(reloadWithReason : (NSString *) reason) +{ + [self.bridge reloadWithReason:reason]; + } RCT_EXPORT_METHOD(setIsShakeToShowDevMenuEnabled : (BOOL)enabled) @@ -369,7 +375,7 @@ RCT_EXPORT_METHOD(addMenuItem:(NSString *)title) } self.bridge.executorClass = executorClass; - [self.bridge reload]; + [self.bridge reloadWithReason:@"Custom executor class reset"]; } } @@ -442,6 +448,9 @@ RCT_EXPORT_METHOD(addMenuItem:(NSString *)title) - (void)reload { } +- (void)reloadWithReason +{ +} - (void)toggleElementInspector { } diff --git a/React/Modules/RCTRedBox.m b/React/Modules/RCTRedBox.m index 32fe6a6d9c..5fb6d586dc 100644 --- a/React/Modules/RCTRedBox.m +++ b/React/Modules/RCTRedBox.m @@ -607,7 +607,7 @@ RCT_EXPORT_METHOD(dismiss) if (_overrideReloadAction) { _overrideReloadAction(); } else { - [_bridge reload]; + [_bridge reloadWithReason:@"Redbox"]; } [self dismiss]; } diff --git a/React/Profiler/RCTProfile.m b/React/Profiler/RCTProfile.m index 4d7460268f..91dd5ca53a 100644 --- a/React/Profiler/RCTProfile.m +++ b/React/Profiler/RCTProfile.m @@ -372,7 +372,7 @@ void RCTProfileUnhookModules(RCTBridge *bridge) + (void)reload { - [RCTProfilingBridge() reload]; + [RCTProfilingBridge() reloadWithReason:@"Profiling controls"]; } + (void)toggle:(UIButton *)target