From e72163f0f2182eaae939006ff3bb70420c095605 Mon Sep 17 00:00:00 2001 From: Nick Lockwood Date: Wed, 4 May 2016 07:06:09 -0700 Subject: [PATCH] Added explicit init to observer modules Summary: Modules which call JS methods directly, or use `sendDeviceEventWithName:`, can trigger effects in JS without ever being referenced from the JS code. This breaks some assumptions in my earlier diff about when modules can be lazily loaded. Pending a better solution, I've put explicit `init` methods in these modules to ensure they are eagerly initialized (the downside to this is that they'll still be initialized even if they are never used). Reviewed By: javache Differential Revision: D3258232 fb-gh-sync-id: f925bc2e5339c1fbfcc244d4613062c5ab848fc2 fbshipit-source-id: f925bc2e5339c1fbfcc244d4613062c5ab848fc2 --- Libraries/LinkingIOS/RCTLinkingManager.m | 7 +++++++ .../PushNotificationIOS/RCTPushNotificationManager.m | 10 ++++++++++ React/Base/RCTBatchedBridge.m | 2 +- React/Base/RCTKeyboardObserver.m | 7 +++++++ React/Base/RCTPerformanceLogger.m | 7 +++++++ React/Modules/RCTDevLoadingView.m | 2 +- React/Modules/RCTStatusBarManager.m | 10 ++++++++++ React/Profiler/RCTPerfMonitor.m | 2 +- 8 files changed, 44 insertions(+), 3 deletions(-) diff --git a/Libraries/LinkingIOS/RCTLinkingManager.m b/Libraries/LinkingIOS/RCTLinkingManager.m index 9538981298..96f9e75b49 100644 --- a/Libraries/LinkingIOS/RCTLinkingManager.m +++ b/Libraries/LinkingIOS/RCTLinkingManager.m @@ -21,6 +21,13 @@ NSString *const RCTOpenURLNotification = @"RCTOpenURLNotification"; RCT_EXPORT_MODULE() +- (instancetype)init +{ + // We're only overriding this to ensure the module gets created at startup + // TODO (t11106126): Remove once we have more declarative control over module setup. + return [super init]; +} + - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; diff --git a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m index b9df76865f..0d6453a360 100644 --- a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m +++ b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m @@ -59,10 +59,20 @@ RCT_EXPORT_MODULE() [[NSNotificationCenter defaultCenter] removeObserver:self]; } +- (instancetype)init +{ + // We're only overriding this to ensure the module gets created at startup + // TODO (t11106126): Remove once we have more declarative control over module setup. + return [super init]; +} + - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; + // TODO: if we add an explicit "startObserving" method, we can take this out + // of the application startup path + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleLocalNotificationReceived:) name:RCTLocalNotificationReceived diff --git a/React/Base/RCTBatchedBridge.m b/React/Base/RCTBatchedBridge.m index 5e60f97a99..f2d6e6ccb5 100644 --- a/React/Base/RCTBatchedBridge.m +++ b/React/Base/RCTBatchedBridge.m @@ -303,7 +303,7 @@ RCT_EXTERN NSArray *RCTGetModuleClasses(void); // The executor is a bridge module, but we want it to be instantiated before // any other module has access to the bridge, in case they need the JS thread. - // TODO: once we have more fine-grained control of init (D3175632) we can + // TODO: once we have more fine-grained control of init (t11106126) we can // probably just replace this with [self moduleForClass:self.executorClass] if (!_javaScriptExecutor) { id executorModule = [self.executorClass new]; diff --git a/React/Base/RCTKeyboardObserver.m b/React/Base/RCTKeyboardObserver.m index 88523a549f..a849c3d5ae 100644 --- a/React/Base/RCTKeyboardObserver.m +++ b/React/Base/RCTKeyboardObserver.m @@ -19,6 +19,13 @@ static NSDictionary *RCTParseKeyboardNotification(NSNotification *notification); RCT_EXPORT_MODULE() +- (instancetype)init +{ + // We're only overriding this to ensure the module gets created at startup + // TODO (t11106126): Remove once we have more declarative control over module setup. + return [super init]; +} + - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; diff --git a/React/Base/RCTPerformanceLogger.m b/React/Base/RCTPerformanceLogger.m index b30d1348db..05e6e418e4 100644 --- a/React/Base/RCTPerformanceLogger.m +++ b/React/Base/RCTPerformanceLogger.m @@ -116,6 +116,13 @@ RCT_EXPORT_MODULE() @synthesize bridge = _bridge; +- (instancetype)init +{ + // We're only overriding this to ensure the module gets created at startup + // TODO (t11106126): Remove once we have more declarative control over module setup. + return [super init]; +} + - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; diff --git a/React/Modules/RCTDevLoadingView.m b/React/Modules/RCTDevLoadingView.m index 7305c186bc..a451f79fce 100644 --- a/React/Modules/RCTDevLoadingView.m +++ b/React/Modules/RCTDevLoadingView.m @@ -43,7 +43,7 @@ RCT_EXPORT_MODULE() - (instancetype)init { // We're only overriding this to ensure the module gets created at startup - // TODO (D3175632): Remove once we have more declarative control over module setup. + // TODO (t11106126): Remove once we have more declarative control over module setup. return [super init]; } diff --git a/React/Modules/RCTStatusBarManager.m b/React/Modules/RCTStatusBarManager.m index 026d190120..5171c5aa93 100644 --- a/React/Modules/RCTStatusBarManager.m +++ b/React/Modules/RCTStatusBarManager.m @@ -46,10 +46,20 @@ RCT_EXPORT_MODULE() @synthesize bridge = _bridge; +- (instancetype)init +{ + // We're only overriding this to ensure the module gets created at startup + // TODO (t11106126): Remove once we have more declarative control over module setup. + return [super init]; +} + - (void)setBridge:(RCTBridge *)bridge { _bridge = bridge; + // TODO: if we add an explicit "startObserving" method, we can take this out + // of the application startup path + NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc addObserver:self selector:@selector(applicationDidChangeStatusBarFrame:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; [nc addObserver:self selector:@selector(applicationWillChangeStatusBarFrame:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; diff --git a/React/Profiler/RCTPerfMonitor.m b/React/Profiler/RCTPerfMonitor.m index 27e0b9bd49..947722534f 100644 --- a/React/Profiler/RCTPerfMonitor.m +++ b/React/Profiler/RCTPerfMonitor.m @@ -128,7 +128,7 @@ RCT_EXPORT_MODULE() - (instancetype)init { // We're only overriding this to ensure the module gets created at startup - // TODO (D3175632): Remove once we have more declarative control over module setup. + // TODO (t11106126): Remove once we have more declarative control over module setup. return [super init]; }