From 220034c4d4c8a52f424e05c291a62b63b74447f3 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Mon, 7 Aug 2017 06:45:24 -0700 Subject: [PATCH] Configure requiresMainQueueSetup for core modules Reviewed By: fkgozali Differential Revision: D5528305 fbshipit-source-id: f17cad933685be09784b2246f44baf252bfa5a26 --- Libraries/Blob/RCTBlobManager.m | 5 +++ Libraries/Settings/RCTSettingsManager.m | 40 +++++++++--------- .../RCTModuleInitNotificationRaceTests.m | 5 ++- React/Base/RCTPlatform.m | 9 +++- React/DevSupport/RCTDevLoadingView.m | 6 +-- React/DevSupport/RCTDevMenu.m | 5 +++ React/Modules/RCTAccessibilityManager.m | 42 +++++++++---------- React/Modules/RCTAppState.m | 9 +++- React/Modules/RCTDevSettings.mm | 5 +++ React/Modules/RCTDeviceInfo.m | 5 +++ React/Modules/RCTI18nManager.m | 5 +++ React/Modules/RCTSourceCode.m | 5 +++ React/Modules/RCTUIManager.m | 5 +++ React/Profiler/RCTPerfMonitor.m | 6 +-- 14 files changed, 99 insertions(+), 53 deletions(-) diff --git a/Libraries/Blob/RCTBlobManager.m b/Libraries/Blob/RCTBlobManager.m index bf7a82bb9..d556d634a 100755 --- a/Libraries/Blob/RCTBlobManager.m +++ b/Libraries/Blob/RCTBlobManager.m @@ -32,6 +32,11 @@ RCT_EXPORT_MODULE(BlobModule) @synthesize bridge = _bridge; ++ (BOOL)requiresMainQueueSetup +{ + return NO; +} + - (NSDictionary *)constantsToExport { return @{ diff --git a/Libraries/Settings/RCTSettingsManager.m b/Libraries/Settings/RCTSettingsManager.m index 9007c5002..77ec891ad 100644 --- a/Libraries/Settings/RCTSettingsManager.m +++ b/Libraries/Settings/RCTSettingsManager.m @@ -24,38 +24,40 @@ RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + return NO; +} + +- (instancetype)init +{ + return [self initWithUserDefaults:[NSUserDefaults standardUserDefaults]]; +} + - (instancetype)initWithUserDefaults:(NSUserDefaults *)defaults { if ((self = [self init])) { _defaults = defaults; + + + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(userDefaultsDidChange:) + name:NSUserDefaultsDidChangeNotification + object:_defaults]; } return self; } -- (void)setBridge:(RCTBridge *)bridge -{ - _bridge = bridge; - - if (!_defaults) { - _defaults = [NSUserDefaults standardUserDefaults]; - } - - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(userDefaultsDidChange:) - name:NSUserDefaultsDidChangeNotification - object:_defaults]; -} - -- (NSDictionary *)constantsToExport -{ - return @{@"settings": RCTJSONClean([_defaults dictionaryRepresentation])}; -} - - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } +- (NSDictionary *)constantsToExport +{ + return @{@"settings": RCTJSONClean([_defaults dictionaryRepresentation])}; +} + - (void)userDefaultsDidChange:(NSNotification *)note { if (_ignoringUpdates) { diff --git a/RNTester/RNTesterUnitTests/RCTModuleInitNotificationRaceTests.m b/RNTester/RNTesterUnitTests/RCTModuleInitNotificationRaceTests.m index d9c7d6b72..df90f2a87 100644 --- a/RNTester/RNTesterUnitTests/RCTModuleInitNotificationRaceTests.m +++ b/RNTester/RNTesterUnitTests/RCTModuleInitNotificationRaceTests.m @@ -71,7 +71,6 @@ RCT_EXPORT_MODULE() @end - @interface RCTModuleInitNotificationRaceTests : XCTestCase { RCTBridge *_bridge; @@ -98,6 +97,10 @@ RCT_EXPORT_MODULE() _notificationObserver = [RCTNotificationObserverModule new]; _bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:nil]; + + dispatch_async(dispatch_get_main_queue(), ^{ + [[self->_bridge uiManager] constantsToExport]; + }); } - (void)tearDown diff --git a/React/Base/RCTPlatform.m b/React/Base/RCTPlatform.m index 122d4231b..459334106 100644 --- a/React/Base/RCTPlatform.m +++ b/React/Base/RCTPlatform.m @@ -13,8 +13,6 @@ #import "RCTUtils.h" -@implementation RCTPlatform - static NSString *interfaceIdiom(UIUserInterfaceIdiom idiom) { switch(idiom) { case UIUserInterfaceIdiomPhone: @@ -30,8 +28,15 @@ static NSString *interfaceIdiom(UIUserInterfaceIdiom idiom) { } } +@implementation RCTPlatform + RCT_EXPORT_MODULE(PlatformConstants) ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + - (NSDictionary *)constantsToExport { UIDevice *device = [UIDevice currentDevice]; diff --git a/React/DevSupport/RCTDevLoadingView.m b/React/DevSupport/RCTDevLoadingView.m index 6259b952f..9872b1a35 100644 --- a/React/DevSupport/RCTDevLoadingView.m +++ b/React/DevSupport/RCTDevLoadingView.m @@ -41,11 +41,9 @@ RCT_EXPORT_MODULE() [[NSNotificationCenter defaultCenter] removeObserver:self]; } -- (instancetype)init ++ (BOOL)requiresMainQueueSetup { - // 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]; + return YES; } - (void)setBridge:(RCTBridge *)bridge diff --git a/React/DevSupport/RCTDevMenu.m b/React/DevSupport/RCTDevMenu.m index 7a760a457..644fd9bfc 100644 --- a/React/DevSupport/RCTDevMenu.m +++ b/React/DevSupport/RCTDevMenu.m @@ -99,6 +99,11 @@ RCT_EXPORT_MODULE() RCTSwapInstanceMethods([UIWindow class], @selector(motionEnded:withEvent:), @selector(RCT_motionEnded:withEvent:)); } ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + - (instancetype)init { if ((self = [super init])) { diff --git a/React/Modules/RCTAccessibilityManager.m b/React/Modules/RCTAccessibilityManager.m index ee82c70c3..a7633a64d 100644 --- a/React/Modules/RCTAccessibilityManager.m +++ b/React/Modules/RCTAccessibilityManager.m @@ -17,21 +17,7 @@ NSString *const RCTAccessibilityManagerDidUpdateMultiplierNotification = @"RCTAccessibilityManagerDidUpdateMultiplierNotification"; -@interface RCTAccessibilityManager () - -@property (nonatomic, copy) NSString *contentSizeCategory; -@property (nonatomic, assign) CGFloat multiplier; - -@end - -@implementation RCTAccessibilityManager - -@synthesize bridge = _bridge; -@synthesize multipliers = _multipliers; - -RCT_EXPORT_MODULE() - -+ (NSDictionary *)JSToUIKitMap +static NSString *UIKitCategoryFromJSCategory(NSString *JSCategory) { static NSDictionary *map = nil; static dispatch_once_t onceToken; @@ -49,12 +35,26 @@ RCT_EXPORT_MODULE() @"accessibilityExtraExtraLarge": UIContentSizeCategoryAccessibilityExtraExtraLarge, @"accessibilityExtraExtraExtraLarge": UIContentSizeCategoryAccessibilityExtraExtraExtraLarge}; }); - return map; + return map[JSCategory]; } -+ (NSString *)UIKitCategoryFromJSCategory:(NSString *)JSCategory +@interface RCTAccessibilityManager () + +@property (nonatomic, copy) NSString *contentSizeCategory; +@property (nonatomic, assign) CGFloat multiplier; + +@end + +@implementation RCTAccessibilityManager + +@synthesize bridge = _bridge; +@synthesize multipliers = _multipliers; + +RCT_EXPORT_MODULE() + ++ (BOOL)requiresMainQueueSetup { - return [self JSToUIKitMap][JSCategory]; + return YES; } - (instancetype)init @@ -71,7 +71,7 @@ RCT_EXPORT_MODULE() selector:@selector(didReceiveNewVoiceOverStatus:) name:UIAccessibilityVoiceOverStatusChanged object:nil]; - + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accessibilityAnnouncementDidFinish:) name:UIAccessibilityAnnouncementDidFinishNotification @@ -112,7 +112,7 @@ RCT_EXPORT_MODULE() // Response dictionary to populate the event with. NSDictionary *response = @{@"announcement": userInfo[UIAccessibilityAnnouncementKeyStringValue], @"success": userInfo[UIAccessibilityAnnouncementKeyWasSuccessful]}; - + #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" [_bridge.eventDispatcher sendDeviceEventWithName:@"announcementDidFinish" @@ -176,7 +176,7 @@ RCT_EXPORT_METHOD(setAccessibilityContentSizeMultipliers:(NSDictionary *)JSMulti NSMutableDictionary *multipliers = [NSMutableDictionary new]; for (NSString *__nonnull JSCategory in JSMultipliers) { NSNumber *m = [RCTConvert NSNumber:JSMultipliers[JSCategory]]; - NSString *UIKitCategory = [[self class] UIKitCategoryFromJSCategory:JSCategory]; + NSString *UIKitCategory = UIKitCategoryFromJSCategory(JSCategory); multipliers[UIKitCategory] = m; } self.multipliers = multipliers; diff --git a/React/Modules/RCTAppState.m b/React/Modules/RCTAppState.m index 1ae390271..7f5b0510a 100644 --- a/React/Modules/RCTAppState.m +++ b/React/Modules/RCTAppState.m @@ -16,8 +16,6 @@ static NSString *RCTCurrentAppBackgroundState() { - RCTAssertMainQueue(); - static NSDictionary *states; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ @@ -41,6 +39,13 @@ static NSString *RCTCurrentAppBackgroundState() RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + // UIApplication.applicationState seems reasonably safe to access from + // a background thread. + return NO; +} + - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); diff --git a/React/Modules/RCTDevSettings.mm b/React/Modules/RCTDevSettings.mm index 92f6120f7..5079cd12f 100644 --- a/React/Modules/RCTDevSettings.mm +++ b/React/Modules/RCTDevSettings.mm @@ -132,6 +132,11 @@ static NSString *const kRCTDevSettingsUserDefaultsKey = @"RCTDevMenu"; RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + return YES; // RCT_DEV-only +} + - (instancetype)init { // default behavior is to use NSUserDefaults diff --git a/React/Modules/RCTDeviceInfo.m b/React/Modules/RCTDeviceInfo.m index 342ab5788..e18bd7823 100644 --- a/React/Modules/RCTDeviceInfo.m +++ b/React/Modules/RCTDeviceInfo.m @@ -24,6 +24,11 @@ RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} + - (dispatch_queue_t)methodQueue { return dispatch_get_main_queue(); diff --git a/React/Modules/RCTI18nManager.m b/React/Modules/RCTI18nManager.m index de3666630..eee2c1af3 100644 --- a/React/Modules/RCTI18nManager.m +++ b/React/Modules/RCTI18nManager.m @@ -14,6 +14,11 @@ RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + return NO; +} + RCT_EXPORT_METHOD(allowRTL:(BOOL)value) { [[RCTI18nUtil sharedInstance] allowRTL:value]; diff --git a/React/Modules/RCTSourceCode.m b/React/Modules/RCTSourceCode.m index f14a7367f..21661fa3f 100644 --- a/React/Modules/RCTSourceCode.m +++ b/React/Modules/RCTSourceCode.m @@ -17,6 +17,11 @@ RCT_EXPORT_MODULE() @synthesize bridge = _bridge; ++ (BOOL)requiresMainQueueSetup +{ + return NO; +} + - (NSDictionary *)constantsToExport { return @{ diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 24c807804..e15e9e8db 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -77,6 +77,11 @@ NSString *const RCTUIManagerWillUpdateViewsDueToContentSizeMultiplierChangeNotif RCT_EXPORT_MODULE() ++ (BOOL)requiresMainQueueSetup +{ + return NO; +} + - (void)invalidate { /** diff --git a/React/Profiler/RCTPerfMonitor.m b/React/Profiler/RCTPerfMonitor.m index 7a2bed7f8..9751935ae 100644 --- a/React/Profiler/RCTPerfMonitor.m +++ b/React/Profiler/RCTPerfMonitor.m @@ -131,11 +131,9 @@ static vm_size_t RCTGetResidentMemorySize(void) RCT_EXPORT_MODULE() -- (instancetype)init ++ (BOOL)requiresMainQueueSetup { - // 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]; + return YES; } - (dispatch_queue_t)methodQueue