From d270dca21013d0bcfda8c78533d1555fff3660ce Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 06:04:53 -0700 Subject: [PATCH 01/16] [ReactNative] Avoid method clashing on categories Summary: @public Include `js_name` and `__LINE__` on exported methods' generated names + use the method implementation instead of `objc_msgSend` on the bridge, so it still works in case of clashing. Test Plan: Everything still working, otherwise it'd crash at startup. --- React/Base/RCTBridge.m | 5 +++-- React/Base/RCTBridgeModule.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 5b63b1d0b..52e0ecd98 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -496,7 +496,8 @@ static RCTSparseArray *RCTExportedMethodsByModuleID(void) Method method = methods[i]; SEL selector = method_getName(method); if ([NSStringFromSelector(selector) hasPrefix:@"__rct_export__"]) { - NSArray *entries = ((NSArray *(*)(id, SEL))objc_msgSend)(moduleClass, selector); + IMP imp = method_getImplementation(method); + NSArray *entries = ((NSArray *(*)(id, SEL))imp)(moduleClass, selector); RCTModuleMethod *moduleMethod = [[RCTModuleMethod alloc] initWithObjCMethodName:entries[1] JSMethodName:entries[0] @@ -1018,7 +1019,7 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin if ([module conformsToProtocol:@protocol(RCTFrameUpdateObserver)]) { [_frameUpdateObservers addObject:module]; - } + } }]; } diff --git a/React/Base/RCTBridgeModule.h b/React/Base/RCTBridgeModule.h index fc662778c..90090e847 100644 --- a/React/Base/RCTBridgeModule.h +++ b/React/Base/RCTBridgeModule.h @@ -176,7 +176,7 @@ extern const dispatch_queue_t RCTJSThread; * Like RCT_EXTERN_REMAP_METHOD, but allows setting a custom JavaScript name. */ #define RCT_EXTERN_REMAP_METHOD(js_name, method) \ - + (NSArray *)RCT_CONCAT(__rct_export__, __COUNTER__) { \ + + (NSArray *)RCT_CONCAT(__rct_export__, RCT_CONCAT(js_name, RCT_CONCAT(__LINE__, __COUNTER__))) { \ return @[@#js_name, @#method]; \ } \ From 650fc9de4c9acaabf6c275ed2809e9d705339d43 Mon Sep 17 00:00:00 2001 From: Nick Lockwood Date: Mon, 15 Jun 2015 07:53:45 -0700 Subject: [PATCH 02/16] Increased warning levels to -Wall -Wextra, and fixed Xcode 7 beta issues Summary: @public I've increased the warning levels in the OSS frameworks, which caught a bunch of minor issues. I also fixed some new errors in Xcode 7 relating to designated initializers and TLS security. Test Plan: * Test the sample apps and make sure they still work. * Run tests. --- Examples/2048/2048.xcodeproj/project.pbxproj | 5 +- Examples/2048/2048/Info.plist | 7 +- Examples/Movies/Movies/Info.plist | 6 + Examples/SampleApp/iOS/Info.plist | 6 + .../TicTacToe.xcodeproj/project.pbxproj | 5 +- .../xcshareddata/xcschemes/TicTacToe.xcscheme | 11 +- Examples/TicTacToe/TicTacToe/Info.plist | 8 +- Examples/TicTacToe/TicTacToe/main.m | 2 +- .../UIExplorer.xcodeproj/project.pbxproj | 37 ++++++- .../xcschemes/UIExplorer.xcscheme | 5 +- Examples/UIExplorer/UIExplorer/AppDelegate.m | 2 +- Examples/UIExplorer/UIExplorer/Info.plist | 8 +- Examples/UIExplorer/UIExplorer/main.m | 2 +- .../UIExplorerIntegrationTests/Info.plist | 2 +- .../UIExplorer/UIExplorerUnitTests/Info.plist | 2 +- .../UIExplorerUnitTests/RCTAllocationTests.m | 4 +- .../UIExplorerUnitTests/RCTBridgeTests.m | 12 +- .../RCTContextExecutorTests.m | 10 +- .../RCTConvert_NSURLTests.m | 2 +- .../UIExplorerUnitTests/RCTUIManagerTests.m | 4 +- .../RCTActionSheet.xcodeproj/project.pbxproj | 10 ++ .../ActionSheetIOS/RCTActionSheetManager.m | 41 +++---- .../RCTAdSupport.xcodeproj/project.pbxproj | 10 ++ .../RCTGeolocation.xcodeproj/project.pbxproj | 10 ++ .../Image/RCTImage.xcodeproj/project.pbxproj | 10 ++ Libraries/Image/RCTNetworkImageView.h | 3 +- Libraries/Image/RCTNetworkImageView.m | 11 +- Libraries/Image/RCTNetworkImageViewManager.m | 4 +- Libraries/Network/RCTDataManager.m | 9 ++ .../RCTNetwork.xcodeproj/project.pbxproj | 10 ++ Libraries/Network/RCTReachability.m | 6 +- .../project.pbxproj | 10 ++ .../RCTPushNotificationManager.m | 11 +- .../RCTTest/RCTTest.xcodeproj/project.pbxproj | 10 ++ Libraries/RCTTest/RCTTestRunner.h | 4 +- Libraries/RCTTest/RCTTestRunner.m | 6 + .../RCTSettings.xcodeproj/project.pbxproj | 10 ++ .../Text/RCTText.xcodeproj/project.pbxproj | 10 ++ Libraries/Text/RCTTextView.m | 6 +- .../RCTVibration.xcodeproj/project.pbxproj | 10 ++ Libraries/WebSocket/RCTSRWebSocket.m | 21 ++-- .../RCTWebSocket.xcodeproj/project.pbxproj | 12 ++ Libraries/WebSocket/RCTWebSocketExecutor.m | 4 +- React/Base/RCTAssert.h | 15 +-- React/Base/RCTAssert.m | 9 ++ React/Base/RCTBridge.m | 103 +++++++++++------- React/Base/RCTCache.m | 9 +- React/Base/RCTConvert.m | 50 ++++----- React/Base/RCTDefines.h | 16 ++- React/Base/RCTDevMenu.m | 26 +++-- React/Base/RCTEventDispatcher.m | 19 +--- React/Base/RCTFPSGraph.m | 12 +- React/Base/RCTJavaScriptExecutor.h | 2 +- React/Base/RCTJavaScriptLoader.m | 4 + React/Base/RCTKeyCommands.m | 4 +- React/Base/RCTLog.h | 9 +- React/Base/RCTLog.m | 40 +++---- React/Base/RCTProfile.m | 10 +- React/Base/RCTRedBox.m | 6 +- React/Base/RCTRootView.m | 7 +- React/Base/RCTTouchHandler.m | 13 ++- React/Base/RCTUtils.h | 3 - React/Base/RCTUtils.m | 19 +--- React/Executors/RCTContextExecutor.m | 13 ++- React/Executors/RCTWebViewExecutor.m | 5 +- React/Modules/RCTAlertManager.m | 2 +- React/Modules/RCTTiming.m | 2 +- React/Modules/RCTUIManager.m | 86 ++++++++------- React/React.xcodeproj/project.pbxproj | 10 ++ React/Views/RCTMapManager.m | 4 +- React/Views/RCTNavigator.m | 27 +++-- React/Views/RCTNavigatorManager.m | 7 +- React/Views/RCTPicker.m | 27 +++-- React/Views/RCTPickerManager.m | 2 +- React/Views/RCTScrollView.m | 39 +++++-- React/Views/RCTScrollViewManager.m | 2 +- React/Views/RCTShadowView.m | 3 +- React/Views/RCTTabBar.m | 20 +++- React/Views/RCTTextField.m | 5 +- React/Views/RCTTextFieldManager.m | 6 +- React/Views/RCTView.m | 6 +- React/Views/RCTViewManager.m | 10 +- React/Views/RCTWebView.m | 16 ++- React/Views/RCTWebViewManager.m | 6 +- React/Views/RCTWrapperViewController.m | 10 +- React/Views/UIView+React.m | 2 +- 86 files changed, 715 insertions(+), 349 deletions(-) diff --git a/Examples/2048/2048.xcodeproj/project.pbxproj b/Examples/2048/2048.xcodeproj/project.pbxproj index d792a2d62..43fd7518b 100644 --- a/Examples/2048/2048.xcodeproj/project.pbxproj +++ b/Examples/2048/2048.xcodeproj/project.pbxproj @@ -159,7 +159,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = Facebook; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "2048" */; @@ -271,6 +271,7 @@ "/Users/sahrens/src/fbobjc-hg/Libraries/FBReactKit/js/react-native-github/Libraries/Animation/build/Debug-iphoneos", ); OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = 2048; }; name = Debug; @@ -291,6 +292,7 @@ "/Users/sahrens/src/fbobjc-hg/Libraries/FBReactKit/js/react-native-github/Libraries/Animation/build/Debug-iphoneos", ); OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = 2048; }; name = Release; @@ -315,6 +317,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/Examples/2048/2048/Info.plist b/Examples/2048/2048/Info.plist index 1c298405a..610544546 100644 --- a/Examples/2048/2048/Info.plist +++ b/Examples/2048/2048/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.facebook.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -22,6 +22,11 @@ 1 LSRequiresIPhoneOS + NSAppTransportSecurity + + NSAllowsArbitraryLoads + + UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities diff --git a/Examples/Movies/Movies/Info.plist b/Examples/Movies/Movies/Info.plist index f76d0502a..f8c4225c4 100644 --- a/Examples/Movies/Movies/Info.plist +++ b/Examples/Movies/Movies/Info.plist @@ -47,5 +47,11 @@ UIViewControllerBasedStatusBarAppearance + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + diff --git a/Examples/SampleApp/iOS/Info.plist b/Examples/SampleApp/iOS/Info.plist index 0a56a6ea8..cddf0766c 100644 --- a/Examples/SampleApp/iOS/Info.plist +++ b/Examples/SampleApp/iOS/Info.plist @@ -38,5 +38,11 @@ NSLocationWhenInUseUsageDescription + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + diff --git a/Examples/TicTacToe/TicTacToe.xcodeproj/project.pbxproj b/Examples/TicTacToe/TicTacToe.xcodeproj/project.pbxproj index db9c36269..96c29bc3a 100644 --- a/Examples/TicTacToe/TicTacToe.xcodeproj/project.pbxproj +++ b/Examples/TicTacToe/TicTacToe.xcodeproj/project.pbxproj @@ -159,7 +159,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = Facebook; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "TicTacToe" */; @@ -268,6 +268,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = TicTacToe; }; name = Debug; @@ -285,6 +286,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = TicTacToe; }; name = Release; @@ -309,6 +311,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; diff --git a/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme b/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme index 5903ce6f4..193efdb7d 100644 --- a/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme +++ b/Examples/TicTacToe/TicTacToe.xcodeproj/xcshareddata/xcschemes/TicTacToe.xcscheme @@ -1,6 +1,6 @@ + + - + - + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.facebook.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -36,5 +36,11 @@ UIViewControllerBasedStatusBarAppearance + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + diff --git a/Examples/TicTacToe/TicTacToe/main.m b/Examples/TicTacToe/TicTacToe/main.m index 8954f343c..9c58a39a4 100644 --- a/Examples/TicTacToe/TicTacToe/main.m +++ b/Examples/TicTacToe/TicTacToe/main.m @@ -17,6 +17,6 @@ int main(int argc, char * argv[]) { @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } diff --git a/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj b/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj index 28361d706..c266cabcf 100644 --- a/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj +++ b/Examples/UIExplorer/UIExplorer.xcodeproj/project.pbxproj @@ -560,7 +560,7 @@ 83CBB9F71A601CBA00E9B192 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0610; + LastUpgradeCheck = 0700; ORGANIZATIONNAME = Facebook; TargetAttributes = { 004D289D1AAF61C70097A701 = { @@ -850,6 +850,7 @@ XCTest, "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -879,6 +880,7 @@ XCTest, "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; @@ -898,6 +900,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.internal.uiexplorer.local; PRODUCT_NAME = UIExplorer; }; name = Debug; @@ -916,6 +919,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited)"; LIBRARY_SEARCH_PATHS = "$(inherited)"; OTHER_LDFLAGS = "-ObjC"; + PRODUCT_BUNDLE_IDENTIFIER = com.facebook.internal.uiexplorer.local; PRODUCT_NAME = UIExplorer; }; name = Release; @@ -943,6 +947,7 @@ XCTest, "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.React.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UIExplorer.app/UIExplorer"; }; @@ -968,6 +973,7 @@ XCTest, "-ObjC", ); + PRODUCT_BUNDLE_IDENTIFIER = "com.facebook.React.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/UIExplorer.app/UIExplorer"; }; @@ -981,18 +987,23 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ASSIGN_ENUM = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -1002,10 +1013,16 @@ ); GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -1016,6 +1033,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Debug; }; @@ -1027,12 +1048,16 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_ASSIGN_ENUM = YES; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -1042,10 +1067,16 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_MISSING_NEWLINE = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; + GCC_WARN_MULTIPLE_DEFINITION_TYPES_FOR_SELECTOR = YES; + GCC_WARN_STRICT_SELECTOR_MATCH = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNKNOWN_PRAGMAS = YES; GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_LABEL = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( "$(inherited)", @@ -1056,6 +1087,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Release; }; diff --git a/Examples/UIExplorer/UIExplorer.xcodeproj/xcshareddata/xcschemes/UIExplorer.xcscheme b/Examples/UIExplorer/UIExplorer.xcodeproj/xcshareddata/xcschemes/UIExplorer.xcscheme index cb55d85b0..c3dcde8eb 100644 --- a/Examples/UIExplorer/UIExplorer.xcodeproj/xcshareddata/xcschemes/UIExplorer.xcscheme +++ b/Examples/UIExplorer/UIExplorer.xcodeproj/xcshareddata/xcschemes/UIExplorer.xcscheme @@ -1,6 +1,6 @@ + + diff --git a/Examples/UIExplorer/UIExplorer/AppDelegate.m b/Examples/UIExplorer/UIExplorer/AppDelegate.m index 5e707db41..6a5ad20e5 100644 --- a/Examples/UIExplorer/UIExplorer/AppDelegate.m +++ b/Examples/UIExplorer/UIExplorer/AppDelegate.m @@ -18,7 +18,7 @@ @implementation AppDelegate -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +- (BOOL)application:(__unused UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { NSURL *jsCodeLocation; diff --git a/Examples/UIExplorer/UIExplorer/Info.plist b/Examples/UIExplorer/UIExplorer/Info.plist index 349bd9a28..9e91b1cef 100644 --- a/Examples/UIExplorer/UIExplorer/Info.plist +++ b/Examples/UIExplorer/UIExplorer/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.facebook.internal.uiexplorer.local + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName @@ -38,5 +38,11 @@ UIViewControllerBasedStatusBarAppearance + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + diff --git a/Examples/UIExplorer/UIExplorer/main.m b/Examples/UIExplorer/UIExplorer/main.m index 8954f343c..9c58a39a4 100644 --- a/Examples/UIExplorer/UIExplorer/main.m +++ b/Examples/UIExplorer/UIExplorer/main.m @@ -17,6 +17,6 @@ int main(int argc, char * argv[]) { @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } } diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/Info.plist b/Examples/UIExplorer/UIExplorerIntegrationTests/Info.plist index 802c25416..ba72822e8 100644 --- a/Examples/UIExplorer/UIExplorerIntegrationTests/Info.plist +++ b/Examples/UIExplorer/UIExplorerIntegrationTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.facebook.React.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Examples/UIExplorer/UIExplorerUnitTests/Info.plist b/Examples/UIExplorer/UIExplorerUnitTests/Info.plist index 87e3a6175..ba72822e8 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/Info.plist +++ b/Examples/UIExplorer/UIExplorerUnitTests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.facebook.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTAllocationTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTAllocationTests.m index 7eafce75e..aac517fc9 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTAllocationTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTAllocationTests.m @@ -158,7 +158,9 @@ RCT_EXPORT_MODULE(); - (void)testContentViewIsInvalidated { - RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil moduleProvider:nil launchOptions:nil]; + RCTBridge *bridge = [[RCTBridge alloc] initWithBundleURL:nil + moduleProvider:nil + launchOptions:nil]; __weak id rootContentView; @autoreleasepool { RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge moduleName:@""]; diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m index 390459b1b..ea6af0805 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTBridgeTests.m @@ -42,17 +42,17 @@ RCT_EXPORT_MODULE() return YES; } -- (void)executeJSCall:(NSString *)name - method:(NSString *)method - arguments:(NSArray *)arguments - context:(NSNumber *)executorID +- (void)executeJSCall:(__unused NSString *)name + method:(__unused NSString *)method + arguments:(__unused NSArray *)arguments + context:(__unused NSNumber *)executorID callback:(RCTJavaScriptCallback)onComplete { onComplete(nil, nil); } -- (void)executeApplicationScript:(NSString *)script - sourceURL:(NSURL *)url +- (void)executeApplicationScript:(__unused NSString *)script + sourceURL:(__unused NSURL *)url onComplete:(RCTJavaScriptCompleteBlock)onComplete { onComplete(nil); diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m index ba2bf87bb..743cc286b 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTContextExecutorTests.m @@ -30,7 +30,7 @@ dispatch_semaphore_t doneSem = dispatch_semaphore_create(0); [_executor executeApplicationScript:@"var x = {toString: function() { throw 1; }}; nativeLoggingHook(x);" sourceURL:[NSURL URLWithString:@"file://"] - onComplete:^(id error){ + onComplete:^(__unused id error){ dispatch_semaphore_signal(doneSem); }]; dispatch_semaphore_wait(doneSem, DISPATCH_TIME_FOREVER); @@ -39,7 +39,7 @@ static uint64_t _get_time_nanoseconds(void) { - static struct mach_timebase_info tb_info = {0}; + static struct mach_timebase_info tb_info = {0, 0}; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ int ret = mach_timebase_info(&tb_info); @@ -114,7 +114,7 @@ static uint64_t _get_time_nanoseconds(void) } \ "; - [_executor executeApplicationScript:script sourceURL:[NSURL URLWithString:@"http://localhost:8081/"] onComplete:^(NSError *error) { + [_executor executeApplicationScript:script sourceURL:[NSURL URLWithString:@"http://localhost:8081/"] onComplete:^(__unused NSError *error) { NSMutableArray *params = [[NSMutableArray alloc] init]; id data = @1; for (int i = 0; i < 4; i++) { @@ -128,8 +128,8 @@ static uint64_t _get_time_nanoseconds(void) method:@"method" arguments:params context:RCTGetExecutorID(_executor) - callback:^(id json, NSError *__error) { - RCTAssert([json isEqual:@YES], @"Invalid return"); + callback:^(id json, __unused NSError *unused) { + XCTAssert([json isEqual:@YES], @"Invalid return"); }]; double run = _get_time_nanoseconds() - start; if ((j % frequency) == frequency - 1) { // Warmup diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTConvert_NSURLTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTConvert_NSURLTests.m index c36c09a8e..8897ee060 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTConvert_NSURLTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTConvert_NSURLTests.m @@ -13,7 +13,7 @@ #define TEST_URL(name, _input, _expectedURL) \ - (void)test_##name { \ NSURL *result = [RCTConvert NSURL:_input]; \ - NSURL *expected = [NSURL URLWithString:_expectedURL]; \ + NSURL *expected = (_expectedURL) ? [NSURL URLWithString:_expectedURL ?: @""] : nil; \ XCTAssertEqualObjects(result.absoluteURL, expected); \ } \ diff --git a/Examples/UIExplorer/UIExplorerUnitTests/RCTUIManagerTests.m b/Examples/UIExplorer/UIExplorerUnitTests/RCTUIManagerTests.m index 3a4f62027..388761a8f 100644 --- a/Examples/UIExplorer/UIExplorerUnitTests/RCTUIManagerTests.m +++ b/Examples/UIExplorer/UIExplorerUnitTests/RCTUIManagerTests.m @@ -136,7 +136,7 @@ // We need to keep these in array to keep them around NSMutableArray *viewsToRemove = [NSMutableArray array]; - for (NSInteger i = 0; i < removeAtIndices.count; i++) { + for (NSUInteger i = 0; i < removeAtIndices.count; i++) { NSNumber *reactTagToRemove = @([removeAtIndices[i] integerValue] + 1); UIView *viewToRemove = _uiManager.viewRegistry[reactTagToRemove]; [viewsToRemove addObject:viewToRemove]; @@ -160,7 +160,7 @@ instead have the following subviews %@", [containerView reactSubviews]); NSArray *expectedReactTags = @[@11, @5, @1, @2, @7, @8, @12, @10]; - for (NSInteger i = 0; i < [[containerView subviews] count]; i++) { + for (NSUInteger i = 0; i < containerView.subviews.count; i++) { XCTAssertEqualObjects([[containerView reactSubviews][i] reactTag], expectedReactTags[i], @"Expected subview at index %ld to have react tag #%@ but has tag #%@", (long)i, expectedReactTags[i], [[containerView reactSubviews][i] reactTag]); diff --git a/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj/project.pbxproj b/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj/project.pbxproj index 8434df87d..a73b70085 100644 --- a/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj/project.pbxproj +++ b/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj/project.pbxproj @@ -150,6 +150,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -158,6 +159,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Debug; }; @@ -184,6 +189,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -192,6 +198,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/ActionSheetIOS/RCTActionSheetManager.m b/Libraries/ActionSheetIOS/RCTActionSheetManager.m index 4883aa647..a736387fe 100644 --- a/Libraries/ActionSheetIOS/RCTActionSheetManager.m +++ b/Libraries/ActionSheetIOS/RCTActionSheetManager.m @@ -37,7 +37,7 @@ RCT_EXPORT_MODULE() } RCT_EXPORT_METHOD(showActionSheetWithOptions:(NSDictionary *)options - failureCallback:(RCTResponseSenderBlock)failureCallback + failureCallback:(__unused RCTResponseSenderBlock)failureCallback successCallback:(RCTResponseSenderBlock)successCallback) { UIActionSheet *actionSheet = [[UIActionSheet alloc] init]; @@ -86,34 +86,29 @@ RCT_EXPORT_METHOD(showShareActionSheetWithOptions:(NSDictionary *)options } UIActivityViewController *share = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil]; UIViewController *ctrl = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; - if ([share respondsToSelector:@selector(setCompletionWithItemsHandler:)]) { - share.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { + +#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 + + if (![UIActivityViewController instancesRespondToSelector:@selector(setCompletionWithItemsHandler:)]) { + // Legacy iOS 7 implementation + share.completionHandler = ^(NSString *activityType, BOOL completed) { + successCallback(@[@(completed), RCTNullIfNil(activityType)]); + }; + } else + +#endif + + { + // iOS 8 version + share.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, __unused NSArray *returnedItems, NSError *activityError) { if (activityError) { - failureCallback(@[[activityError localizedDescription]]); + failureCallback(@[RCTNullIfNil(activityError.localizedDescription)]); } else { successCallback(@[@(completed), RCTNullIfNil(activityType)]); } }; - } else { - -#if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 - - if (![UIActivityViewController instancesRespondToSelector:@selector(completionWithItemsHandler)]) { - // Legacy iOS 7 implementation - share.completionHandler = ^(NSString *activityType, BOOL completed) { - successCallback(@[@(completed), RCTNullIfNil(activityType)]); - }; - } else - -#endif - - { - // iOS 8 version - share.completionWithItemsHandler = ^(NSString *activityType, BOOL completed, NSArray *returnedItems, NSError *activityError) { - successCallback(@[@(completed), RCTNullIfNil(activityType)]); - }; - } } + [ctrl presentViewController:share animated:YES completion:nil]; } diff --git a/Libraries/AdSupport/RCTAdSupport.xcodeproj/project.pbxproj b/Libraries/AdSupport/RCTAdSupport.xcodeproj/project.pbxproj index 1b89d7bfa..238838a93 100644 --- a/Libraries/AdSupport/RCTAdSupport.xcodeproj/project.pbxproj +++ b/Libraries/AdSupport/RCTAdSupport.xcodeproj/project.pbxproj @@ -150,6 +150,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -163,6 +164,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -189,6 +194,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -202,6 +208,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Geolocation/RCTGeolocation.xcodeproj/project.pbxproj b/Libraries/Geolocation/RCTGeolocation.xcodeproj/project.pbxproj index ee79e7571..93d6a375f 100644 --- a/Libraries/Geolocation/RCTGeolocation.xcodeproj/project.pbxproj +++ b/Libraries/Geolocation/RCTGeolocation.xcodeproj/project.pbxproj @@ -150,6 +150,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -158,6 +159,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -184,6 +189,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -192,6 +198,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Image/RCTImage.xcodeproj/project.pbxproj b/Libraries/Image/RCTImage.xcodeproj/project.pbxproj index 667995586..9e5427bf3 100644 --- a/Libraries/Image/RCTImage.xcodeproj/project.pbxproj +++ b/Libraries/Image/RCTImage.xcodeproj/project.pbxproj @@ -198,6 +198,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -206,6 +207,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -232,6 +237,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -240,6 +246,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Image/RCTNetworkImageView.h b/Libraries/Image/RCTNetworkImageView.h index 55c7720ee..e04f71e32 100644 --- a/Libraries/Image/RCTNetworkImageView.h +++ b/Libraries/Image/RCTNetworkImageView.h @@ -13,8 +13,7 @@ @interface RCTNetworkImageView : UIView -- (instancetype)initWithFrame:(CGRect)frame - imageDownloader:(RCTImageDownloader *)imageDownloader NS_DESIGNATED_INITIALIZER; +- (instancetype)initWithImageDownloader:(RCTImageDownloader *)imageDownloader NS_DESIGNATED_INITIALIZER; /** * An image that will appear while the view is loading the image from the network, diff --git a/Libraries/Image/RCTNetworkImageView.m b/Libraries/Image/RCTNetworkImageView.m index 89cddef59..5a286e020 100644 --- a/Libraries/Image/RCTNetworkImageView.m +++ b/Libraries/Image/RCTNetworkImageView.m @@ -9,6 +9,7 @@ #import "RCTNetworkImageView.h" +#import "RCTAssert.h" #import "RCTConvert.h" #import "RCTGIFImage.h" #import "RCTImageDownloader.h" @@ -25,16 +26,22 @@ id _downloadToken; } -- (instancetype)initWithFrame:(CGRect)frame imageDownloader:(RCTImageDownloader *)imageDownloader +- (instancetype)initWithImageDownloader:(RCTImageDownloader *)imageDownloader { - if ((self = [super initWithFrame:frame])) { + RCTAssertParam(imageDownloader); + + if ((self = [super initWithFrame:CGRectZero])) { _deferSentinel = 0; _imageDownloader = imageDownloader; self.userInteractionEnabled = NO; + self.contentMode = UIViewContentModeScaleAspectFill; } return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (NSURL *)imageURL { // We clear our imageURL when we are not in a window for a while, diff --git a/Libraries/Image/RCTNetworkImageViewManager.m b/Libraries/Image/RCTNetworkImageViewManager.m index 005b726cf..3fcd4a75b 100644 --- a/Libraries/Image/RCTNetworkImageViewManager.m +++ b/Libraries/Image/RCTNetworkImageViewManager.m @@ -22,9 +22,7 @@ RCT_EXPORT_MODULE() - (UIView *)view { - RCTNetworkImageView *view = [[RCTNetworkImageView alloc] initWithFrame:CGRectZero imageDownloader:[RCTImageDownloader sharedInstance]]; - view.contentMode = UIViewContentModeScaleAspectFill; - return view; + return [[RCTNetworkImageView alloc] initWithImageDownloader:[RCTImageDownloader sharedInstance]]; } RCT_REMAP_VIEW_PROPERTY(defaultImageSrc, defaultImage, UIImage) diff --git a/Libraries/Network/RCTDataManager.m b/Libraries/Network/RCTDataManager.m index 56e13af70..ed2c560d8 100644 --- a/Libraries/Network/RCTDataManager.m +++ b/Libraries/Network/RCTDataManager.m @@ -164,6 +164,10 @@ typedef void (^RCTDataLoaderCallback)(NSData *data, NSString *MIMEType, NSError handler:(id)handler callback:(RCTDataLoaderCallback)callback { + RCTAssertParam(request); + RCTAssertParam(handler); + RCTAssertParam(callback); + if ((self = [super init])) { _callback = callback; _request = [[RCTActiveURLRequest alloc] init]; @@ -175,6 +179,11 @@ typedef void (^RCTDataLoaderCallback)(NSData *data, NSString *MIMEType, NSError return self; } +- (instancetype)init +{ + return [self initWithRequest:nil handler:nil callback:nil]; +} + - (void)URLRequest:(id)requestToken didReceiveResponse:(NSURLResponse *)response { RCTAssert([requestToken isEqual:_requestToken], @"Shouldn't ever happen"); diff --git a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj index dba7c65fa..becf442fa 100644 --- a/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj +++ b/Libraries/Network/RCTNetwork.xcodeproj/project.pbxproj @@ -162,6 +162,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -170,6 +171,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -196,6 +201,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -204,6 +210,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Network/RCTReachability.m b/Libraries/Network/RCTReachability.m index e0711571b..7c5530127 100644 --- a/Libraries/Network/RCTReachability.m +++ b/Libraries/Network/RCTReachability.m @@ -9,6 +9,7 @@ #import "RCTReachability.h" +#import "RCTAssert.h" #import "RCTBridge.h" #import "RCTEventDispatcher.h" @@ -59,9 +60,12 @@ static void RCTReachabilityCallback(__unused SCNetworkReachabilityRef target, SC - (instancetype)initWithHost:(NSString *)host { + RCTAssertParam(host); + RCTAssert(![host hasPrefix:@"http"], @"Host value should just contain the domain, not the URL scheme."); + if ((self = [super init])) { _status = RCTReachabilityStateUnknown; - _reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, [host UTF8String]); + _reachability = SCNetworkReachabilityCreateWithName(kCFAllocatorDefault, host.UTF8String); SCNetworkReachabilityContext context = { 0, ( __bridge void *)self, NULL, NULL, NULL }; SCNetworkReachabilitySetCallback(_reachability, RCTReachabilityCallback, &context); SCNetworkReachabilityScheduleWithRunLoop(_reachability, CFRunLoopGetMain(), kCFRunLoopCommonModes); diff --git a/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/project.pbxproj b/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/project.pbxproj index 1585e6c42..7b555c089 100644 --- a/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/project.pbxproj +++ b/Libraries/PushNotificationIOS/RCTPushNotification.xcodeproj/project.pbxproj @@ -147,6 +147,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -155,6 +156,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Debug; }; @@ -182,6 +187,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -190,6 +196,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m index 1c034a9b7..97de4aa07 100644 --- a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m +++ b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m @@ -61,18 +61,19 @@ RCT_EXPORT_MODULE() _initialNotification = [bridge.launchOptions[UIApplicationLaunchOptionsRemoteNotificationKey] copy]; } -+ (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings ++ (void)application:(__unused UIApplication *)application didRegisterUserNotificationSettings:(__unused UIUserNotificationSettings *)notificationSettings { if ([application respondsToSelector:@selector(registerForRemoteNotifications)]) { [application registerForRemoteNotifications]; } } -+ (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken ++ (void)application:(__unused UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSMutableString *hexString = [NSMutableString string]; - const unsigned char *bytes = [deviceToken bytes]; - for (int i = 0; i < [deviceToken length]; i++) { + NSUInteger deviceTokenLength = deviceToken.length; + const unsigned char *bytes = deviceToken.bytes; + for (NSUInteger i = 0; i < deviceTokenLength; i++) { [hexString appendFormat:@"%02x", bytes[i]]; } NSDictionary *userInfo = @{ @@ -83,7 +84,7 @@ RCT_EXPORT_MODULE() userInfo:userInfo]; } -+ (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification ++ (void)application:(__unused UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)notification { [[NSNotificationCenter defaultCenter] postNotificationName:RCTRemoteNotificationReceived object:self diff --git a/Libraries/RCTTest/RCTTest.xcodeproj/project.pbxproj b/Libraries/RCTTest/RCTTest.xcodeproj/project.pbxproj index 6ab58a8a2..f1165171f 100644 --- a/Libraries/RCTTest/RCTTest.xcodeproj/project.pbxproj +++ b/Libraries/RCTTest/RCTTest.xcodeproj/project.pbxproj @@ -188,6 +188,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -201,6 +202,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -227,6 +232,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -240,6 +246,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/RCTTest/RCTTestRunner.h b/Libraries/RCTTest/RCTTestRunner.h index 1b37ba492..21b558b8c 100644 --- a/Libraries/RCTTest/RCTTestRunner.h +++ b/Libraries/RCTTest/RCTTestRunner.h @@ -28,10 +28,10 @@ * macro instead of calling this directly. * * @param app The path to the app bundle without suffixes, e.g. IntegrationTests/IntegrationTestsApp - * @param referencesDir The path for snapshot references images. The RCTInitRunnerForApp macro uses + * @param referenceDir The path for snapshot references images. The RCTInitRunnerForApp macro uses * FB_REFERENCE_IMAGE_DIR for this automatically. */ -- (instancetype)initWithApp:(NSString *)app referenceDir:(NSString *)referenceDir; +- (instancetype)initWithApp:(NSString *)app referenceDir:(NSString *)referenceDir NS_DESIGNATED_INITIALIZER; /** * Simplest runTest function simply mounts the specified JS module with no diff --git a/Libraries/RCTTest/RCTTestRunner.m b/Libraries/RCTTest/RCTTestRunner.m index 8a7e739bb..11c57e0ba 100644 --- a/Libraries/RCTTest/RCTTestRunner.m +++ b/Libraries/RCTTest/RCTTestRunner.m @@ -10,6 +10,7 @@ #import "RCTTestRunner.h" #import "FBSnapshotTestController.h" +#import "RCTAssert.h" #import "RCTRedBox.h" #import "RCTRootView.h" #import "RCTTestModule.h" @@ -30,6 +31,9 @@ - (instancetype)initWithApp:(NSString *)app referenceDir:(NSString *)referenceDir { + RCTAssertParam(app); + RCTAssertParam(referenceDir); + if ((self = [super init])) { NSString *sanitizedAppName = [app stringByReplacingOccurrencesOfString:@"/" withString:@"-"]; sanitizedAppName = [sanitizedAppName stringByReplacingOccurrencesOfString:@"\\" withString:@"-"]; @@ -44,6 +48,8 @@ return self; } +RCT_NOT_IMPLEMENTED(-init) + - (void)setRecordMode:(BOOL)recordMode { _testController.recordMode = recordMode; diff --git a/Libraries/Settings/RCTSettings.xcodeproj/project.pbxproj b/Libraries/Settings/RCTSettings.xcodeproj/project.pbxproj index 9cbc4e4dd..a0a5e1bf1 100644 --- a/Libraries/Settings/RCTSettings.xcodeproj/project.pbxproj +++ b/Libraries/Settings/RCTSettings.xcodeproj/project.pbxproj @@ -148,6 +148,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -156,6 +157,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -182,6 +187,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -190,6 +196,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Text/RCTText.xcodeproj/project.pbxproj b/Libraries/Text/RCTText.xcodeproj/project.pbxproj index 224c7e6b9..ac1478fb0 100644 --- a/Libraries/Text/RCTText.xcodeproj/project.pbxproj +++ b/Libraries/Text/RCTText.xcodeproj/project.pbxproj @@ -186,6 +186,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -194,6 +195,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -220,6 +225,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -228,6 +234,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/Text/RCTTextView.m b/Libraries/Text/RCTTextView.m index fa5b2bf8a..31850be5a 100644 --- a/Libraries/Text/RCTTextView.m +++ b/Libraries/Text/RCTTextView.m @@ -25,6 +25,8 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { + RCTAssertParam(eventDispatcher); + if ((self = [super initWithFrame:CGRectZero])) { _contentInset = UIEdgeInsetsZero; _eventDispatcher = eventDispatcher; @@ -35,10 +37,12 @@ _textView.delegate = self; [self addSubview:_textView]; } - return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)updateFrames { // Adjust the insets so that they are as close as possible to single-line diff --git a/Libraries/Vibration/RCTVibration.xcodeproj/project.pbxproj b/Libraries/Vibration/RCTVibration.xcodeproj/project.pbxproj index f8aec3fed..e4c3e4a2e 100644 --- a/Libraries/Vibration/RCTVibration.xcodeproj/project.pbxproj +++ b/Libraries/Vibration/RCTVibration.xcodeproj/project.pbxproj @@ -150,6 +150,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -163,6 +164,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -189,6 +194,7 @@ GCC_C_LANGUAGE_STANDARD = gnu99; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -202,6 +208,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; diff --git a/Libraries/WebSocket/RCTSRWebSocket.m b/Libraries/WebSocket/RCTSRWebSocket.m index 6d36d80b2..b65a847ee 100644 --- a/Libraries/WebSocket/RCTSRWebSocket.m +++ b/Libraries/WebSocket/RCTSRWebSocket.m @@ -246,8 +246,9 @@ static __strong NSData *CRLFCRLF; - (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray *)protocols; { + RCTAssertParam(request); + if ((self = [super init])) { - assert(request.URL); _url = request.URL; _urlRequest = request; @@ -255,23 +256,24 @@ static __strong NSData *CRLFCRLF; [self _RCTSR_commonInit]; } - return self; } +RCT_NOT_IMPLEMENTED(-init) + - (instancetype)initWithURLRequest:(NSURLRequest *)request; { return [self initWithURLRequest:request protocols:nil]; } -- (instancetype)initWithURL:(NSURL *)url; +- (instancetype)initWithURL:(NSURL *)URL; { - return [self initWithURL:url protocols:nil]; + return [self initWithURL:URL protocols:nil]; } -- (instancetype)initWithURL:(NSURL *)url protocols:(NSArray *)protocols; +- (instancetype)initWithURL:(NSURL *)URL protocols:(NSArray *)protocols; { - NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; + NSURLRequest *request = URL ? [NSURLRequest requestWithURL:URL] : nil; return [self initWithURLRequest:request protocols:protocols]; } @@ -1610,7 +1612,7 @@ static NSRunLoop *networkRunLoop = nil; _runLoop = [NSRunLoop currentRunLoop]; dispatch_group_leave(_waitGroup); - NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate distantFuture] interval:0.0 target:nil selector:nil userInfo:nil repeats:NO]; + NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate distantFuture] interval:0.0 target:self selector:@selector(step) userInfo:nil repeats:NO]; [_runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; while ([_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { } @@ -1618,6 +1620,11 @@ static NSRunLoop *networkRunLoop = nil; } } +- (void)step +{ + // Does nothing +} + - (NSRunLoop *)runLoop; { dispatch_group_wait(_waitGroup, DISPATCH_TIME_FOREVER); diff --git a/Libraries/WebSocket/RCTWebSocket.xcodeproj/project.pbxproj b/Libraries/WebSocket/RCTWebSocket.xcodeproj/project.pbxproj index f4ce6d206..d1c691d0f 100644 --- a/Libraries/WebSocket/RCTWebSocket.xcodeproj/project.pbxproj +++ b/Libraries/WebSocket/RCTWebSocket.xcodeproj/project.pbxproj @@ -151,6 +151,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -159,6 +160,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Debug; }; @@ -187,6 +192,7 @@ GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -195,6 +201,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Werror", + "-Wall", + ); }; name = Release; }; @@ -202,6 +212,7 @@ isa = XCBuildConfiguration; buildSettings = { EXECUTABLE_PREFIX = lib; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, @@ -218,6 +229,7 @@ isa = XCBuildConfiguration; buildSettings = { EXECUTABLE_PREFIX = lib; + GCC_TREAT_WARNINGS_AS_ERRORS = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, diff --git a/Libraries/WebSocket/RCTWebSocketExecutor.m b/Libraries/WebSocket/RCTWebSocketExecutor.m index c5c216fc7..0f8f433b0 100644 --- a/Libraries/WebSocket/RCTWebSocketExecutor.m +++ b/Libraries/WebSocket/RCTWebSocketExecutor.m @@ -43,7 +43,9 @@ RCT_EXPORT_MODULE() - (instancetype)initWithURL:(NSURL *)URL { - if (self = [super init]) { + RCTAssertParam(URL); + + if ((self = [super init])) { _url = URL; } return self; diff --git a/React/Base/RCTAssert.h b/React/Base/RCTAssert.h index 1fc5b9d32..c7a331b43 100644 --- a/React/Base/RCTAssert.h +++ b/React/Base/RCTAssert.h @@ -27,12 +27,6 @@ typedef void (^RCTAssertFunction)( NSString *message ); -/** - * Private logging function - ignore this. - */ -RCT_EXTERN void _RCTAssertFormat( - BOOL, const char *, int, const char *, NSString *, ...) NS_FORMAT_FUNCTION(5,6); - /** * This is the main assert macro that you should use. */ @@ -41,12 +35,19 @@ if (RCT_NSASSERT && !pass) { [[NSAssertionHandler currentHandler] handleFailureI file:@(__FILE__) lineNumber:__LINE__ description:__VA_ARGS__]; } \ _RCTAssertFormat(pass, __FILE__, __LINE__, __func__, __VA_ARGS__); \ } while (false) +RCT_EXTERN void _RCTAssertFormat(BOOL, const char *, int, const char *, NSString *, ...) NS_FORMAT_FUNCTION(5,6); + +/** + * Convenience macro for asserting that a parameter is non-nil/non-zero. + */ +#define RCTAssertParam(name) RCTAssert(name, \ +@"'%s' is a required parameter", #name) /** * Convenience macro for asserting that we're running on main thread. */ #define RCTAssertMainThread() RCTAssert([NSThread isMainThread], \ -@"This function must be called on the main thread"); +@"This function must be called on the main thread") /** * These methods get and set the current assert function called by the RCTAssert diff --git a/React/Base/RCTAssert.m b/React/Base/RCTAssert.m index 41369406c..3e76518dd 100644 --- a/React/Base/RCTAssert.m +++ b/React/Base/RCTAssert.m @@ -13,6 +13,15 @@ NSString *const RCTErrorDomain = @"RCTErrorDomain"; RCTAssertFunction RCTCurrentAssertFunction = nil; +NSException *_RCTNotImplementedException(SEL, Class); +NSException *_RCTNotImplementedException(SEL cmd, Class cls) +{ + NSString *msg = [NSString stringWithFormat:@"%s is not implemented " + "for the class %@", sel_getName(cmd), cls]; + return [NSException exceptionWithName:@"RCTNotDesignatedInitializerException" + reason:msg userInfo:nil]; +} + void _RCTAssertFormat( BOOL condition, const char *fileName, diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 52e0ecd98..8f2f199ee 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -16,8 +16,10 @@ #import #import +#import "RCTAssert.h" #import "RCTContextExecutor.h" #import "RCTConvert.h" +#import "RCTEventDispatcher.h" #import "RCTJavaScriptLoader.h" #import "RCTKeyCommands.h" #import "RCTLog.h" @@ -185,7 +187,7 @@ static NSDictionary *RCTJSErrorFromNSError(NSError *error) @property (nonatomic, weak) RCTBridge *parentBridge; -- (instancetype)initWithParentBridge:(RCTBridge *)bridge; +- (instancetype)initWithParentBridge:(RCTBridge *)bridge NS_DESIGNATED_INITIALIZER; - (void)_actuallyInvokeAndProcessModule:(NSString *)module method:(NSString *)method @@ -233,7 +235,7 @@ static NSDictionary *RCTJSErrorFromNSError(NSError *error) } NSMutableArray *argumentNames = [NSMutableArray array]; - [typeRegex enumerateMatchesInString:objCMethodName options:0 range:NSMakeRange(0, objCMethodName.length) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { + [typeRegex enumerateMatchesInString:objCMethodName options:0 range:NSMakeRange(0, objCMethodName.length) usingBlock:^(NSTextCheckingResult *result, __unused NSMatchingFlags flags, __unused BOOL *stop) { NSString *argumentName = [objCMethodName substringWithRange:[result rangeAtIndex:1]]; [argumentNames addObject:argumentName]; }]; @@ -267,7 +269,7 @@ static NSDictionary *RCTJSErrorFromNSError(NSError *error) NSMutableArray *argumentBlocks = [[NSMutableArray alloc] initWithCapacity:numberOfArguments - 2]; #define RCT_ARG_BLOCK(_logic) \ - [argumentBlocks addObject:^(RCTBridge *bridge, NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { \ + [argumentBlocks addObject:^(__unused RCTBridge *bridge, __unused NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { \ _logic \ [invocation setArgument:&value atIndex:index]; \ }]; \ @@ -287,7 +289,7 @@ static NSDictionary *RCTJSErrorFromNSError(NSError *error) method:@"invokeCallbackAndReturnFlushedQueue" arguments:@[json, args] context:context]; - } : ^(NSArray *unused) {}); + } : ^(__unused NSArray *unused) {}); ) }; @@ -334,7 +336,7 @@ case _value: { \ RCT_CONVERT_CASE('^', void *) case '{': { - [argumentBlocks addObject:^(RCTBridge *bridge, NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { + [argumentBlocks addObject:^(__unused RCTBridge *bridge, __unused NSNumber *context, NSInvocation *invocation, NSUInteger index, id json) { NSMethodSignature *methodSignature = [RCTConvert methodSignatureForSelector:selector]; void *returnValue = malloc(methodSignature.methodReturnLength); NSInvocation *_invocation = [NSInvocation invocationWithMethodSignature:methodSignature]; @@ -485,7 +487,8 @@ static RCTSparseArray *RCTExportedMethodsByModuleID(void) dispatch_once(&onceToken, ^{ methodsByModuleID = [[RCTSparseArray alloc] initWithCapacity:[RCTModuleClassesByID count]]; - [RCTModuleClassesByID enumerateObjectsUsingBlock:^(Class moduleClass, NSUInteger moduleID, BOOL *stop) { + [RCTModuleClassesByID enumerateObjectsUsingBlock: + ^(Class moduleClass, NSUInteger moduleID, __unused BOOL *stop) { methodsByModuleID[moduleID] = [[NSMutableArray alloc] init]; @@ -549,11 +552,13 @@ static NSDictionary *RCTRemoteModulesConfig(NSDictionary *modulesByName) dispatch_once(&onceToken, ^{ remoteModuleConfigByClassName = [[NSMutableDictionary alloc] init]; - [RCTModuleClassesByID enumerateObjectsUsingBlock:^(Class moduleClass, NSUInteger moduleID, BOOL *stop) { + [RCTModuleClassesByID enumerateObjectsUsingBlock: + ^(Class moduleClass, NSUInteger moduleID, __unused BOOL *stop) { NSArray *methods = RCTExportedMethodsByModuleID()[moduleID]; NSMutableDictionary *methodsByName = [NSMutableDictionary dictionaryWithCapacity:methods.count]; - [methods enumerateObjectsUsingBlock:^(RCTModuleMethod *method, NSUInteger methodID, BOOL *_stop) { + [methods enumerateObjectsUsingBlock: + ^(RCTModuleMethod *method, NSUInteger methodID, __unused BOOL *_stop) { methodsByName[method.JSMethodName] = @{ @"methodID": @(methodID), @"type": method.functionKind == RCTJavaScriptFunctionKindAsync ? @"remoteAsync" : @"remote", @@ -571,7 +576,8 @@ static NSDictionary *RCTRemoteModulesConfig(NSDictionary *modulesByName) // Create config NSMutableDictionary *moduleConfig = [[NSMutableDictionary alloc] init]; - [modulesByName enumerateKeysAndObjectsUsingBlock:^(NSString *moduleName, id module, BOOL *stop) { + [modulesByName enumerateKeysAndObjectsUsingBlock: + ^(NSString *moduleName, id module, __unused BOOL *stop) { // Add constants NSMutableDictionary *config = remoteModuleConfigByClassName[NSStringFromClass([module class])]; @@ -688,6 +694,7 @@ static NSDictionary *RCTLocalModulesConfig() static id _latestJSExecutor; #if RCT_DEBUG + + (void)initialize { static dispatch_once_t onceToken; @@ -717,6 +724,7 @@ static id _latestJSExecutor; }); } + #endif - (instancetype)initWithBundleURL:(NSURL *)bundleURL @@ -726,6 +734,7 @@ static id _latestJSExecutor; RCTAssertMainThread(); if ((self = [super init])) { + /** * Pre register modules */ @@ -740,6 +749,8 @@ static id _latestJSExecutor; return self; } +RCT_NOT_IMPLEMENTED(-init) + - (void)dealloc { /** @@ -767,7 +778,7 @@ static id _latestJSExecutor; // reload in current mode [commands registerKeyCommandWithInput:@"r" modifierFlags:UIKeyModifierCommand - action:^(UIKeyCommand *command) { + action:^(__unused UIKeyCommand *command) { [weakSelf reload]; }]; @@ -775,6 +786,11 @@ static id _latestJSExecutor; } +- (RCTEventDispatcher *)eventDispatcher +{ + return self.modules[RCTBridgeModuleNameForClass([RCTEventDispatcher class])]; +} + - (void)reload { /** @@ -822,7 +838,7 @@ static id _latestJSExecutor; method:@"logIfNoNativeHook" arguments:@[level, message] context:RCTGetExecutorID(_latestJSExecutor) - callback:^(id json, NSError *error) {}]; + callback:^(__unused id json, __unused NSError *error) {}]; }); } @@ -843,7 +859,10 @@ static id _latestJSExecutor; [self.batchedBridge enqueueJSCall:moduleDotMethod args:args]; } -RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSString *)method arguments:(NSArray *)args context:(NSNumber *)context) +RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module + method:(__unused NSString *)method + arguments:(__unused NSArray *)args + context:(__unused NSNumber *)context) @end @@ -866,8 +885,12 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin - (instancetype)initWithParentBridge:(RCTBridge *)bridge { - if (self = [super init]) { - RCTAssertMainThread(); + RCTAssertMainThread(); + RCTAssertParam(bridge); + + if ((self = [super initWithBundleURL:bridge.bundleURL + moduleProvider:bridge.moduleProvider + launchOptions:bridge.launchOptions])) { _parentBridge = bridge; @@ -902,14 +925,11 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin return self; } -- (NSURL *)bundleURL +- (instancetype)initWithBundleURL:(__unused NSURL *)bundleURL + moduleProvider:(__unused RCTBridgeModuleProviderBlock)block + launchOptions:(__unused NSDictionary *)launchOptions { - return _parentBridge.bundleURL; -} - -- (NSDictionary *)launchOptions -{ - return _parentBridge.launchOptions; + return [self initWithParentBridge:nil]; } /** @@ -950,14 +970,15 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin // Register passed-in module instances NSMutableDictionary *preregisteredModules = [[NSMutableDictionary alloc] init]; - for (id module in _parentBridge.moduleProvider ? _parentBridge.moduleProvider() : nil) { + for (id module in self.moduleProvider ? self.moduleProvider() : nil) { preregisteredModules[RCTBridgeModuleNameForClass([module class])] = module; } // Instantiate modules _modulesByID = [[RCTSparseArray alloc] init]; NSMutableDictionary *modulesByName = [preregisteredModules mutableCopy]; - [RCTModuleClassesByID enumerateObjectsUsingBlock:^(Class moduleClass, NSUInteger moduleID, BOOL *stop) { + [RCTModuleClassesByID enumerateObjectsUsingBlock: + ^(Class moduleClass, NSUInteger moduleID, __unused BOOL *stop) { NSString *moduleName = RCTModuleNamesByID[moduleID]; // Check if module instance has already been registered for this name id module = modulesByName[moduleName]; @@ -1007,7 +1028,8 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin } // Get method queues - [_modulesByID enumerateObjectsUsingBlock:^(id module, NSNumber *moduleID, BOOL *stop) { + [_modulesByID enumerateObjectsUsingBlock: + ^(id module, NSNumber *moduleID, __unused BOOL *stop) { if ([module respondsToSelector:@selector(methodQueue)]) { dispatch_queue_t queue = [module methodQueue]; if (queue) { @@ -1034,9 +1056,10 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin }, NULL); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [_javaScriptExecutor injectJSONText:configJSON - asGlobalObjectNamed:@"__fbBatchedBridgeConfig" callback:^(id err) { - dispatch_semaphore_signal(semaphore); - }]; + asGlobalObjectNamed:@"__fbBatchedBridgeConfig" callback: + ^(__unused id err) { + dispatch_semaphore_signal(semaphore); + }]; dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW); @@ -1350,7 +1373,7 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin [[NSNotificationCenter defaultCenter] postNotificationName:RCTEnqueueNotification object:nil userInfo:nil]; - RCTJavaScriptCallback processResponse = ^(id json, NSError *error) { + RCTJavaScriptCallback processResponse = ^(id json, __unused NSError *error) { if (!self.isValid) { return; } @@ -1453,7 +1476,8 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin } // TODO: batchDidComplete is only used by RCTUIManager - can we eliminate this special case? - [_modulesByID enumerateObjectsUsingBlock:^(id module, NSNumber *moduleID, BOOL *stop) { + [_modulesByID enumerateObjectsUsingBlock: + ^(id module, NSNumber *moduleID, __unused BOOL *stop) { if ([module respondsToSelector:@selector(batchDidComplete)]) { [self dispatchBlock:^{ [module batchDidComplete]; @@ -1537,7 +1561,9 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin NSArray *calls = [_scheduledCallbacks.allObjects arrayByAddingObjectsFromArray:_scheduledCalls]; NSNumber *currentExecutorID = RCTGetExecutorID(_javaScriptExecutor); - calls = [calls filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSDictionary *call, NSDictionary *bindings) { + calls = [calls filteredArrayUsingPredicate: + [NSPredicate predicateWithBlock: + ^BOOL(NSDictionary *call, __unused NSDictionary *bindings) { return [call[@"context"] isEqualToNumber:currentExecutorID]; }]]; @@ -1600,13 +1626,16 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(NSString *)module method:(NSStrin NSMutableURLRequest *URLRequest = [NSMutableURLRequest requestWithURL:URL]; URLRequest.HTTPMethod = @"POST"; [URLRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; - NSURLSessionTask *task = [[NSURLSession sharedSession] uploadTaskWithRequest:URLRequest - fromData:[log dataUsingEncoding:NSUTF8StringEncoding] - completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { - if (error) { - RCTLogError(@"%@", error.localizedDescription); - } - }]; + NSURLSessionTask *task = + [[NSURLSession sharedSession] uploadTaskWithRequest:URLRequest + fromData:[log dataUsingEncoding:NSUTF8StringEncoding] + completionHandler: + ^(__unused NSData *data, __unused NSURLResponse *response, NSError *error) { + if (error) { + RCTLogError(@"%@", error.localizedDescription); + } + }]; + [task resume]; }]; } diff --git a/React/Base/RCTCache.m b/React/Base/RCTCache.m index 6297771d2..9390069c4 100644 --- a/React/Base/RCTCache.m +++ b/React/Base/RCTCache.m @@ -12,6 +12,8 @@ #import #import +#import "RCTAssert.h" + static NSString *const RCTCacheSubdirectoryName = @"React"; static NSString *const RCTKeyExtendedAttributeName = @"com.facebook.React.RCTCacheManager.Key"; static NSMapTable *RCTLivingCachesByName; @@ -122,7 +124,8 @@ static BOOL RCTSetExtendedAttribute(NSURL *fileURL, NSString *key, NSString *val - (instancetype)initWithName:(NSString *)name { - NSParameterAssert(name.length < NAME_MAX); + RCTAssertParam(name); + RCTAssert(name.length < NAME_MAX, @"Name must be fewer than %i characters in length.", NAME_MAX); RCTCache *cachedCache = [RCTLivingCachesByName objectForKey:name]; if (cachedCache) { self = cachedCache; @@ -212,12 +215,12 @@ static BOOL RCTSetExtendedAttribute(NSURL *fileURL, NSString *key, NSString *val UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]; dispatch_group_t group = dispatch_group_create(); - [_storage enumerateKeysAndObjectsUsingBlock:^(NSString *key, RCTCacheRecord *record, BOOL *stop) { + for (RCTCacheRecord *record in _storage.allValues) { NSURL *fileURL = [_cacheDirectoryURL URLByAppendingPathComponent:record.UUID.UUIDString]; dispatch_group_async(group, record.queue, ^{ [_fileManager removeItemAtURL:fileURL error:NULL]; }); - }]; + } if (identifier != UIBackgroundTaskInvalid) { dispatch_group_notify(group, dispatch_get_main_queue(), ^{ diff --git a/React/Base/RCTConvert.m b/React/Base/RCTConvert.m index e244d988b..804faf87e 100644 --- a/React/Base/RCTConvert.m +++ b/React/Base/RCTConvert.m @@ -536,32 +536,32 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[ } // Parse color - NSUInteger red = -1; - NSUInteger green = -1; - NSUInteger blue = -1; + uint32_t red = 0, green = 0, blue = 0; CGFloat alpha = 1.0; if ([colorString hasPrefix:@"#"]) { if (colorString.length == 4) { // 3 digit hex - sscanf([colorString UTF8String], "#%01tX%01tX%01tX", &red, &green, &blue); + sscanf([colorString UTF8String], "#%01x%01x%01x", &red, &green, &blue); // expand to 6 digit hex red = red | (red << 4); green = green | (green << 4); blue = blue | (blue << 4); - } else if (colorString.length == 7) { // normal 6 digit hex - sscanf([colorString UTF8String], "#%02tX%02tX%02tX", &red, &green, &blue); + } else if (colorString.length == 7) { // 6 digit hex + sscanf(colorString.UTF8String, "#%02x%02x%02x", &red, &green, &blue); } else { - RCTLogError(@"Invalid hex color %@. Hex colors should be 3 or 6 digits long", colorString); + RCTLogError(@"Invalid hex color %@. Hex colors should be 3 or 6 digits long.", colorString); + alpha = -1; } } else if ([colorString hasPrefix:@"rgba("]) { double tmpAlpha; - sscanf([colorString UTF8String], "rgba(%zd,%zd,%zd,%lf)", &red, &green, &blue, &tmpAlpha); - alpha = tmpAlpha > 0.99 ? 1.0 : tmpAlpha; + sscanf(colorString.UTF8String, "rgba(%u,%u,%u,%lf)", &red, &green, &blue, &tmpAlpha); + alpha = tmpAlpha; } else if ([colorString hasPrefix:@"rgb("]) { - sscanf([colorString UTF8String], "rgb(%zd,%zd,%zd)", &red, &green, &blue); + sscanf(colorString.UTF8String, "rgb(%u,%u,%u)", &red, &green, &blue); } else { - RCTLogError(@"Unrecognized color format '%@', must be one of #hex|rgba|rgb", colorString); + RCTLogError(@"Unrecognized color format '%@', must be one of #hex|rgba|rgb or a valid CSS color name.", colorString); + alpha = -1; } - if (red == -1 || green == -1 || blue == -1 || alpha > 1.0 || alpha < 0.0) { + if (alpha < 0) { RCTLogError(@"Invalid color string '%@'", colorString); } else { color = [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:alpha]; @@ -574,19 +574,19 @@ RCT_CGSTRUCT_CONVERTER(CGAffineTransform, (@[ } else { // Color array - color = [UIColor colorWithRed:[self double:json[0]] - green:[self double:json[1]] - blue:[self double:json[2]] - alpha:[json count] > 3 ? [self double:json[3]] : 1]; + color = [UIColor colorWithRed:[self CGFloat:json[0]] + green:[self CGFloat:json[1]] + blue:[self CGFloat:json[2]] + alpha:[json count] > 3 ? [self CGFloat:json[3]] : 1]; } } else if ([json isKindOfClass:[NSDictionary class]]) { // Color dictionary - color = [UIColor colorWithRed:[self double:json[@"r"]] - green:[self double:json[@"g"]] - blue:[self double:json[@"b"]] - alpha:[self double:json[@"a"] ?: @1]]; + color = [UIColor colorWithRed:[self CGFloat:json[@"r"]] + green:[self CGFloat:json[@"g"]] + blue:[self CGFloat:json[@"b"]] + alpha:[self CGFloat:json[@"a"] ?: @1]]; } else if (RCT_DEBUG && json && json != (id)kCFNull) { @@ -830,7 +830,7 @@ NSArray *RCTConvertArrayValue(SEL type, id json) { __block BOOL copy = NO; __block NSArray *values = json = [RCTConvert NSArray:json]; - [json enumerateObjectsUsingBlock:^(id jsonValue, NSUInteger idx, BOOL *stop) { + [json enumerateObjectsUsingBlock:^(id jsonValue, NSUInteger idx, __unused BOOL *stop) { id value = ((id(*)(Class, SEL, id))objc_msgSend)([RCTConvert class], type, jsonValue); if (copy) { if (value) { @@ -839,7 +839,7 @@ NSArray *RCTConvertArrayValue(SEL type, id json) } else if (value != jsonValue) { // Converted value is different, so we'll need to copy the array values = [[NSMutableArray alloc] initWithCapacity:values.count]; - for (NSInteger i = 0; i < idx; i++) { + for (NSUInteger i = 0; i < idx; i++) { [(NSMutableArray *)values addObject:json[i]]; } if (value) { @@ -876,7 +876,7 @@ static id RCTConvertPropertyListValue(id json) if ([json isKindOfClass:[NSDictionary class]]) { __block BOOL copy = NO; NSMutableDictionary *values = [[NSMutableDictionary alloc] initWithCapacity:[json count]]; - [json enumerateKeysAndObjectsUsingBlock:^(NSString *key, id jsonValue, BOOL *stop) { + [json enumerateKeysAndObjectsUsingBlock:^(NSString *key, id jsonValue, __unused BOOL *stop) { id value = RCTConvertPropertyListValue(jsonValue); if (value) { values[key] = value; @@ -889,7 +889,7 @@ static id RCTConvertPropertyListValue(id json) if ([json isKindOfClass:[NSArray class]]) { __block BOOL copy = NO; __block NSArray *values = json; - [json enumerateObjectsUsingBlock:^(id jsonValue, NSUInteger idx, BOOL *stop) { + [json enumerateObjectsUsingBlock:^(id jsonValue, NSUInteger idx, __unused BOOL *stop) { id value = RCTConvertPropertyListValue(jsonValue); if (copy) { if (value) { @@ -898,7 +898,7 @@ static id RCTConvertPropertyListValue(id json) } else if (value != jsonValue) { // Converted value is different, so we'll need to copy the array values = [[NSMutableArray alloc] initWithCapacity:values.count]; - for (NSInteger i = 0; i < idx; i++) { + for (NSUInteger i = 0; i < idx; i++) { [(NSMutableArray *)values addObject:json[i]]; } if (value) { diff --git a/React/Base/RCTDefines.h b/React/Base/RCTDefines.h index 7c6d88409..2e4fb3f61 100644 --- a/React/Base/RCTDefines.h +++ b/React/Base/RCTDefines.h @@ -61,9 +61,19 @@ #endif /** - * Concat two literals. Supports macro expansions - * - * i.e. RCT_CONCAT(foo, __FILE__) + * Concat two literals. Supports macro expansions, + * e.g. RCT_CONCAT(foo, __FILE__). */ #define RCT_CONCAT2(A, B) A ## B #define RCT_CONCAT(A, B) RCT_CONCAT2(A, B) + +/** + * Throw an assertion for unimplemented methods. + */ +#define RCT_NOT_IMPLEMENTED(method) \ +_Pragma("clang diagnostic push") \ +_Pragma("clang diagnostic ignored \"-Wmissing-method-return-type\"") \ +_Pragma("clang diagnostic ignored \"-Wunused-parameter\"") \ +RCT_EXTERN NSException *_RCTNotImplementedException(SEL, Class); \ +method NS_UNAVAILABLE { @throw _RCTNotImplementedException(_cmd, [self class]); } \ +_Pragma("clang diagnostic pop") diff --git a/React/Base/RCTDevMenu.m b/React/Base/RCTDevMenu.m index 8a5f23f9d..bce19e8a9 100644 --- a/React/Base/RCTDevMenu.m +++ b/React/Base/RCTDevMenu.m @@ -9,6 +9,7 @@ #import "RCTDevMenu.h" +#import "RCTAssert.h" #import "RCTBridge.h" #import "RCTDefines.h" #import "RCTEventDispatcher.h" @@ -34,7 +35,7 @@ static NSString *const RCTDevMenuSettingsKey = @"RCTDevMenu"; @implementation UIWindow (RCTDevMenu) -- (void)RCT_motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event +- (void)RCT_motionEnded:(__unused UIEventSubtype)motion withEvent:(UIEvent *)event { if (event.subtype == UIEventSubtypeMotionShake) { [[NSNotificationCenter defaultCenter] postNotificationName:RCTShowDevMenuNotification object:nil]; @@ -48,7 +49,7 @@ static NSString *const RCTDevMenuSettingsKey = @"RCTDevMenu"; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) dispatch_block_t handler; -- (instancetype)initWithTitle:(NSString *)title handler:(dispatch_block_t)handler; +- (instancetype)initWithTitle:(NSString *)title handler:(dispatch_block_t)handler NS_DESIGNATED_INITIALIZER; @end @@ -56,13 +57,15 @@ static NSString *const RCTDevMenuSettingsKey = @"RCTDevMenu"; - (instancetype)initWithTitle:(NSString *)title handler:(dispatch_block_t)handler { - if (self = [super init]) { - self.title = title; - self.handler = handler; + if ((self = [super init])) { + _title = [title copy]; + _handler = [handler copy]; } return self; } +RCT_NOT_IMPLEMENTED(-init) + @end @interface RCTDevMenu () @@ -131,21 +134,23 @@ RCT_EXPORT_MODULE() // Toggle debug menu [commands registerKeyCommandWithInput:@"d" modifierFlags:UIKeyModifierCommand - action:^(UIKeyCommand *command) { + action:^(__unused UIKeyCommand *command) { [weakSelf toggle]; }]; // Toggle element inspector [commands registerKeyCommandWithInput:@"i" modifierFlags:UIKeyModifierCommand - action:^(UIKeyCommand *command) { - [_bridge.eventDispatcher sendDeviceEventWithName:@"toggleElementInspector" body:nil]; + action:^(__unused UIKeyCommand *command) { + [_bridge.eventDispatcher + sendDeviceEventWithName:@"toggleElementInspector" + body:nil]; }]; // Reload in normal mode [commands registerKeyCommandWithInput:@"n" modifierFlags:UIKeyModifierCommand - action:^(UIKeyCommand *command) { + action:^(__unused UIKeyCommand *command) { weakSelf.executorClass = Nil; }]; #endif @@ -454,7 +459,8 @@ RCT_EXPORT_METHOD(reload) } __weak RCTDevMenu *weakSelf = self; - _updateTask = [[NSURLSession sharedSession] dataTaskWithURL:_liveReloadURL completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { + _updateTask = [[NSURLSession sharedSession] dataTaskWithURL:_liveReloadURL completionHandler: + ^(__unused NSData *data, NSURLResponse *response, NSError *error) { dispatch_async(dispatch_get_main_queue(), ^{ __strong RCTDevMenu *strongSelf = weakSelf; diff --git a/React/Base/RCTEventDispatcher.m b/React/Base/RCTEventDispatcher.m index b5b2857f0..8a553c7a2 100644 --- a/React/Base/RCTEventDispatcher.m +++ b/React/Base/RCTEventDispatcher.m @@ -31,6 +31,8 @@ static NSNumber *RCTGetEventID(id event) eventName:(NSString *)eventName body:(NSDictionary *)body { + RCTAssertParam(eventName); + if ((self = [super init])) { _viewTag = viewTag; _eventName = eventName; @@ -39,6 +41,8 @@ static NSNumber *RCTGetEventID(id event) return self; } +RCT_NOT_IMPLEMENTED(-init) + - (uint16_t)coalescingKey { return 0; @@ -175,12 +179,10 @@ RCT_IMPORT_METHOD(RCTEventEmitter, receiveEvent); return RCTJSThread; } -- (void)didUpdateFrame:(RCTFrameUpdate *)update +- (void)didUpdateFrame:(__unused RCTFrameUpdate *)update { - NSDictionary *eventQueue; - [_eventQueueLock lock]; - eventQueue = _eventQueue; + NSDictionary *eventQueue = _eventQueue; _eventQueue = [[NSMutableDictionary alloc] init]; _paused = YES; [_eventQueueLock unlock]; @@ -191,12 +193,3 @@ RCT_IMPORT_METHOD(RCTEventEmitter, receiveEvent); } @end - -@implementation RCTBridge (RCTEventDispatcher) - -- (RCTEventDispatcher *)eventDispatcher -{ - return self.modules[RCTBridgeModuleNameForClass([RCTEventDispatcher class])]; -} - -@end diff --git a/React/Base/RCTFPSGraph.m b/React/Base/RCTFPSGraph.m index 461f17e41..5e9b0d855 100644 --- a/React/Base/RCTFPSGraph.m +++ b/React/Base/RCTFPSGraph.m @@ -9,6 +9,7 @@ #import "RCTFPSGraph.h" +#import "RCTAssert.h" #import "RCTDefines.h" #if RCT_DEV @@ -32,7 +33,7 @@ - (instancetype)initWithFrame:(CGRect)frame graphPosition:(RCTFPSGraphPosition)position name:(NSString *)name color:(UIColor *)color { - if (self = [super initWithFrame:frame]) { + if ((self = [super initWithFrame:frame])) { _margin = 2; _prevTime = -1; _maxFPS = 0; @@ -42,8 +43,10 @@ _frames = malloc(sizeof(float) * _length); memset(_frames, 0, sizeof(float) * _length); - _name = name; - _position = position; + _name = name ?: @"FPS"; + _position = position ?: RCTFPSGraphPositionLeft; + + color = color ?: [UIColor greenColor]; _graph = [self createGraph:color]; _label = [self createLabel:color]; @@ -53,6 +56,9 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)dealloc { free(_frames); diff --git a/React/Base/RCTJavaScriptExecutor.h b/React/Base/RCTJavaScriptExecutor.h index 7a3aa2870..146247009 100644 --- a/React/Base/RCTJavaScriptExecutor.h +++ b/React/Base/RCTJavaScriptExecutor.h @@ -43,7 +43,7 @@ typedef void (^RCTJavaScriptCallback)(id json, NSError *error); * Runs an application script, and notifies of the script load being complete via `onComplete`. */ - (void)executeApplicationScript:(NSString *)script - sourceURL:(NSURL *)url + sourceURL:(NSURL *)sourceURL onComplete:(RCTJavaScriptCompleteBlock)onComplete; - (void)injectJSONText:(NSString *)script diff --git a/React/Base/RCTJavaScriptLoader.m b/React/Base/RCTJavaScriptLoader.m index 0210986dc..44d9e81c1 100755 --- a/React/Base/RCTJavaScriptLoader.m +++ b/React/Base/RCTJavaScriptLoader.m @@ -21,12 +21,16 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge { + RCTAssert(bridge, @"birdge parameter is required"); + if ((self = [super init])) { _bridge = bridge; } return self; } +RCT_NOT_IMPLEMENTED(-init) + - (void)loadBundleAtURL:(NSURL *)scriptURL onComplete:(void (^)(NSError *, NSString *))onComplete { // Sanitize the script URL diff --git a/React/Base/RCTKeyCommands.m b/React/Base/RCTKeyCommands.m index 823acb241..52d8c30dd 100644 --- a/React/Base/RCTKeyCommands.m +++ b/React/Base/RCTKeyCommands.m @@ -77,7 +77,7 @@ static RCTKeyCommands *RKKeyCommandsSharedInstance = nil; // To fix this, we use a linear search, since there won't be many keys anyway [_commandBindings enumerateKeysAndObjectsUsingBlock: - ^(UIKeyCommand *k, void (^block)(UIKeyCommand *), BOOL *stop) { + ^(UIKeyCommand *k, void (^block)(UIKeyCommand *), __unused BOOL *stop) { if ([key.input isEqualToString:k.input] && key.modifierFlags == k.modifierFlags) { block(key); } @@ -105,7 +105,7 @@ static RCTKeyCommands *RKKeyCommandsSharedInstance = nil; modifierFlags:flags action:@selector(RCT_handleKeyCommand:)]; - _commandBindings[command] = block ?: ^(UIKeyCommand *cmd) {}; + _commandBindings[command] = block ?: ^(__unused UIKeyCommand *cmd) {}; } - (void)unregisterKeyCommandWithInput:(NSString *)input diff --git a/React/Base/RCTLog.h b/React/Base/RCTLog.h index 5dead10be..11b957fd3 100644 --- a/React/Base/RCTLog.h +++ b/React/Base/RCTLog.h @@ -90,13 +90,12 @@ RCT_EXTERN void RCTAddLogFunction(RCTLogFunction logFunction); RCT_EXTERN void RCTPerformBlockWithLogPrefix(void (^block)(void), NSString *prefix); /** - * Private logging functions - ignore these. + * Private logging function - ignore this. */ -RCT_EXTERN void _RCTLogFormat(RCTLogLevel, const char *, int, NSString *, ...) NS_FORMAT_FUNCTION(4,5); #define _RCTLog(lvl, ...) do { \ - if (lvl >= RCTLOG_FATAL_LEVEL) { RCTAssert(NO, __VA_ARGS__); } \ - _RCTLogFormat(lvl, __FILE__, __LINE__, __VA_ARGS__); \ -} while (0) +if (lvl >= RCTLOG_FATAL_LEVEL) { RCTAssert(NO, __VA_ARGS__); } \ +_RCTLogFormat(lvl, __FILE__, __LINE__, __VA_ARGS__); } while (0) +RCT_EXTERN void _RCTLogFormat(RCTLogLevel, const char *, int, NSString *, ...) NS_FORMAT_FUNCTION(4,5); /** * Logging macros. Use these to log information, warnings and errors in your diff --git a/React/Base/RCTLog.m b/React/Base/RCTLog.m index 92c255659..e34502f3b 100644 --- a/React/Base/RCTLog.m +++ b/React/Base/RCTLog.m @@ -169,28 +169,28 @@ void _RCTLogFormat( #if RCT_DEBUG // Red box is only available in debug mode - // Log to red box - if (level >= RCTLOG_REDBOX_LEVEL) { - NSArray *stackSymbols = [NSThread callStackSymbols]; - NSMutableArray *stack = [NSMutableArray arrayWithCapacity:(stackSymbols.count - 1)]; - [stackSymbols enumerateObjectsUsingBlock:^(NSString *frameSymbols, NSUInteger idx, BOOL *stop) { - if (idx != 0) { // don't include the current frame - NSString *address = [[frameSymbols componentsSeparatedByString:@"0x"][1] componentsSeparatedByString:@" "][0]; - NSRange addressRange = [frameSymbols rangeOfString:address]; - NSString *methodName = [frameSymbols substringFromIndex:(addressRange.location + addressRange.length + 1)]; - if (idx == 1) { - NSString *file = [[@(fileName) componentsSeparatedByString:@"/"] lastObject]; - stack[0] = @{@"methodName": methodName, @"file": file, @"lineNumber": @(lineNumber)}; - } else { - stack[idx - 1] = @{@"methodName": methodName}; - } + // Log to red box + if (level >= RCTLOG_REDBOX_LEVEL) { + NSArray *stackSymbols = [NSThread callStackSymbols]; + NSMutableArray *stack = [NSMutableArray arrayWithCapacity:(stackSymbols.count - 1)]; + [stackSymbols enumerateObjectsUsingBlock:^(NSString *frameSymbols, NSUInteger idx, __unused BOOL *stop) { + if (idx > 0) { // don't include the current frame + NSString *address = [[frameSymbols componentsSeparatedByString:@"0x"][1] componentsSeparatedByString:@" "][0]; + NSRange addressRange = [frameSymbols rangeOfString:address]; + NSString *methodName = [frameSymbols substringFromIndex:(addressRange.location + addressRange.length + 1)]; + if (idx == 1) { + NSString *file = [[@(fileName) componentsSeparatedByString:@"/"] lastObject]; + [stack addObject:@{@"methodName": methodName, @"file": file, @"lineNumber": @(lineNumber)}]; + } else { + [stack addObject:@{@"methodName": methodName}]; } - }]; - [[RCTRedBox sharedInstance] showErrorMessage:message withStack:stack]; - } + } + }]; + [[RCTRedBox sharedInstance] showErrorMessage:message withStack:stack]; + } - // Log to JS executor - [RCTBridge logMessage:message level:level ? @(RCTLogLevels[level - 1]) : @"info"]; + // Log to JS executor + [RCTBridge logMessage:message level:level ? @(RCTLogLevels[level - 1]) : @"info"]; #endif diff --git a/React/Base/RCTProfile.m b/React/Base/RCTProfile.m index 1269d7594..f03dc9571 100644 --- a/React/Base/RCTProfile.m +++ b/React/Base/RCTProfile.m @@ -118,7 +118,7 @@ static SEL RCTProfileProxySelector(SEL selector) } static void RCTProfileForwardInvocation(NSObject *, SEL, NSInvocation *); -static void RCTProfileForwardInvocation(NSObject *self, SEL cmd, NSInvocation *invocation) +static void RCTProfileForwardInvocation(NSObject *self, __unused SEL cmd, NSInvocation *invocation) { NSString *name = [NSString stringWithFormat:@"-[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(invocation.selector)]; SEL newSel = RCTProfileProxySelector(invocation.selector); @@ -150,7 +150,7 @@ static IMP RCTProfileMsgForward(NSObject *self, SEL selector) static void RCTProfileHookModules(RCTBridge *); static void RCTProfileHookModules(RCTBridge *bridge) { - [bridge.modules enumerateKeysAndObjectsUsingBlock:^(NSString *className, id module, BOOL *stop) { + for (id module in bridge.modules.allValues) { [bridge dispatchBlock:^{ Class moduleClass = object_getClass(module); Class proxyClass = objc_allocateClassPair(moduleClass, RCTProfileProxyClassName(moduleClass), 0); @@ -183,13 +183,13 @@ static void RCTProfileHookModules(RCTBridge *bridge) objc_registerClassPair(proxyClass); object_setClass(module, proxyClass); } forModule:module]; - }]; + } } void RCTProfileUnhookModules(RCTBridge *); void RCTProfileUnhookModules(RCTBridge *bridge) { - [bridge.modules enumerateKeysAndObjectsUsingBlock:^(NSString *className, id module, BOOL *stop) { + for (id module in bridge.modules.allValues) { [bridge dispatchBlock:^{ Class proxyClass = object_getClass(module); if (module.class != proxyClass) { @@ -197,7 +197,7 @@ void RCTProfileUnhookModules(RCTBridge *bridge) objc_disposeClassPair(proxyClass); } } forModule:module]; - }]; + }; } diff --git a/React/Base/RCTRedBox.m b/React/Base/RCTRedBox.m index b293a162d..8e85c0ca2 100644 --- a/React/Base/RCTRedBox.m +++ b/React/Base/RCTRedBox.m @@ -90,6 +90,8 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; @@ -145,12 +147,12 @@ #pragma mark - TableView -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView +- (NSInteger)numberOfSectionsInTableView:(__unused UITableView *)tableView { return 2; } -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +- (NSInteger)tableView:(__unused UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return section == 0 ? 1 : [_lastStackTrace count]; } diff --git a/React/Base/RCTRootView.m b/React/Base/RCTRootView.m index b12cda4f2..16bee5475 100644 --- a/React/Base/RCTRootView.m +++ b/React/Base/RCTRootView.m @@ -62,7 +62,7 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat RCTAssert(bridge, @"A bridge instance is required to create an RCTRootView"); RCTAssert(moduleName, @"A moduleName is required to create an RCTRootView"); - if ((self = [super init])) { + if ((self = [super initWithFrame:CGRectZero])) { self.backgroundColor = [UIColor whiteColor]; @@ -100,6 +100,9 @@ NSString *const RCTContentDidAppearNotification = @"RCTContentDidAppearNotificat return [self initWithBridge:bridge moduleName:moduleName]; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)setBackgroundColor:(UIColor *)backgroundColor { super.backgroundColor = backgroundColor; @@ -147,7 +150,7 @@ RCT_IMPORT_METHOD(ReactNative, unmountComponentAtNodeAndRemoveContainer) options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ _loadingView.hidden = YES; - } completion:^(BOOL finished) { + } completion:^(__unused BOOL finished) { [_loadingView removeFromSuperview]; }]; }); diff --git a/React/Base/RCTTouchHandler.m b/React/Base/RCTTouchHandler.m index 5c66aa49e..759f1078d 100644 --- a/React/Base/RCTTouchHandler.m +++ b/React/Base/RCTTouchHandler.m @@ -40,12 +40,11 @@ - (instancetype)initWithBridge:(RCTBridge *)bridge { + RCTAssertParam(bridge); + if ((self = [super initWithTarget:nil action:NULL])) { - RCTAssert(bridge != nil, @"Expect an event dispatcher"); - _bridge = bridge; - _nativeTouches = [[NSMutableOrderedSet alloc] init]; _reactTouches = [[NSMutableArray alloc] init]; _touchViews = [[NSMutableArray alloc] init]; @@ -58,6 +57,8 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithTarget:(id)target action:(SEL)action) + typedef NS_ENUM(NSInteger, RCTTouchEventType) { RCTTouchEventTypeStart, RCTTouchEventTypeMove, @@ -163,7 +164,7 @@ RCT_IMPORT_METHOD(RCTEventEmitter, receiveTouches); */ - (void)_updateAndDispatchTouches:(NSSet *)touches eventName:(NSString *)eventName - originatingTime:(CFTimeInterval)originatingTime + originatingTime:(__unused CFTimeInterval)originatingTime { // Update touches NSMutableArray *changedIndexes = [[NSMutableArray alloc] init]; @@ -269,12 +270,12 @@ static BOOL RCTAnyTouchesChanged(NSSet *touches) } } -- (BOOL)canPreventGestureRecognizer:(UIGestureRecognizer *)preventedGestureRecognizer +- (BOOL)canPreventGestureRecognizer:(__unused UIGestureRecognizer *)preventedGestureRecognizer { return NO; } -- (BOOL)canBePreventedByGestureRecognizer:(UIGestureRecognizer *)preventingGestureRecognizer +- (BOOL)canBePreventedByGestureRecognizer:(__unused UIGestureRecognizer *)preventingGestureRecognizer { return NO; } diff --git a/React/Base/RCTUtils.h b/React/Base/RCTUtils.h index 5150b5c97..48eb903ae 100644 --- a/React/Base/RCTUtils.h +++ b/React/Base/RCTUtils.h @@ -36,9 +36,6 @@ RCT_EXTERN CGFloat RCTRoundPixelValue(CGFloat value); RCT_EXTERN CGFloat RCTCeilPixelValue(CGFloat value); RCT_EXTERN CGFloat RCTFloorPixelValue(CGFloat value); -// Get current time, for precise performance metrics -RCT_EXTERN NSTimeInterval RCTTGetAbsoluteTime(void); - // Method swizzling RCT_EXTERN void RCTSwapClassMethods(Class cls, SEL original, SEL replacement); RCT_EXTERN void RCTSwapInstanceMethods(Class cls, SEL original, SEL replacement); diff --git a/React/Base/RCTUtils.m b/React/Base/RCTUtils.m index a9522ad8c..15b5f8f7a 100644 --- a/React/Base/RCTUtils.m +++ b/React/Base/RCTUtils.m @@ -70,7 +70,7 @@ id RCTJSONClean(id object) if ([object isKindOfClass:[NSDictionary class]]) { __block BOOL copy = NO; NSMutableDictionary *values = [[NSMutableDictionary alloc] initWithCapacity:[object count]]; - [object enumerateKeysAndObjectsUsingBlock:^(NSString *key, id item, BOOL *stop) { + [object enumerateKeysAndObjectsUsingBlock:^(NSString *key, id item, __unused BOOL *stop) { id value = RCTJSONClean(item); values[key] = value; copy |= value != item; @@ -81,14 +81,14 @@ id RCTJSONClean(id object) if ([object isKindOfClass:[NSArray class]]) { __block BOOL copy = NO; __block NSArray *values = object; - [object enumerateObjectsUsingBlock:^(id item, NSUInteger idx, BOOL *stop) { + [object enumerateObjectsUsingBlock:^(id item, NSUInteger idx, __unused BOOL *stop) { id value = RCTJSONClean(item); if (copy) { [(NSMutableArray *)values addObject:value]; } else if (value != item) { // Converted value is different, so we'll need to copy the array values = [[NSMutableArray alloc] initWithCapacity:values.count]; - for (NSInteger i = 0; i < idx; i++) { + for (NSUInteger i = 0; i < idx; i++) { [(NSMutableArray *)values addObject:object[i]]; } [(NSMutableArray *)values addObject:value]; @@ -167,19 +167,6 @@ CGFloat RCTFloorPixelValue(CGFloat value) return floor(value * scale) / scale; } -NSTimeInterval RCTTGetAbsoluteTime(void) -{ - static struct mach_timebase_info tb_info = {0}; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - int ret = mach_timebase_info(&tb_info); - assert(0 == ret); - }); - - uint64_t timeInNanoseconds = (mach_absolute_time() * tb_info.numer) / tb_info.denom; - return ((NSTimeInterval)timeInNanoseconds) / 1000000; -} - void RCTSwapClassMethods(Class cls, SEL original, SEL replacement) { Method originalMethod = class_getClassMethod(cls, original); diff --git a/React/Executors/RCTContextExecutor.m b/React/Executors/RCTContextExecutor.m index 2bd6b7ae5..cf178e553 100644 --- a/React/Executors/RCTContextExecutor.m +++ b/React/Executors/RCTContextExecutor.m @@ -80,7 +80,7 @@ RCT_EXPORT_MODULE() * crashes. */ -static JSValueRef RCTNativeLoggingHook(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) +static JSValueRef RCTNativeLoggingHook(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) { if (argumentCount > 0) { JSStringRef messageRef = JSValueToStringCopy(context, arguments[0], exception); @@ -109,7 +109,7 @@ static JSValueRef RCTNativeLoggingHook(JSContextRef context, JSObjectRef object, } // Do-very-little native hook for testing. -static JSValueRef RCTNoop(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) +static JSValueRef RCTNoop(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, __unused size_t argumentCount, __unused const JSValueRef arguments[], __unused JSValueRef *exception) { static int counter = 0; counter++; @@ -120,7 +120,7 @@ static JSValueRef RCTNoop(JSContextRef context, JSObjectRef object, JSObjectRef static NSMutableArray *profiles; -static JSValueRef RCTConsoleProfile(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) +static JSValueRef RCTConsoleProfile(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], __unused JSValueRef *exception) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ @@ -147,7 +147,7 @@ static JSValueRef RCTConsoleProfile(JSContextRef context, JSObjectRef object, JS return JSValueMakeUndefined(context); } -static JSValueRef RCTConsoleProfileEnd(JSContextRef context, JSObjectRef object, JSObjectRef thisObject, size_t argumentCount, const JSValueRef arguments[], JSValueRef *exception) +static JSValueRef RCTConsoleProfileEnd(JSContextRef context, __unused JSObjectRef object, __unused JSObjectRef thisObject, __unused size_t argumentCount, __unused const JSValueRef arguments[], __unused JSValueRef *exception) { NSString *profileInfo = [profiles lastObject]; [profiles removeLastObject]; @@ -311,7 +311,10 @@ static NSError *RCTNSErrorFromJSError(JSContextRef context, JSValueRef jsError) [[NSNotificationCenter defaultCenter] removeObserver:self]; #endif - [_context performSelector:@selector(invalidate) onThread:_javaScriptThread withObject:nil waitUntilDone:NO]; + [_context performSelector:@selector(invalidate) + onThread:_javaScriptThread + withObject:nil + waitUntilDone:NO]; } - (void)dealloc diff --git a/React/Executors/RCTWebViewExecutor.m b/React/Executors/RCTWebViewExecutor.m index 57c8d25db..0d8f0ad0f 100644 --- a/React/Executors/RCTWebViewExecutor.m +++ b/React/Executors/RCTWebViewExecutor.m @@ -153,7 +153,8 @@ RCT_EXPORT_MODULE() if (_objectsToInject.count > 0) { NSMutableString *scriptWithInjections = [[NSMutableString alloc] initWithString:@"/* BEGIN NATIVELY INJECTED OBJECTS */\n"]; - [_objectsToInject enumerateKeysAndObjectsUsingBlock:^(NSString *objectName, NSString *blockScript, BOOL *stop) { + [_objectsToInject enumerateKeysAndObjectsUsingBlock: + ^(NSString *objectName, NSString *blockScript, __unused BOOL *stop) { [scriptWithInjections appendString:objectName]; [scriptWithInjections appendString:@" = ("]; [scriptWithInjections appendString:blockScript]; @@ -200,7 +201,7 @@ RCT_EXPORT_MODULE() /** * `UIWebViewDelegate` methods. Handle application script load. */ -- (void)webViewDidFinishLoad:(UIWebView *)webView +- (void)webViewDidFinishLoad:(__unused UIWebView *)webView { RCTAssertMainThread(); if (_onApplicationScriptLoaded) { diff --git a/React/Modules/RCTAlertManager.m b/React/Modules/RCTAlertManager.m index 3bdb035fc..f93ef812a 100644 --- a/React/Modules/RCTAlertManager.m +++ b/React/Modules/RCTAlertManager.m @@ -101,7 +101,7 @@ RCT_EXPORT_METHOD(alertWithArgs:(NSDictionary *)args } [_alerts addObject:alertView]; - [_alertCallbacks addObject:callback ?: ^(id unused) {}]; + [_alertCallbacks addObject:callback ?: ^(__unused id unused) {}]; [_alertButtonKeys addObject:buttonKeys]; [alertView show]; diff --git a/React/Modules/RCTTiming.m b/React/Modules/RCTTiming.m index 2f3f6d40b..8d4eb0ffc 100644 --- a/React/Modules/RCTTiming.m +++ b/React/Modules/RCTTiming.m @@ -139,7 +139,7 @@ RCT_IMPORT_METHOD(RCTJSTimers, callTimers) _paused = NO; } -- (void)didUpdateFrame:(RCTFrameUpdate *)update +- (void)didUpdateFrame:(__unused RCTFrameUpdate *)update { NSMutableArray *timersToCall = [[NSMutableArray alloc] init]; for (RCTTimer *timer in _timers.allObjects) { diff --git a/React/Modules/RCTUIManager.m b/React/Modules/RCTUIManager.m index 366087480..0ffbaf0c3 100644 --- a/React/Modules/RCTUIManager.m +++ b/React/Modules/RCTUIManager.m @@ -225,7 +225,7 @@ static NSString *RCTViewNameForModuleName(NSString *moduleName) } // TODO: only send name once instead of a dictionary of name and type keyed by name -static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewName) +static NSDictionary *RCTViewConfigForModule(Class managerClass) { unsigned int count = 0; Method *methods = class_copyMethodList(object_getClass(managerClass), &count); @@ -308,11 +308,12 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewNa // Get view managers from bridge NSMutableDictionary *viewManagers = [[NSMutableDictionary alloc] init]; NSMutableDictionary *viewConfigs = [[NSMutableDictionary alloc] init]; - [_bridge.modules enumerateKeysAndObjectsUsingBlock:^(NSString *moduleName, RCTViewManager *manager, BOOL *stop) { + [_bridge.modules enumerateKeysAndObjectsUsingBlock: + ^(NSString *moduleName, RCTViewManager *manager, __unused BOOL *stop) { if ([manager isKindOfClass:[RCTViewManager class]]) { NSString *viewName = RCTViewNameForModuleName(moduleName); viewManagers[viewName] = manager; - viewConfigs[viewName] = RCTViewConfigForModule([manager class], viewName); + viewConfigs[viewName] = RCTViewConfigForModule([manager class]); } }]; @@ -325,7 +326,7 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewNa return _shadowQueue; } -- (void)registerRootView:(UIView *)rootView; +- (void)registerRootView:(UIView *)rootView { RCTAssertMainThread(); @@ -501,9 +502,9 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewNa } // Perform layout (possibly animated) - return ^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + return ^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { RCTResponseSenderBlock callback = self->_layoutAnimation.callback; - __block NSInteger completionsCalled = 0; + __block NSUInteger completionsCalled = 0; for (NSUInteger ii = 0; ii < frames.count; ii++) { NSNumber *reactTag = frameReactTags[ii]; UIView *view = viewRegistry[reactTag]; @@ -515,7 +516,7 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewNa BOOL shouldAnimateCreation = isNew && ![parentsAreNew[ii] boolValue]; RCTAnimation *createAnimation = shouldAnimateCreation ? _layoutAnimation.createAnimation : nil; - void (^completion)(BOOL finished) = ^(BOOL finished) { + void (^completion)(BOOL) = ^(BOOL finished) { completionsCalled++; if (event != (id)kCFNull) { [self.bridge.eventDispatcher sendInputEventWithName:@"topLayout" body:event]; @@ -578,7 +579,7 @@ static NSDictionary *RCTViewConfigForModule(Class managerClass, NSString *viewNa NSMutableSet *applierBlocks = [NSMutableSet setWithCapacity:1]; [topView collectUpdatedProperties:applierBlocks parentProperties:@{}]; - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { for (RCTApplierBlock block in applierBlocks) { block(viewRegistry); } @@ -594,9 +595,9 @@ RCT_EXPORT_METHOD(removeSubviewsFromContainerWithID:(NSNumber *)containerID) id container = _shadowViewRegistry[containerID]; RCTAssert(container != nil, @"container view (for ID %@) not found", containerID); - NSUInteger subviewsCount = [[container reactSubviews] count]; + NSUInteger subviewsCount = [container reactSubviews].count; NSMutableArray *indices = [[NSMutableArray alloc] initWithCapacity:subviewsCount]; - for (NSInteger childIndex = 0; childIndex < subviewsCount; childIndex++) { + for (NSUInteger childIndex = 0; childIndex < subviewsCount; childIndex++) { [indices addObject:@(childIndex)]; } @@ -619,20 +620,21 @@ RCT_EXPORT_METHOD(removeSubviewsFromContainerWithID:(NSNumber *)containerID) { // If there are no indices to move or the container has no subviews don't bother // We support parents with nil subviews so long as they're all nil so this allows for this behavior - if ([atIndices count] == 0 || [[container reactSubviews] count] == 0) { + if (atIndices.count == 0 || [container reactSubviews].count == 0) { return nil; } // Construction of removed children must be done "up front", before indices are disturbed by removals. NSMutableArray *removedChildren = [NSMutableArray arrayWithCapacity:atIndices.count]; RCTAssert(container != nil, @"container view (for ID %@) not found", container); - for (NSInteger i = 0; i < [atIndices count]; i++) { - NSInteger index = [atIndices[i] integerValue]; - if (index < [[container reactSubviews] count]) { + for (NSNumber *indexNumber in atIndices) { + NSUInteger index = indexNumber.unsignedIntegerValue; + if (index < [container reactSubviews].count) { [removedChildren addObject:[container reactSubviews][index]]; } } if (removedChildren.count != atIndices.count) { - RCTLogMustFix(@"removedChildren count (%tu) was not what we expected (%tu)", removedChildren.count, atIndices.count); + RCTLogMustFix(@"removedChildren count (%tu) was not what we expected (%tu)", + removedChildren.count, atIndices.count); } return removedChildren; } @@ -778,7 +780,7 @@ static BOOL RCTCallPropertySetter(NSString *key, SEL setter, id value, id view, static void RCTSetViewProps(NSDictionary *props, UIView *view, UIView *defaultView, RCTViewManager *manager) { - [props enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { + [props enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, __unused BOOL *stop) { SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set_%@:forView:withDefaultView:", key]); RCTCallPropertySetter(key, setter, obj, view, defaultView, manager); @@ -789,7 +791,7 @@ static void RCTSetViewProps(NSDictionary *props, UIView *view, static void RCTSetShadowViewProps(NSDictionary *props, RCTShadowView *shadowView, RCTShadowView *defaultView, RCTViewManager *manager) { - [props enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, BOOL *stop) { + [props enumerateKeysAndObjectsUsingBlock:^(NSString *key, id obj, __unused BOOL *stop) { SEL setter = NSSelectorFromString([NSString stringWithFormat:@"set_%@:forShadowView:withDefaultView:", key]); RCTCallPropertySetter(key, setter, obj, shadowView, defaultView, manager); @@ -877,7 +879,7 @@ RCT_EXPORT_METHOD(updateView:(NSNumber *)reactTag RCTSetShadowViewProps(props, shadowView, _defaultShadowViews[viewName], viewManager); [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { - UIView *view = uiManager->_viewRegistry[reactTag]; + UIView *view = viewRegistry[reactTag]; RCTSetViewProps(props, view, uiManager->_defaultViews[viewName], viewManager); }]; } @@ -885,7 +887,7 @@ RCT_EXPORT_METHOD(updateView:(NSNumber *)reactTag RCT_EXPORT_METHOD(focus:(NSNumber *)reactTag) { if (!reactTag) return; - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { UIView *newResponder = viewRegistry[reactTag]; [newResponder reactWillMakeFirstResponder]; [newResponder becomeFirstResponder]; @@ -896,7 +898,7 @@ RCT_EXPORT_METHOD(focus:(NSNumber *)reactTag) RCT_EXPORT_METHOD(blur:(NSNumber *)reactTag) { if (!reactTag) return; - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ UIView *currentResponder = viewRegistry[reactTag]; [currentResponder resignFirstResponder]; }]; @@ -908,7 +910,7 @@ RCT_EXPORT_METHOD(findSubviewIn:(NSNumber *)reactTag atPoint:(CGPoint)point call return; } - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { UIView *view = viewRegistry[reactTag]; UIView *target = [view hitTest:point withEvent:nil]; CGRect frame = [target convertRect:target.bounds toView:view]; @@ -940,7 +942,7 @@ RCT_EXPORT_METHOD(findSubviewIn:(NSNumber *)reactTag atPoint:(CGPoint)point call // Set up next layout animation if (_nextLayoutAnimation) { RCTLayoutAnimation *layoutAnimation = _nextLayoutAnimation; - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(RCTUIManager *uiManager, __unused RCTSparseArray *viewRegistry) { uiManager->_layoutAnimation = layoutAnimation; }]; } @@ -954,7 +956,7 @@ RCT_EXPORT_METHOD(findSubviewIn:(NSNumber *)reactTag atPoint:(CGPoint)point call // Clear layout animations if (_nextLayoutAnimation) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(RCTUIManager *uiManager, __unused RCTSparseArray *viewRegistry) { uiManager->_layoutAnimation = nil; }]; _nextLayoutAnimation = nil; @@ -996,7 +998,7 @@ RCT_EXPORT_METHOD(measure:(NSNumber *)reactTag return; } - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { UIView *view = viewRegistry[reactTag]; if (!view) { RCTLogError(@"measure cannot find view with tag #%@", reactTag); @@ -1063,7 +1065,7 @@ static void RCTMeasureLayout(RCTShadowView *view, */ RCT_EXPORT_METHOD(measureLayout:(NSNumber *)reactTag relativeTo:(NSNumber *)ancestorReactTag - errorCallback:(RCTResponseSenderBlock)errorCallback + errorCallback:(__unused RCTResponseSenderBlock)errorCallback callback:(RCTResponseSenderBlock)callback) { RCTShadowView *shadowView = _shadowViewRegistry[reactTag]; @@ -1079,7 +1081,7 @@ RCT_EXPORT_METHOD(measureLayout:(NSNumber *)reactTag * height). */ RCT_EXPORT_METHOD(measureLayoutRelativeToParent:(NSNumber *)reactTag - errorCallback:(RCTResponseSenderBlock)errorCallback + errorCallback:(__unused RCTResponseSenderBlock)errorCallback callback:(RCTResponseSenderBlock)callback) { RCTShadowView *shadowView = _shadowViewRegistry[reactTag]; @@ -1095,7 +1097,7 @@ RCT_EXPORT_METHOD(measureLayoutRelativeToParent:(NSNumber *)reactTag */ RCT_EXPORT_METHOD(measureViewsInRect:(CGRect)rect parentView:(NSNumber *)reactTag - errorCallback:(RCTResponseSenderBlock)errorCallback + errorCallback:(__unused RCTResponseSenderBlock)errorCallback callback:(RCTResponseSenderBlock)callback) { RCTShadowView *shadowView = _shadowViewRegistry[reactTag]; @@ -1107,7 +1109,8 @@ RCT_EXPORT_METHOD(measureViewsInRect:(CGRect)rect NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:[childShadowViews count]]; - [childShadowViews enumerateObjectsUsingBlock:^(RCTShadowView *childShadowView, NSUInteger idx, BOOL *stop) { + [childShadowViews enumerateObjectsUsingBlock: + ^(RCTShadowView *childShadowView, NSUInteger idx, __unused BOOL *stop) { CGRect childLayout = [childShadowView measureLayoutRelativeToAncestor:shadowView]; if (CGRectIsNull(childLayout)) { RCTLogError(@"View %@ (tag #%@) is not a decendant of %@ (tag #%@)", @@ -1167,7 +1170,7 @@ RCT_EXPORT_METHOD(scrollTo:(NSNumber *)reactTag withOffsetX:(CGFloat)offsetX offsetY:(CGFloat)offsetY) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ UIView *view = viewRegistry[reactTag]; if ([view conformsToProtocol:@protocol(RCTScrollableProtocol)]) { [(id)view scrollToOffset:(CGPoint){offsetX, offsetY} animated:YES]; @@ -1182,7 +1185,7 @@ RCT_EXPORT_METHOD(scrollWithoutAnimationTo:(NSNumber *)reactTag offsetX:(CGFloat)offsetX offsetY:(CGFloat)offsetY) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ UIView *view = viewRegistry[reactTag]; if ([view conformsToProtocol:@protocol(RCTScrollableProtocol)]) { [(id)view scrollToOffset:(CGPoint){offsetX, offsetY} animated:NO]; @@ -1195,7 +1198,7 @@ RCT_EXPORT_METHOD(scrollWithoutAnimationTo:(NSNumber *)reactTag RCT_EXPORT_METHOD(zoomToRect:(NSNumber *)reactTag withRect:(CGRect)rect) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ UIView *view = viewRegistry[reactTag]; if ([view conformsToProtocol:@protocol(RCTScrollableProtocol)]) { [(id)view zoomToRect:rect animated:YES]; @@ -1211,7 +1214,7 @@ RCT_EXPORT_METHOD(zoomToRect:(NSNumber *)reactTag */ RCT_EXPORT_METHOD(setJSResponder:(NSNumber *)reactTag) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { _jsResponder = viewRegistry[reactTag]; if (!_jsResponder) { RCTLogError(@"Invalid view set to be the JS responder - tag %zd", reactTag); @@ -1221,7 +1224,7 @@ RCT_EXPORT_METHOD(setJSResponder:(NSNumber *)reactTag) RCT_EXPORT_METHOD(clearJSResponder) { - [self addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self addUIBlock:^(__unused RCTUIManager *uiManager, __unused RCTSparseArray *viewRegistry) { _jsResponder = nil; }]; } @@ -1326,7 +1329,7 @@ RCT_EXPORT_METHOD(clearJSResponder) }, } mutableCopy]; - [_viewManagers enumerateKeysAndObjectsUsingBlock:^(NSString *name, RCTViewManager *manager, BOOL *stop) { + for (RCTViewManager *manager in _viewManagers) { if (RCTClassOverridesInstanceMethod([manager class], @selector(customBubblingEventTypes))) { NSDictionary *eventTypes = [manager customBubblingEventTypes]; for (NSString *eventName in eventTypes) { @@ -1335,7 +1338,7 @@ RCT_EXPORT_METHOD(clearJSResponder) } [customBubblingEventTypesConfigs addEntriesFromDictionary:eventTypes]; } - }]; + }; return customBubblingEventTypesConfigs; } @@ -1387,7 +1390,7 @@ RCT_EXPORT_METHOD(clearJSResponder) }, } mutableCopy]; - [_viewManagers enumerateKeysAndObjectsUsingBlock:^(NSString *name, RCTViewManager *manager, BOOL *stop) { + for (RCTViewManager *manager in _viewManagers) { if (RCTClassOverridesInstanceMethod([manager class], @selector(customDirectEventTypes))) { NSDictionary *eventTypes = [manager customDirectEventTypes]; for (NSString *eventName in eventTypes) { @@ -1395,7 +1398,7 @@ RCT_EXPORT_METHOD(clearJSResponder) } [customDirectEventTypes addEntriesFromDictionary:eventTypes]; } - }]; + }; return customDirectEventTypes; } @@ -1418,8 +1421,11 @@ RCT_EXPORT_METHOD(clearJSResponder) }, } mutableCopy]; - [_viewManagers enumerateKeysAndObjectsUsingBlock:^(NSString *name, RCTViewManager *manager, BOOL *stop) { - NSMutableDictionary *constantsNamespace = [NSMutableDictionary dictionaryWithDictionary:allJSConstants[name]]; + [_viewManagers enumerateKeysAndObjectsUsingBlock: + ^(NSString *name, RCTViewManager *manager, __unused BOOL *stop) { + + NSMutableDictionary *constantsNamespace = + [NSMutableDictionary dictionaryWithDictionary:allJSConstants[name]]; // Add custom constants // TODO: should these be inherited? @@ -1440,7 +1446,7 @@ RCT_EXPORT_METHOD(clearJSResponder) RCT_EXPORT_METHOD(configureNextLayoutAnimation:(NSDictionary *)config withCallback:(RCTResponseSenderBlock)callback - errorCallback:(RCTResponseSenderBlock)errorCallback) + errorCallback:(__unused RCTResponseSenderBlock)errorCallback) { if (_nextLayoutAnimation) { RCTLogWarn(@"Warning: Overriding previous layout animation with new one before the first began:\n%@ -> %@.", _nextLayoutAnimation, config); diff --git a/React/React.xcodeproj/project.pbxproj b/React/React.xcodeproj/project.pbxproj index 513773b6d..81f65d39a 100644 --- a/React/React.xcodeproj/project.pbxproj +++ b/React/React.xcodeproj/project.pbxproj @@ -618,6 +618,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = NO; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -626,6 +627,10 @@ MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Debug; }; @@ -654,6 +659,7 @@ GCC_PREPROCESSOR_DEFINITIONS = ""; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; @@ -662,6 +668,10 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; + WARNING_CFLAGS = ( + "-Wextra", + "-Wall", + ); }; name = Release; }; diff --git a/React/Views/RCTMapManager.m b/React/Views/RCTMapManager.m index 7a9401fdd..b1c5c84b8 100644 --- a/React/Views/RCTMapManager.m +++ b/React/Views/RCTMapManager.m @@ -64,7 +64,7 @@ RCT_CUSTOM_VIEW_PROPERTY(region, MKCoordinateRegion, RCTMap) } } -- (void)mapView:(RCTMap *)mapView regionWillChangeAnimated:(BOOL)animated +- (void)mapView:(RCTMap *)mapView regionWillChangeAnimated:(__unused BOOL)animated { [self _regionChanged:mapView]; @@ -77,7 +77,7 @@ RCT_CUSTOM_VIEW_PROPERTY(region, MKCoordinateRegion, RCTMap) [[NSRunLoop mainRunLoop] addTimer:mapView.regionChangeObserveTimer forMode:NSRunLoopCommonModes]; } -- (void)mapView:(RCTMap *)mapView regionDidChangeAnimated:(BOOL)animated +- (void)mapView:(RCTMap *)mapView regionDidChangeAnimated:(__unused BOOL)animated { [mapView.regionChangeObserveTimer invalidate]; mapView.regionChangeObserveTimer = nil; diff --git a/React/Views/RCTNavigator.m b/React/Views/RCTNavigator.m index 381846569..63e3d8023 100644 --- a/React/Views/RCTNavigator.m +++ b/React/Views/RCTNavigator.m @@ -267,8 +267,10 @@ NSInteger kNeverProgressed = -10000; @synthesize paused = _paused; -- (id)initWithBridge:(RCTBridge *)bridge +- (instancetype)initWithBridge:(RCTBridge *)bridge { + RCTAssertParam(bridge); + if ((self = [super initWithFrame:CGRectZero])) { _paused = YES; @@ -291,7 +293,10 @@ NSInteger kNeverProgressed = -10000; return self; } -- (void)didUpdateFrame:(RCTFrameUpdate *)update +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + +- (void)didUpdateFrame:(__unused RCTFrameUpdate *)update { if (_currentlyTransitioningFrom != _currentlyTransitioningTo) { UIView *topView = _dummyView; @@ -328,8 +333,8 @@ NSInteger kNeverProgressed = -10000; * locks aside from the animation complete hook. */ - (void)navigationController:(UINavigationController *)navigationController - willShowViewController:(UIViewController *)viewController - animated:(BOOL)animated + willShowViewController:(__unused UIViewController *)viewController + animated:(__unused BOOL)animated { id tc = navigationController.topViewController.transitionCoordinator; @@ -343,12 +348,12 @@ NSInteger kNeverProgressed = -10000; NSUInteger indexOfFrom = [_currentViews indexOfObject:fromController.navItem]; NSUInteger indexOfTo = [_currentViews indexOfObject:toController.navItem]; CGFloat destination = indexOfFrom < indexOfTo ? 1.0 : -1.0; - _dummyView.frame = (CGRect){{destination}}; + _dummyView.frame = (CGRect){{destination, 0}, CGSizeZero}; _currentlyTransitioningFrom = indexOfFrom; _currentlyTransitioningTo = indexOfTo; _paused = NO; } - completion:^(id context) { + completion:^(__unused id context) { [weakSelf freeLock]; _currentlyTransitioningFrom = 0; _currentlyTransitioningTo = 0; @@ -441,13 +446,13 @@ NSInteger kNeverProgressed = -10000; // hooked up yet, so we do it on demand here [self addControllerToClosestParent:_navigationController]; - NSInteger viewControllerCount = _navigationController.viewControllers.count; + NSUInteger viewControllerCount = _navigationController.viewControllers.count; // The "react count" is the count of views that are visible on the navigation // stack. There may be more beyond this - that aren't visible, and may be // deleted/purged soon. - NSInteger previousReactCount = + NSUInteger previousReactCount = _previousRequestedTopOfStack == kNeverRequested ? 0 : _previousRequestedTopOfStack + 1; - NSInteger currentReactCount = _requestedTopOfStack + 1; + NSUInteger currentReactCount = _requestedTopOfStack + 1; BOOL jsGettingAhead = // ----- previously caught up ------ ------ no longer caught up ------- @@ -465,7 +470,7 @@ NSInteger kNeverProgressed = -10000; BOOL jsGettingtooSlow = // --- previously not caught up -------- ------- no longer caught up ---------- viewControllerCount < previousReactCount && currentReactCount < previousReactCount; - + BOOL reactPushOne = jsGettingAhead && currentReactCount == previousReactCount + 1; BOOL reactPopN = jsGettingAhead && currentReactCount < previousReactCount; @@ -486,7 +491,7 @@ BOOL jsGettingtooSlow = // Views before the previous React count must not have changed. Views greater than previousReactCount // up to currentReactCount may have changed. - for (NSInteger i = 0; i < MIN(_currentViews.count, MIN(_previousViews.count, previousReactCount)); i++) { + for (NSUInteger i = 0; i < MIN(_currentViews.count, MIN(_previousViews.count, previousReactCount)); i++) { if (_currentViews[i] != _previousViews[i]) { RCTLogError(@"current view should equal previous view"); } diff --git a/React/Views/RCTNavigatorManager.m b/React/Views/RCTNavigatorManager.m index 1158f7dcf..7d9a78045 100644 --- a/React/Views/RCTNavigatorManager.m +++ b/React/Views/RCTNavigatorManager.m @@ -37,10 +37,11 @@ RCT_EXPORT_VIEW_PROPERTY(requestedTopOfStack, NSInteger) // TODO: remove error callbacks RCT_EXPORT_METHOD(requestSchedulingJavaScriptNavigation:(NSNumber *)reactTag - errorCallback:(RCTResponseSenderBlock)errorCallback - callback:(__unused RCTResponseSenderBlock)callback) + errorCallback:(__unused RCTResponseSenderBlock)errorCallback + callback:(RCTResponseSenderBlock)callback) { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ + [self.bridge.uiManager addUIBlock: + ^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry){ RCTNavigator *navigator = viewRegistry[reactTag]; if ([navigator isKindOfClass:[RCTNavigator class]]) { BOOL wasAcquired = [navigator requestSchedulingJavaScriptNavigation]; diff --git a/React/Views/RCTPicker.m b/React/Views/RCTPicker.m index dd2bcdb8a..9e1f3bb07 100644 --- a/React/Views/RCTPicker.m +++ b/React/Views/RCTPicker.m @@ -27,9 +27,11 @@ const NSInteger UNINITIALIZED_INDEX = -1; NSInteger _selectedIndex; } -- (id)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher +- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { - if (self = [super initWithFrame:CGRectZero]) { + RCTAssertParam(eventDispatcher); + + if ((self = [super initWithFrame:CGRectZero])) { _eventDispatcher = eventDispatcher; _selectedIndex = UNINITIALIZED_INDEX; self.delegate = self; @@ -37,12 +39,13 @@ const NSInteger UNINITIALIZED_INDEX = -1; return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)setItems:(NSArray *)items { - if (_items != items) { - _items = [items copy]; - [self setNeedsLayout]; - } + _items = [items copy]; + [self setNeedsLayout]; } - (void)setSelectedIndex:(NSInteger)selectedIndex @@ -58,12 +61,13 @@ const NSInteger UNINITIALIZED_INDEX = -1; #pragma mark - UIPickerViewDataSource protocol -- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView +- (NSInteger)numberOfComponentsInPickerView:(__unused UIPickerView *)pickerView { return 1; } -- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component +- (NSInteger)pickerView:(__unused UIPickerView *)pickerView +numberOfRowsInComponent:(__unused NSInteger)component { return _items.count; } @@ -80,12 +84,14 @@ const NSInteger UNINITIALIZED_INDEX = -1; return [self itemForRow:row][@"value"]; } -- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component +- (NSString *)pickerView:(__unused UIPickerView *)pickerView + titleForRow:(NSInteger)row forComponent:(__unused NSInteger)component { return [self itemForRow:row][@"label"]; } -- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component +- (void)pickerView:(__unused UIPickerView *)pickerView + didSelectRow:(NSInteger)row inComponent:(__unused NSInteger)component { _selectedIndex = row; NSDictionary *event = @{ @@ -96,4 +102,5 @@ const NSInteger UNINITIALIZED_INDEX = -1; [_eventDispatcher sendInputEventWithName:@"topChange" body:event]; } + @end diff --git a/React/Views/RCTPickerManager.m b/React/Views/RCTPickerManager.m index de6c1f916..8e31e5fe9 100644 --- a/React/Views/RCTPickerManager.m +++ b/React/Views/RCTPickerManager.m @@ -27,7 +27,7 @@ RCT_EXPORT_VIEW_PROPERTY(selectedIndex, NSInteger) - (NSDictionary *)constantsToExport { - RCTPicker *view = [[RCTPicker alloc] init]; + UIPickerView *view = [[UIPickerView alloc] init]; return @{ @"ComponentHeight": @(view.intrinsicContentSize.height), @"ComponentWidth": @(view.intrinsicContentSize.width) diff --git a/React/Views/RCTScrollView.m b/React/Views/RCTScrollView.m index e6fdb83ca..e3f746fb5 100644 --- a/React/Views/RCTScrollView.m +++ b/React/Views/RCTScrollView.m @@ -44,7 +44,9 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; scrollView:(UIScrollView *)scrollView userData:(NSDictionary *)userData { - if (self = [super init]) { + RCTAssertParam(reactTag); + + if ((self = [super init])) { _type = type; _viewTag = reactTag; _scrollView = scrollView; @@ -53,6 +55,8 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; return self; } +RCT_NOT_IMPLEMENTED(-init) + - (uint16_t)coalescingKey { return 0; @@ -166,7 +170,7 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; return NO; } -- (void)handleCustomPan:(UIPanGestureRecognizer *)sender +- (void)handleCustomPan:(__unused UIPanGestureRecognizer *)sender { if ([self _shouldDisableScrollInteraction]) { self.panGestureRecognizer.enabled = NO; @@ -181,7 +185,7 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; } } -- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated +- (void)scrollRectToVisible:(__unused CGRect)rect animated:(__unused BOOL)animated { // noop } @@ -228,7 +232,7 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; * In order to have this called, you must have delaysContentTouches set to NO * (which is the not the `UIKit` default). */ -- (BOOL)touchesShouldCancelInContentView:(UIView *)view +- (BOOL)touchesShouldCancelInContentView:(__unused UIView *)view { //TODO: shouldn't this call super if _shouldDisableScrollInteraction returns NO? return ![self _shouldDisableScrollInteraction]; @@ -265,8 +269,9 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; __block UIView *previousHeader = nil; __block UIView *currentHeader = nil; __block UIView *nextHeader = nil; - NSInteger subviewCount = contentView.reactSubviews.count; - [_stickyHeaderIndices enumerateIndexesWithOptions:0 usingBlock:^(NSUInteger idx, BOOL *stop) { + NSUInteger subviewCount = contentView.reactSubviews.count; + [_stickyHeaderIndices enumerateIndexesWithOptions:0 usingBlock: + ^(NSUInteger idx, __unused BOOL *stop) { if (idx >= subviewCount) { RCTLogError(@"Sticky header index %zd was outside the range {0, %zd}", idx, subviewCount); @@ -358,6 +363,8 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { + RCTAssertParam(eventDispatcher); + if ((self = [super initWithFrame:CGRectZero])) { _eventDispatcher = eventDispatcher; @@ -377,12 +384,15 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)setRemoveClippedSubviews:(__unused BOOL)removeClippedSubviews { // Does nothing } -- (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex +- (void)insertReactSubview:(UIView *)view atIndex:(__unused NSInteger)atIndex { RCTAssert(_contentView == nil, @"RCTScrollView may only contain a single subview"); _contentView = view; @@ -401,11 +411,21 @@ CGFloat const ZINDEX_STICKY_HEADER = 50; return _contentView ? @[_contentView] : @[]; } +- (BOOL)centerContent +{ + return _scrollView.centerContent; +} + - (void)setCenterContent:(BOOL)centerContent { _scrollView.centerContent = centerContent; } +- (NSIndexSet *)stickyHeaderIndices +{ + return _scrollView.stickyHeaderIndices; +} + - (void)setStickyHeaderIndices:(NSIndexSet *)headerIndices { RCTAssert(_scrollView.contentSize.width <= self.frame.size.width, @@ -506,7 +526,8 @@ RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, RCTScrollEventTypeMove) // Calculate changed frames NSMutableArray *updatedChildFrames = [[NSMutableArray alloc] init]; - [[_contentView reactSubviews] enumerateObjectsUsingBlock:^(UIView *subview, NSUInteger idx, BOOL *stop) { + [[_contentView reactSubviews] enumerateObjectsUsingBlock: + ^(UIView *subview, NSUInteger idx, __unused BOOL *stop) { // Check if new or changed CGRect newFrame = subview.frame; @@ -589,7 +610,7 @@ RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, RCTScrollEventTypeMove) return YES; } -- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView +- (UIView *)viewForZoomingInScrollView:(__unused UIScrollView *)scrollView { return _contentView; } diff --git a/React/Views/RCTScrollViewManager.m b/React/Views/RCTScrollViewManager.m index 15803df1e..6e74d1333 100644 --- a/React/Views/RCTScrollViewManager.m +++ b/React/Views/RCTScrollViewManager.m @@ -75,7 +75,7 @@ RCT_DEPRECATED_VIEW_PROPERTY(throttleScrollCallbackMS, scrollEventThrottle) RCT_EXPORT_METHOD(getContentSize:(NSNumber *)reactTag callback:(RCTResponseSenderBlock)callback) { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { UIView *view = viewRegistry[reactTag]; if (!view) { diff --git a/React/Views/RCTShadowView.m b/React/Views/RCTShadowView.m index ba70ca34f..b9343895f 100644 --- a/React/Views/RCTShadowView.m +++ b/React/Views/RCTShadowView.m @@ -213,7 +213,8 @@ static void RCTProcessMetaProps(const float metaProps[META_PROP_COUNT], float st } } -- (void)collectRootUpdatedFrames:(NSMutableSet *)viewsWithNewFrame parentConstraint:(CGSize)parentConstraint +- (void)collectRootUpdatedFrames:(NSMutableSet *)viewsWithNewFrame + parentConstraint:(__unused CGSize)parentConstraint { [self fillCSSNode:_cssNode]; layoutNode(_cssNode, CSS_UNDEFINED); diff --git a/React/Views/RCTTabBar.m b/React/Views/RCTTabBar.m index b5b6240a4..06df7bad6 100644 --- a/React/Views/RCTTabBar.m +++ b/React/Views/RCTTabBar.m @@ -30,8 +30,10 @@ NSMutableArray *_tabViews; } -- (id)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher +- (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { + RCTAssertParam(eventDispatcher); + if ((self = [super initWithFrame:CGRectZero])) { _eventDispatcher = eventDispatcher; _tabViews = [[NSMutableArray alloc] init]; @@ -42,6 +44,9 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (UIViewController *)backingViewController { return _tabController; @@ -105,7 +110,8 @@ _tabsChanged = NO; } - [[self reactSubviews] enumerateObjectsUsingBlock:^(RCTTabBarItem *tab, NSUInteger index, BOOL *stop) { + [[self reactSubviews] enumerateObjectsUsingBlock: + ^(RCTTabBarItem *tab, NSUInteger index, __unused BOOL *stop) { UIViewController *controller = _tabController.viewControllers[index]; controller.tabBarItem = tab.barItem; if (tab.selected) { @@ -114,11 +120,21 @@ }]; } +- (UIColor *)barTintColor +{ + return _tabController.tabBar.barTintColor; +} + - (void)setBarTintColor:(UIColor *)barTintColor { _tabController.tabBar.barTintColor = barTintColor; } +- (UIColor *)tintColor +{ + return _tabController.tabBar.tintColor; +} + - (void)setTintColor:(UIColor *)tintColor { _tabController.tabBar.tintColor = tintColor; diff --git a/React/Views/RCTTextField.m b/React/Views/RCTTextField.m index 12d52b1b8..46e9cc7a4 100644 --- a/React/Views/RCTTextField.m +++ b/React/Views/RCTTextField.m @@ -24,7 +24,7 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { if ((self = [super initWithFrame:CGRectZero])) { - + RCTAssert(eventDispatcher, @"eventDispatcher is a required parameter"); _eventDispatcher = eventDispatcher; [self addTarget:self action:@selector(_textFieldDidChange) forControlEvents:UIControlEventEditingChanged]; [self addTarget:self action:@selector(_textFieldBeginEditing) forControlEvents:UIControlEventEditingDidBegin]; @@ -35,6 +35,9 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)setText:(NSString *)text { if (![text isEqualToString:self.text]) { diff --git a/React/Views/RCTTextFieldManager.m b/React/Views/RCTTextFieldManager.m index 7b867bd0d..3d440665a 100644 --- a/React/Views/RCTTextFieldManager.m +++ b/React/Views/RCTTextFieldManager.m @@ -43,11 +43,11 @@ RCT_CUSTOM_VIEW_PROPERTY(fontSize, CGFloat, RCTTextField) { view.font = [RCTConvert UIFont:view.font withSize:json ?: @(defaultView.font.pointSize)]; } -RCT_CUSTOM_VIEW_PROPERTY(fontWeight, NSString, RCTTextField) +RCT_CUSTOM_VIEW_PROPERTY(fontWeight, NSString, __unused RCTTextField) { view.font = [RCTConvert UIFont:view.font withWeight:json]; // defaults to normal } -RCT_CUSTOM_VIEW_PROPERTY(fontStyle, NSString, RCTTextField) +RCT_CUSTOM_VIEW_PROPERTY(fontStyle, NSString, __unused RCTTextField) { view.font = [RCTConvert UIFont:view.font withStyle:json]; // defaults to normal } @@ -60,7 +60,7 @@ RCT_CUSTOM_VIEW_PROPERTY(fontFamily, NSString, RCTTextField) { NSNumber *reactTag = shadowView.reactTag; UIEdgeInsets padding = shadowView.paddingAsInsets; - return ^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + return ^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { ((RCTTextField *)viewRegistry[reactTag]).contentInset = padding; }; } diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index a584a5798..a5cecb7a5 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -129,6 +129,8 @@ static NSString *RCTRecursiveAccessibilityLabel(UIView *view) return self; } +RCT_NOT_IMPLEMENTED(-initWithCoder:unused) + - (NSString *)accessibilityLabel { if (super.accessibilityLabel) { @@ -236,10 +238,10 @@ static NSString *RCTRecursiveAccessibilityLabel(UIView *view) - (void)react_remountAllSubviews { if (_reactSubviews) { - NSInteger index = 0; + NSUInteger index = 0; for (UIView *view in _reactSubviews) { if (view.superview != self) { - if (index < [self subviews].count) { + if (index < self.subviews.count) { [self insertSubview:view atIndex:index]; } else { [self addSubview:view]; diff --git a/React/Views/RCTViewManager.m b/React/Views/RCTViewManager.m index d7a93b7e3..ce027bbed 100644 --- a/React/Views/RCTViewManager.m +++ b/React/Views/RCTViewManager.m @@ -79,12 +79,12 @@ RCT_EXPORT_MODULE() return nil; } -- (RCTViewManagerUIBlock)uiBlockToAmendWithShadowView:(RCTShadowView *)shadowView +- (RCTViewManagerUIBlock)uiBlockToAmendWithShadowView:(__unused RCTShadowView *)shadowView { return nil; } -- (RCTViewManagerUIBlock)uiBlockToAmendWithShadowViewRegistry:(RCTSparseArray *)shadowViewRegistry +- (RCTViewManagerUIBlock)uiBlockToAmendWithShadowViewRegistry:(__unused RCTSparseArray *)shadowViewRegistry { return nil; } @@ -169,11 +169,11 @@ RCT_CUSTOM_VIEW_PROPERTY(borderWidth, CGFloat, RCTView) view.layer.borderWidth = json ? [RCTConvert CGFloat:json] : defaultView.layer.borderWidth; } } -RCT_CUSTOM_VIEW_PROPERTY(onAccessibilityTap, BOOL, RCTView) +RCT_CUSTOM_VIEW_PROPERTY(onAccessibilityTap, BOOL, __unused RCTView) { view.accessibilityTapHandler = [self eventHandlerWithName:@"topAccessibilityTap" json:json]; } -RCT_CUSTOM_VIEW_PROPERTY(onMagicTap, BOOL, RCTView) +RCT_CUSTOM_VIEW_PROPERTY(onMagicTap, BOOL, __unused RCTView) { view.magicTapHandler = [self eventHandlerWithName:@"topMagicTap" json:json]; } @@ -239,7 +239,7 @@ RCT_EXPORT_SHADOW_PROPERTY(borderTopWidth, CGFloat) RCT_EXPORT_SHADOW_PROPERTY(borderRightWidth, CGFloat) RCT_EXPORT_SHADOW_PROPERTY(borderBottomWidth, CGFloat) RCT_EXPORT_SHADOW_PROPERTY(borderLeftWidth, CGFloat) -RCT_CUSTOM_SHADOW_PROPERTY(borderWidth, CGFloat, RCTShadowView) { +RCT_CUSTOM_SHADOW_PROPERTY(borderWidth, CGFloat, __unused RCTShadowView) { [view setBorderWidth:[RCTConvert CGFloat:json]]; } diff --git a/React/Views/RCTWebView.m b/React/Views/RCTWebView.m index 56cda0c88..9e2fd3504 100644 --- a/React/Views/RCTWebView.m +++ b/React/Views/RCTWebView.m @@ -30,6 +30,8 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher { + RCTAssertParam(eventDispatcher); + if ((self = [super initWithFrame:CGRectZero])) { super.backgroundColor = [UIColor clearColor]; _automaticallyAdjustContentInsets = YES; @@ -42,6 +44,9 @@ return self; } +RCT_NOT_IMPLEMENTED(-initWithFrame:(CGRect)frame) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)goForward { [_webView goForward]; @@ -57,6 +62,11 @@ [_webView reload]; } +- (NSURL *)URL +{ + return _webView.request.URL; +} + - (void)setURL:(NSURL *)URL { // Because of the way React works, as pages redirect, we actually end up @@ -68,7 +78,7 @@ } if (!URL) { // Clear the webview - [_webView loadHTMLString:nil baseURL:nil]; + [_webView loadHTMLString:@"" baseURL:nil]; return; } [_webView loadRequest:[NSURLRequest requestWithURL:URL]]; @@ -128,7 +138,7 @@ static NSString *const RCTJSAJAXScheme = @"react-ajax"; -- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request +- (BOOL)webView:(__unused UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // We have this check to filter out iframe requests and whatnot @@ -146,7 +156,7 @@ static NSString *const RCTJSAJAXScheme = @"react-ajax"; return ![request.URL.scheme isEqualToString:RCTJSAJAXScheme]; } -- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error +- (void)webView:(__unused UIWebView *)webView didFailLoadWithError:(NSError *)error { if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) { // NSURLErrorCancelled is reported when a page has a redirect OR if you load diff --git a/React/Views/RCTWebViewManager.m b/React/Views/RCTWebViewManager.m index 015285871..50659a562 100644 --- a/React/Views/RCTWebViewManager.m +++ b/React/Views/RCTWebViewManager.m @@ -47,7 +47,7 @@ RCT_EXPORT_VIEW_PROPERTY(shouldInjectAJAXHandler, BOOL); RCT_EXPORT_METHOD(goBack:(NSNumber *)reactTag) { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { RCTWebView *view = viewRegistry[reactTag]; if (![view isKindOfClass:[RCTWebView class]]) { RCTLogError(@"Invalid view returned from registry, expecting RKWebView, got: %@", view); @@ -58,7 +58,7 @@ RCT_EXPORT_METHOD(goBack:(NSNumber *)reactTag) RCT_EXPORT_METHOD(goForward:(NSNumber *)reactTag) { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { id view = viewRegistry[reactTag]; if (![view isKindOfClass:[RCTWebView class]]) { RCTLogError(@"Invalid view returned from registry, expecting RKWebView, got: %@", view); @@ -70,7 +70,7 @@ RCT_EXPORT_METHOD(goForward:(NSNumber *)reactTag) RCT_EXPORT_METHOD(reload:(NSNumber *)reactTag) { - [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { + [self.bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, RCTSparseArray *viewRegistry) { RCTWebView *view = viewRegistry[reactTag]; if (![view isKindOfClass:[RCTWebView class]]) { RCTLogMustFix(@"Invalid view returned from registry, expecting RKWebView, got: %@", view); diff --git a/React/Views/RCTWrapperViewController.m b/React/Views/RCTWrapperViewController.m index 400ce5fab..c8da5e448 100644 --- a/React/Views/RCTWrapperViewController.m +++ b/React/Views/RCTWrapperViewController.m @@ -32,7 +32,10 @@ - (instancetype)initWithContentView:(UIView *)contentView eventDispatcher:(RCTEventDispatcher *)eventDispatcher { - if (self = [super initWithNibName:nil bundle:nil]) { + RCTAssertParam(contentView); + RCTAssertParam(eventDispatcher); + + if ((self = [super initWithNibName:nil bundle:nil])) { _contentView = contentView; _eventDispatcher = eventDispatcher; self.automaticallyAdjustsScrollViewInsets = NO; @@ -43,12 +46,15 @@ - (instancetype)initWithNavItem:(RCTNavItem *)navItem eventDispatcher:(RCTEventDispatcher *)eventDispatcher { - if (self = [self initWithContentView:navItem eventDispatcher:eventDispatcher]) { + if ((self = [self initWithContentView:navItem eventDispatcher:eventDispatcher])) { _navItem = navItem; } return self; } +RCT_NOT_IMPLEMENTED(-initWithNibName:(NSString *)nn bundle:(NSBundle *)nb) +RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) + - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; diff --git a/React/Views/UIView+React.m b/React/Views/UIView+React.m index a448559ca..abde6c1f3 100644 --- a/React/Views/UIView+React.m +++ b/React/Views/UIView+React.m @@ -118,7 +118,7 @@ */ - (void)reactWillMakeFirstResponder {}; - (void)reactDidMakeFirstResponder {}; -- (BOOL)reactRespondsToTouch:(UITouch *)touch +- (BOOL)reactRespondsToTouch:(__unused UITouch *)touch { return YES; } From c30365acba4a3d922ed455f5661895f3e6139087 Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 10:48:24 -0700 Subject: [PATCH 03/16] [ReactNative] Remove RCTJSTimers Summary: @public Remove `RCTJSTimers.js`, the file was just an alias to `JSTimersExecution`. Test Plan: Still builds. --- .../BatchedBridgedModules/RCTJSTimers.js | 18 ------------------ .../ReactNative/ReactNativeDefaultInjection.js | 2 +- React/Base/RCTBridge.m | 2 +- React/Modules/RCTTiming.m | 4 ++-- 4 files changed, 4 insertions(+), 22 deletions(-) delete mode 100644 Libraries/BatchedBridge/BatchedBridgedModules/RCTJSTimers.js diff --git a/Libraries/BatchedBridge/BatchedBridgedModules/RCTJSTimers.js b/Libraries/BatchedBridge/BatchedBridgedModules/RCTJSTimers.js deleted file mode 100644 index 08a126b00..000000000 --- a/Libraries/BatchedBridge/BatchedBridgedModules/RCTJSTimers.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - * - * @providesModule RCTJSTimers - * @flow - */ -'use strict'; - -var JSTimersExecution = require('JSTimersExecution'); - -var RCTJSTimers = JSTimersExecution; - -module.exports = RCTJSTimers; diff --git a/Libraries/ReactNative/ReactNativeDefaultInjection.js b/Libraries/ReactNative/ReactNativeDefaultInjection.js index ce040c779..15a3e5400 100644 --- a/Libraries/ReactNative/ReactNativeDefaultInjection.js +++ b/Libraries/ReactNative/ReactNativeDefaultInjection.js @@ -40,7 +40,7 @@ var invariant = require('invariant'); // Just to ensure this gets packaged, since its only caller is from Native. require('RCTEventEmitter'); require('RCTLog'); -require('RCTJSTimers'); +require('JSTimersExecution'); function inject() { /** diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 8f2f199ee..818af496b 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -1245,7 +1245,7 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module { RCTAssertJSThread(); - NSString *moduleDotMethod = @"RCTJSTimers.callTimers"; + NSString *moduleDotMethod = @"JSTimersExecution.callTimers"; NSNumber *moduleID = RCTLocalModuleIDs[moduleDotMethod]; RCTAssert(moduleID != nil, @"Module '%@' not registered.", [[moduleDotMethod componentsSeparatedByString:@"."] firstObject]); diff --git a/React/Modules/RCTTiming.m b/React/Modules/RCTTiming.m index 8d4eb0ffc..06cb8b3e9 100644 --- a/React/Modules/RCTTiming.m +++ b/React/Modules/RCTTiming.m @@ -74,7 +74,7 @@ RCT_EXPORT_MODULE() -RCT_IMPORT_METHOD(RCTJSTimers, callTimers) +RCT_IMPORT_METHOD(JSTimersExecution, callTimers) - (instancetype)init { @@ -153,7 +153,7 @@ RCT_IMPORT_METHOD(RCTJSTimers, callTimers) // call timers that need to be called if ([timersToCall count] > 0) { - [_bridge enqueueJSCall:@"RCTJSTimers.callTimers" args:@[timersToCall]]; + [_bridge enqueueJSCall:@"JSTimersExecution.callTimers" args:@[timersToCall]]; } if (_timers.count == 0) { From 58c58d9bed67c329a719599571367d98db4b3b20 Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 11:23:30 -0700 Subject: [PATCH 04/16] [ReactNative] Fix racing condition on RKHTTPRequestHandler --- Libraries/Network/RCTDataManager.m | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Libraries/Network/RCTDataManager.m b/Libraries/Network/RCTDataManager.m index ed2c560d8..49ce6d754 100644 --- a/Libraries/Network/RCTDataManager.m +++ b/Libraries/Network/RCTDataManager.m @@ -134,12 +134,12 @@ typedef void (^RCTHTTPQueryResult)(NSError *error, NSDictionary *result); @implementation RCTActiveURLRequest -- (void)setResponse:(NSURLResponse *)response; +- (instancetype)init { - _response = response; - if (!_incrementalUpdates) { - _data = [[NSMutableData alloc] initWithCapacity:(NSUInteger)MAX(0, response.expectedContentLength)]; + if ((self = [super init])) { + _data = [[NSMutableData alloc] init]; } + return self; } @end From 5d6a89bc6186633802945a84d2da2b7d1e252695 Mon Sep 17 00:00:00 2001 From: James Ide Date: Mon, 15 Jun 2015 12:00:18 -0700 Subject: [PATCH 05/16] [Text] Support "textAlign: justify" in Text components Summary: Finished adding support for justified text on iOS... just had to expose a prop value. Fixes #529 Closes https://github.com/facebook/react-native/pull/1486 Github Author: James Ide Test Plan: View the Text example in the UIExplorer and see that all but the last lines of text in the justified text example are justified and extend to the far right of the available space. Tested on iOS 8, iPhone 6 simulator. ![text](https://cloud.githubusercontent.com/assets/379606/7926252/a90d2e98-0884-11e5-9f12-5cbb27505a0b.png) --- Examples/UIExplorer/TextExample.ios.js | 5 +++++ .../testTextExampleSnapshot_1@2x.png | Bin 275593 -> 275037 bytes .../UIExplorerIntegrationTests.m | 2 +- Libraries/Text/TextStylePropTypes.js | 3 ++- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Examples/UIExplorer/TextExample.ios.js b/Examples/UIExplorer/TextExample.ios.js index b2fd717ad..ebc67b672 100644 --- a/Examples/UIExplorer/TextExample.ios.js +++ b/Examples/UIExplorer/TextExample.ios.js @@ -215,6 +215,11 @@ exports.examples = [ right right right right right right right right right right right right right + + justify: this text component's contents are laid out with "textAlign: justify" + and as you can see all of the lines except the last one span the + available width of the parent container. + ); }, diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-UIExplorerApp.ios/testTextExampleSnapshot_1@2x.png b/Examples/UIExplorer/UIExplorerIntegrationTests/ReferenceImages/Examples-UIExplorer-UIExplorerApp.ios/testTextExampleSnapshot_1@2x.png index f869159a2c88eab0166d95008e206db2a15023b8..f37869de39ea06dcd44dfa79b28d57efcbb5979c 100644 GIT binary patch delta 169962 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ð@aeXe#&;ruv5pIYwTw|*A}vI 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�ZCevcl0h=PPXaX-zqxdS=tm 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 delta 168495 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 LWtrlqhW`HpIXHGP diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/UIExplorerIntegrationTests.m b/Examples/UIExplorer/UIExplorerIntegrationTests/UIExplorerIntegrationTests.m index c1c5e5737..8ee424425 100644 --- a/Examples/UIExplorer/UIExplorerIntegrationTests/UIExplorerIntegrationTests.m +++ b/Examples/UIExplorer/UIExplorerIntegrationTests/UIExplorerIntegrationTests.m @@ -42,7 +42,7 @@ _runner = RCTInitRunnerForApp(@"Examples/UIExplorer/UIExplorerApp.ios"); // If tests have changes, set recordMode = YES below and run the affected - // tests on an iPhone5, iOS 8.1 simulator. + // tests on an iPhone5, iOS 8.3 simulator. _runner.recordMode = NO; } diff --git a/Libraries/Text/TextStylePropTypes.js b/Libraries/Text/TextStylePropTypes.js index 95a0f4cb8..450d26f33 100644 --- a/Libraries/Text/TextStylePropTypes.js +++ b/Libraries/Text/TextStylePropTypes.js @@ -26,8 +26,9 @@ var TextStylePropTypes = Object.assign(Object.create(ViewStylePropTypes), { lineHeight: ReactPropTypes.number, color: ReactPropTypes.string, containerBackgroundColor: ReactPropTypes.string, + // NOTE: "justify" is supported only on iOS textAlign: ReactPropTypes.oneOf( - ['auto' /*default*/, 'left', 'right', 'center'] + ['auto' /*default*/, 'left', 'right', 'center', 'justify'] ), writingDirection: ReactPropTypes.oneOf( ['auto' /*default*/, 'ltr', 'rtl'] From 3ce8b1a1c819f8508ea1b04bcf97636bf953336a Mon Sep 17 00:00:00 2001 From: Alex Akers Date: Mon, 15 Jun 2015 12:05:04 -0700 Subject: [PATCH 06/16] [React Native] Implement -(recursiveD|d)escription for RCT(Shadow)View --- Libraries/Text/RCTShadowRawText.m | 6 ++++++ Libraries/Text/RCTShadowText.m | 6 ++++++ React/Views/RCTShadowView.m | 28 ++++++++++++++++++++++++++++ React/Views/RCTView.m | 8 ++++++++ 4 files changed, 48 insertions(+) diff --git a/Libraries/Text/RCTShadowRawText.m b/Libraries/Text/RCTShadowRawText.m index 87bfe9fa6..e99e1187b 100644 --- a/Libraries/Text/RCTShadowRawText.m +++ b/Libraries/Text/RCTShadowRawText.m @@ -20,4 +20,10 @@ } } +- (NSString *)description +{ + NSString *superDescription = super.description; + return [[superDescription substringToIndex:superDescription.length - 1] stringByAppendingFormat:@"; text: %@>", self.text]; +} + @end diff --git a/Libraries/Text/RCTShadowText.m b/Libraries/Text/RCTShadowText.m index 2dc275912..65bee774e 100644 --- a/Libraries/Text/RCTShadowText.m +++ b/Libraries/Text/RCTShadowText.m @@ -54,6 +54,12 @@ static css_dim_t RCTMeasure(void *context, float width) return self; } +- (NSString *)description +{ + NSString *superDescription = super.description; + return [[superDescription substringToIndex:superDescription.length - 1] stringByAppendingFormat:@"; text: %@>", [self attributedString].string]; +} + - (NSDictionary *)processUpdatedProperties:(NSMutableSet *)applierBlocks parentProperties:(NSDictionary *)parentProperties { diff --git a/React/Views/RCTShadowView.m b/React/Views/RCTShadowView.m index b9343895f..9d56bb906 100644 --- a/React/Views/RCTShadowView.m +++ b/React/Views/RCTShadowView.m @@ -364,6 +364,34 @@ static void RCTProcessMetaProps(const float metaProps[META_PROP_COUNT], float st return self.reactTag; } +- (NSString *)description +{ + NSString *description = super.description; + description = [[description substringToIndex:description.length - 1] stringByAppendingFormat:@"; viewName: %@; reactTag: %@; frame: %@>", self.viewName, self.reactTag, NSStringFromCGRect(self.frame)]; + return description; +} + +- (void)addRecursiveDescriptionToString:(NSMutableString *)string atLevel:(NSUInteger)level +{ + for (NSUInteger i = 0; i < level; i++) { + [string appendString:@" | "]; + } + + [string appendString:self.description]; + [string appendString:@"\n"]; + + for (RCTShadowView *subview in _reactSubviews) { + [subview addRecursiveDescriptionToString:string atLevel:level + 1]; + } +} + +- (NSString *)recursiveDescription +{ + NSMutableString *description = [NSMutableString string]; + [self addRecursiveDescriptionToString:description atLevel:0]; + return description; +} + // Margin #define RCT_MARGIN_PROPERTY(prop, metaProp) \ diff --git a/React/Views/RCTView.m b/React/Views/RCTView.m index a5cecb7a5..a151efb5c 100644 --- a/React/Views/RCTView.m +++ b/React/Views/RCTView.m @@ -185,6 +185,14 @@ RCT_NOT_IMPLEMENTED(-initWithCoder:unused) } } +- (NSString *)description +{ + NSString *superDescription = super.description; + NSRange semicolonRange = [superDescription rangeOfString:@";"]; + NSString *replacement = [NSString stringWithFormat:@"; reactTag: %@;", self.reactTag]; + return [superDescription stringByReplacingCharactersInRange:semicolonRange withString:replacement]; +} + #pragma mark - Statics for dealing with layoutGuides + (void)autoAdjustInsetsForView:(UIView *)parentView From df8287d8ee382bf69df1d1a4ad126cde29b0cbee Mon Sep 17 00:00:00 2001 From: Shuangzuan Date: Mon, 15 Jun 2015 12:14:23 -0700 Subject: [PATCH 07/16] [PushNotification] Unregister for remote notifications support. Summary: See iOS Developer Library: [- unregisterForRemoteNotifications](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplication_Class/index.html#//apple_ref/occ/instm/UIApplication/unregisterForRemoteNotifications). Unregister for all remote notifications received via Apple Push Notification service. **Discussion** You should call this method in rare circumstances only, such as when a new version of the app removes support for all types of remote notifications. Users can temporarily prevent apps from receiving remote notifications through the Notifications section of the Settings app. Apps unregistered through this method can always re-register. Closes https://github.com/facebook/react-native/pull/1520 Github Author: Shuangzuan Test Plan: Imported from GitHub, without a `Test Plan:` line. --- Libraries/PushNotificationIOS/PushNotificationIOS.js | 12 ++++++++++++ .../PushNotificationIOS/RCTPushNotificationManager.m | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/Libraries/PushNotificationIOS/PushNotificationIOS.js b/Libraries/PushNotificationIOS/PushNotificationIOS.js index adf8ecf5a..1781ddff1 100644 --- a/Libraries/PushNotificationIOS/PushNotificationIOS.js +++ b/Libraries/PushNotificationIOS/PushNotificationIOS.js @@ -121,6 +121,18 @@ class PushNotificationIOS { RCTPushNotificationManager.requestPermissions(requestedPermissions); } + /** + * Unregister for all remote notifications received via Apple Push Notification service. + * + * You should call this method in rare circumstances only, such as when a new version of + * the app removes support for all types of remote notifications. Users can temporarily + * prevent apps from receiving remote notifications through the Notifications section of + * the Settings app. Apps unregistered through this method can always re-register. + */ + static abandonPermissions() { + RCTPushNotificationManager.abandonPermissions(); + } + /** * See what push permissions are currently enabled. `callback` will be * invoked with a `permissions` object: diff --git a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m index 97de4aa07..6a9420819 100644 --- a/Libraries/PushNotificationIOS/RCTPushNotificationManager.m +++ b/Libraries/PushNotificationIOS/RCTPushNotificationManager.m @@ -148,6 +148,11 @@ RCT_EXPORT_METHOD(requestPermissions:(NSDictionary *)permissions) } +RCT_EXPORT_METHOD(abandonPermissions) +{ + [[UIApplication sharedApplication] unregisterForRemoteNotifications]; +} + RCT_EXPORT_METHOD(checkPermissions:(RCTResponseSenderBlock)callback) { NSUInteger types = 0; From 3940b024a03a5e03d5c6724821439f3c6218e1b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=3D=3FUTF-8=3Fq=3F=3DE6=3DAD=3DA3=3DE9=3D9C=3D96=3F=3D?= Date: Mon, 15 Jun 2015 12:16:07 -0700 Subject: [PATCH 08/16] Add velocity and targetContentOffset for scrollEndDrag event in RCTScrollView Summary: In some case, it is very useful to have `velocity` and `targetContentOffset` parameters for `ScrollEndDrag` event. I just added them. Closes https://github.com/facebook/react-native/pull/1500 Github Author: =?UTF-8?q?=E6=AD=A3=E9=9C=96?= Test Plan: Imported from GitHub, without a `Test Plan:` line. --- React/Views/RCTScrollView.m | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/React/Views/RCTScrollView.m b/React/Views/RCTScrollView.m index e3f746fb5..6c3f5d519 100644 --- a/React/Views/RCTScrollView.m +++ b/React/Views/RCTScrollView.m @@ -581,7 +581,17 @@ RCT_SCROLL_EVENT_HANDLER(scrollViewDidZoom, RCTScrollEventTypeMove) - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { - [_eventDispatcher sendScrollEventWithType:RCTScrollEventTypeEnd reactTag:self.reactTag scrollView:scrollView userData:nil]; + NSDictionary *userData = @{ + @"velocity": @{ + @"x": @(velocity.x), + @"y": @(velocity.y) + }, + @"targetContentOffset": @{ + @"x": @(targetContentOffset->x), + @"y": @(targetContentOffset->y) + } + }; + [_eventDispatcher sendScrollEventWithType:RCTScrollEventTypeEnd reactTag:self.reactTag scrollView:scrollView userData:userData]; RCT_FORWARD_SCROLL_EVENT(scrollViewWillEndDragging:scrollView withVelocity:velocity targetContentOffset:targetContentOffset); } From 03f49c8b0fbd075238c69803fed66511efaaf966 Mon Sep 17 00:00:00 2001 From: Prathamesh Sonpatki Date: Mon, 15 Jun 2015 12:17:11 -0700 Subject: [PATCH 09/16] [Docs] Added documentation for onChangeText prop of TextInput Summary: Closes https://github.com/facebook/react-native/pull/1602 Github Author: Prathamesh Sonpatki Test Plan: Imported from GitHub, without a `Test Plan:` line. --- Libraries/Components/TextInput/TextInput.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Libraries/Components/TextInput/TextInput.js b/Libraries/Components/TextInput/TextInput.js index 0b3d8d4e3..00a27e3c1 100644 --- a/Libraries/Components/TextInput/TextInput.js +++ b/Libraries/Components/TextInput/TextInput.js @@ -183,6 +183,10 @@ var TextInput = React.createClass({ * Callback that is called when the text input's text changes. */ onChange: PropTypes.func, + /** + * Callback that is called when the text input's text changes. + * Changed text is passed as an argument to the callback handler. + */ onChangeText: PropTypes.func, /** * Callback that is called when text input ends. From 86dc92d5abdb766a778dce68ff5d24e753fe880f Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 13:05:05 -0700 Subject: [PATCH 10/16] [ReactNative] Add ReactPerf info to profiler timeline Summary: @public Hook into ReactPerf to add markers to `RCTProfile` timeline. Test Plan: {F22569628} --- .../InitializeJavaScriptAppEngine.js | 1 + Libraries/Utilities/BridgeProfiling.js | 25 +++++++++++++++--- React/Base/RCTProfile.m | 26 +++++++++++-------- React/Executors/RCTContextExecutor.m | 4 +++ 4 files changed, 42 insertions(+), 14 deletions(-) diff --git a/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js b/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js index e87f44fca..2896b01ab 100644 --- a/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js +++ b/Libraries/JavaScriptAppEngine/Initialization/InitializeJavaScriptAppEngine.js @@ -123,6 +123,7 @@ function setUpWebSockets() { function setupProfile() { console.profile = console.profile || GLOBAL.consoleProfile || function () {}; console.profileEnd = console.profileEnd || GLOBAL.consoleProfileEnd || function () {}; + require('BridgeProfiling').swizzleReactPerf(); } setUpRedBoxErrorHandler(); diff --git a/Libraries/Utilities/BridgeProfiling.js b/Libraries/Utilities/BridgeProfiling.js index c94d84fdd..02685e01c 100644 --- a/Libraries/Utilities/BridgeProfiling.js +++ b/Libraries/Utilities/BridgeProfiling.js @@ -14,7 +14,7 @@ var GLOBAL = GLOBAL || this; var BridgeProfiling = { - profile(profileName: string, args?: any) { + profile(profileName?: string, args?: any) { if (GLOBAL.__BridgeProfilingIsProfiling) { if (args) { try { @@ -27,11 +27,30 @@ var BridgeProfiling = { } }, - profileEnd() { + profileEnd(profileName?: string) { if (GLOBAL.__BridgeProfilingIsProfiling) { - console.profileEnd(); + console.profileEnd(profileName); } }, + + swizzleReactPerf() { + var ReactPerf = require('ReactPerf'); + var originalMeasure = ReactPerf.measure; + ReactPerf.measure = function (objName, fnName, func) { + func = originalMeasure.call(ReactPerf, objName, fnName, func); + return function (component) { + BridgeProfiling.profile(); + var ret = func.apply(this, arguments); + if (GLOBAL.__BridgeProfilingIsProfiling) { + var name = this._instance && this._instance.constructor && + (this._instance.constructor.displayName || + this._instance.constructor.name); + BridgeProfiling.profileEnd(`${objName}.${fnName}(${name})`); + } + return ret; + }; + }; + }, }; module.exports = BridgeProfiling; diff --git a/React/Base/RCTProfile.m b/React/Base/RCTProfile.m index f03dc9571..a2b3d7106 100644 --- a/React/Base/RCTProfile.m +++ b/React/Base/RCTProfile.m @@ -43,7 +43,7 @@ NSDictionary *RCTProfileInfo; NSUInteger RCTProfileEventID = 0; NSMutableDictionary *RCTProfileOngoingEvents; NSTimeInterval RCTProfileStartTime; -NSLock *_RCTProfileLock; +NSRecursiveLock *_RCTProfileLock; #pragma mark - Macros @@ -123,15 +123,17 @@ static void RCTProfileForwardInvocation(NSObject *self, __unused SEL cmd, NSInvo NSString *name = [NSString stringWithFormat:@"-[%@ %@]", NSStringFromClass([self class]), NSStringFromSelector(invocation.selector)]; SEL newSel = RCTProfileProxySelector(invocation.selector); - if ([object_getClass(self) instancesRespondToSelector:newSel]) { - invocation.selector = newSel; - RCTProfileBeginEvent(); - [invocation invoke]; - RCTProfileEndEvent(name, @"objc_call,modules,auto", nil); - } else { - // Use original selector to don't change error message - [self doesNotRecognizeSelector:invocation.selector]; - } + RCTProfileLock( + if ([object_getClass(self) instancesRespondToSelector:newSel]) { + invocation.selector = newSel; + RCTProfileBeginEvent(); + [invocation invoke]; + RCTProfileEndEvent(name, @"objc_call,modules,auto", nil); + } else { + // Use original selector to don't change error message + [self doesNotRecognizeSelector:invocation.selector]; + } + ); } static IMP RCTProfileMsgForward(NSObject *, SEL); @@ -191,11 +193,13 @@ void RCTProfileUnhookModules(RCTBridge *bridge) { for (id module in bridge.modules.allValues) { [bridge dispatchBlock:^{ + RCTProfileLock( Class proxyClass = object_getClass(module); if (module.class != proxyClass) { object_setClass(module, module.class); objc_disposeClassPair(proxyClass); } + ); } forModule:module]; }; } @@ -217,7 +221,7 @@ void RCTProfileInit(RCTBridge *bridge) static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ - _RCTProfileLock = [[NSLock alloc] init]; + _RCTProfileLock = [[NSRecursiveLock alloc] init]; }); RCTProfileLock( RCTProfileStartTime = CACurrentMediaTime(); diff --git a/React/Executors/RCTContextExecutor.m b/React/Executors/RCTContextExecutor.m index cf178e553..270bc4a93 100644 --- a/React/Executors/RCTContextExecutor.m +++ b/React/Executors/RCTContextExecutor.m @@ -156,6 +156,10 @@ static JSValueRef RCTConsoleProfileEnd(JSContextRef context, __unused JSObjectRe NSString *profileName = [profiles lastObject]; [profiles removeLastObject]; + if (argumentCount > 0 && !JSValueIsUndefined(context, arguments[0])) { + profileName = RCTJSValueToNSString(context, arguments[0]); + } + _RCTProfileEndEvent(profileID, profileName, @"console", profileInfo); return JSValueMakeUndefined(context); From d3065fc2e78bc80af8231c977845f4bb23c987be Mon Sep 17 00:00:00 2001 From: Tadeu Zagallo Date: Mon, 15 Jun 2015 13:01:39 -0700 Subject: [PATCH 11/16] [ReactNative] Remove RCT_IMPORT_METHOD macro and generate lookup table dynamically Summary: @public This removes the last piece of data that was still stored on the DATA section, `RCT_IMPORT_METHOD`. JS calls now dynamically populate a lookup table simultaneously on JS and Native, instead of creating a mapping at load time. Test Plan: Everything still runs, tests are green. --- Libraries/Utilities/MessageQueue.js | 8 +- React/Base/RCTBridge.h | 13 +-- React/Base/RCTBridge.m | 155 +-------------------------- React/Base/RCTEventDispatcher.m | 4 - React/Base/RCTRootView.m | 3 - React/Base/RCTTouchHandler.m | 2 - React/Executors/RCTContextExecutor.m | 2 +- React/Modules/RCTTiming.m | 2 - 8 files changed, 12 insertions(+), 177 deletions(-) diff --git a/Libraries/Utilities/MessageQueue.js b/Libraries/Utilities/MessageQueue.js index 8a56aa714..cac48a8e5 100644 --- a/Libraries/Utilities/MessageQueue.js +++ b/Libraries/Utilities/MessageQueue.js @@ -305,10 +305,12 @@ var MessageQueueMixin = { return guardReturn(this._callFunction, [moduleID, methodID, params], null, this); }, - _callFunction: function(moduleID, methodID, params) { - var moduleName = this._localModuleIDToModuleName[moduleID]; + _callFunction: function(moduleName, methodName, params) { + if (isFinite(moduleName)) { + moduleName = this._localModuleIDToModuleName[moduleName]; + methodName = this._localModuleNameToMethodIDToName[moduleName][methodName]; + } - var methodName = this._localModuleNameToMethodIDToName[moduleName][methodID]; if (DEBUG_SPY_MODE) { console.log( 'N->JS: ' + moduleName + '.' + methodName + diff --git a/React/Base/RCTBridge.h b/React/Base/RCTBridge.h index 5c5cfe49b..35183437d 100644 --- a/React/Base/RCTBridge.h +++ b/React/Base/RCTBridge.h @@ -75,22 +75,15 @@ RCT_EXTERN NSString *RCTBridgeModuleNameForClass(Class bridgeModuleClass); /** * This method is used to call functions in the JavaScript application context. * It is primarily intended for use by modules that require two-way communication - * with the JavaScript code. Method should be registered using the - * RCT_IMPORT_METHOD macro below. Attempting to call a method that has not been - * registered will result in an error. Safe to call from any thread. + * with the JavaScript code. Safe to call from any thread. */ - (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args; /** - * This macro is used to register a JS method to be called via the enqueueJSCall - * bridge method. You should place this macro inside any file that uses the - * imported method. If a method has already been registered by another class, it - * is not necessary to register it again, but it is good practice. Registering - * the same method more than once will not result in an error. + * DEPRECATED: Do not use. */ #define RCT_IMPORT_METHOD(module, method) \ -__attribute__((used, section("__DATA,RCTImport"))) \ -static const char *__rct_import_##module##_##method##__ = #module"."#method; + _Pragma("message(\"This macro is no longer required\")") /** * URL of the script that was loaded into the bridge. diff --git a/React/Base/RCTBridge.m b/React/Base/RCTBridge.m index 818af496b..f8e9eeab7 100644 --- a/React/Base/RCTBridge.m +++ b/React/Base/RCTBridge.m @@ -13,10 +13,6 @@ #import #import -#import -#import - -#import "RCTAssert.h" #import "RCTContextExecutor.h" #import "RCTConvert.h" #import "RCTEventDispatcher.h" @@ -54,16 +50,6 @@ typedef NS_ENUM(NSUInteger, RCTJavaScriptFunctionKind) { RCTJavaScriptFunctionKindAsync, }; -#ifdef __LP64__ -typedef struct mach_header_64 *RCTHeaderValue; -typedef struct section_64 RCTHeaderSection; -#define RCTGetSectByNameFromHeader getsectbynamefromheader_64 -#else -typedef struct mach_header *RCTHeaderValue; -typedef struct section RCTHeaderSection; -#define RCTGetSectByNameFromHeader getsectbynamefromheader -#endif - #define RCTAssertJSThread() \ RCTAssert(![NSStringFromClass([_javaScriptExecutor class]) isEqualToString:@"RCTContextExecutor"] || \ [[[NSThread currentThread] name] isEqualToString:@"com.facebook.React.JavaScript"], \ @@ -114,40 +100,6 @@ NSString *RCTBridgeModuleNameForClass(Class cls) return name; } -/** - * This function scans all classes available at runtime and returns an array - * of all JSMethods registered. - */ -static NSArray *RCTJSMethods(void) -{ - static NSArray *JSMethods; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - NSMutableSet *uniqueMethods = [NSMutableSet set]; - - Dl_info info; - dladdr(&RCTJSMethods, &info); - - const RCTHeaderValue mach_header = (RCTHeaderValue)info.dli_fbase; - unsigned long size = 0; - const uint8_t *sectionData = getsectiondata(mach_header, "__DATA", "RCTImport", &size); - if (sectionData) { - for (const uint8_t *addr = sectionData; - addr < sectionData + size; - addr += sizeof(const char **)) { - - // Get data entry - NSString *entry = @(*(const char **)addr); - [uniqueMethods addObject:entry]; - } - } - - JSMethods = [uniqueMethods allObjects]; - }); - - return JSMethods; -} - // TODO: Can we just replace RCTMakeError with this function instead? static NSDictionary *RCTJSErrorFromNSError(NSError *error) { @@ -596,80 +548,6 @@ static NSDictionary *RCTRemoteModulesConfig(NSDictionary *modulesByName) return moduleConfig; } -/** - * As above, but for local modules/methods, which represent JS classes - * and methods that will be called by the native code via the bridge. - * Structure is essentially the same as for remote modules: - * - * "ModuleName1": { - * "moduleID": 0, - * "methods": { - * "methodName1": { - * "methodID": 0, - * "type": "local" - * }, - * "methodName2": { - * "methodID": 1, - * "type": "local" - * }, - * etc... - * } - * }, - * etc... - */ -static NSMutableDictionary *RCTLocalModuleIDs; -static NSMutableDictionary *RCTLocalMethodIDs; -static NSMutableArray *RCTLocalModuleNames; -static NSMutableArray *RCTLocalMethodNames; -static NSDictionary *RCTLocalModulesConfig() -{ - static NSMutableDictionary *localModules; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - - RCTLocalModuleIDs = [[NSMutableDictionary alloc] init]; - RCTLocalMethodIDs = [[NSMutableDictionary alloc] init]; - RCTLocalModuleNames = [[NSMutableArray alloc] init]; - RCTLocalMethodNames = [[NSMutableArray alloc] init]; - - localModules = [[NSMutableDictionary alloc] init]; - for (NSString *moduleDotMethod in RCTJSMethods()) { - - NSArray *parts = [moduleDotMethod componentsSeparatedByString:@"."]; - RCTAssert(parts.count == 2, @"'%@' is not a valid JS method definition - expected 'Module.method' format.", moduleDotMethod); - - // Add module if it doesn't already exist - NSString *moduleName = parts[0]; - NSDictionary *module = localModules[moduleName]; - if (!module) { - module = @{ - @"moduleID": @(localModules.count), - @"methods": [[NSMutableDictionary alloc] init] - }; - localModules[moduleName] = module; - [RCTLocalModuleNames addObject:moduleName]; - } - - // Add method if it doesn't already exist - NSString *methodName = parts[1]; - NSMutableDictionary *methods = module[@"methods"]; - if (!methods[methodName]) { - methods[methodName] = @{ - @"methodID": @(methods.count), - @"type": @"local" - }; - [RCTLocalMethodNames addObject:methodName]; - } - - // Add module and method lookup - RCTLocalModuleIDs[moduleDotMethod] = module[@"moduleID"]; - RCTLocalMethodIDs[moduleDotMethod] = methods[methodName][@"methodID"]; - } - }); - - return localModules; -} - @interface RCTFrameUpdate (Private) - (instancetype)initWithDisplayLink:(CADisplayLink *)displayLink; @@ -734,12 +612,6 @@ static id _latestJSExecutor; RCTAssertMainThread(); if ((self = [super init])) { - - /** - * Pre register modules - */ - RCTLocalModulesConfig(); - _bundleURL = bundleURL; _moduleProvider = block; _launchOptions = [launchOptions copy]; @@ -1052,7 +924,6 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module // Inject module data into JS context NSString *configJSON = RCTJSONStringify(@{ @"remoteModuleConfig": RCTRemoteModulesConfig(_modulesByName), - @"localModulesConfig": RCTLocalModulesConfig() }, NULL); dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); [_javaScriptExecutor injectJSONText:configJSON @@ -1211,13 +1082,6 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module }]; } -/** - * - TODO (#5906496): When we build a `MessageQueue.m`, handling all the requests could - * cause both a queue of "responses". We would flush them here. However, we - * currently just expect each objc block to handle its own response sending - * using a `RCTResponseSenderBlock`. - */ - #pragma mark - RCTBridge methods /** @@ -1225,16 +1089,11 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module */ - (void)enqueueJSCall:(NSString *)moduleDotMethod args:(NSArray *)args { - NSNumber *moduleID = RCTLocalModuleIDs[moduleDotMethod]; - RCTAssert(moduleID != nil, @"Module '%@' not registered.", - [[moduleDotMethod componentsSeparatedByString:@"."] firstObject]); - - NSNumber *methodID = RCTLocalMethodIDs[moduleDotMethod]; - RCTAssert(methodID != nil, @"Method '%@' not registered.", moduleDotMethod); + NSArray *ids = [moduleDotMethod componentsSeparatedByString:@"."]; [self _invokeAndProcessModule:@"BatchedBridge" method:@"callFunctionReturnFlushedQueue" - arguments:@[moduleID ?: @0, methodID ?: @0, args ?: @[]] + arguments:@[ids[0], ids[1], args ?: @[]] context:RCTGetExecutorID(_javaScriptExecutor)]; } @@ -1245,18 +1104,10 @@ RCT_INNER_BRIDGE_ONLY(_invokeAndProcessModule:(__unused NSString *)module { RCTAssertJSThread(); - NSString *moduleDotMethod = @"JSTimersExecution.callTimers"; - NSNumber *moduleID = RCTLocalModuleIDs[moduleDotMethod]; - RCTAssert(moduleID != nil, @"Module '%@' not registered.", - [[moduleDotMethod componentsSeparatedByString:@"."] firstObject]); - - NSNumber *methodID = RCTLocalMethodIDs[moduleDotMethod]; - RCTAssert(methodID != nil, @"Method '%@' not registered.", moduleDotMethod); - dispatch_block_t block = ^{ [self _actuallyInvokeAndProcessModule:@"BatchedBridge" method:@"callFunctionReturnFlushedQueue" - arguments:@[moduleID, methodID, @[@[timer]]] + arguments:@[@"JSTimersExecution", @"callTimers", @[@[timer]]] context:RCTGetExecutorID(_javaScriptExecutor)]; }; diff --git a/React/Base/RCTEventDispatcher.m b/React/Base/RCTEventDispatcher.m index 8a553c7a2..ac0d1097b 100644 --- a/React/Base/RCTEventDispatcher.m +++ b/React/Base/RCTEventDispatcher.m @@ -89,10 +89,6 @@ RCT_EXPORT_MODULE() return self; } -RCT_IMPORT_METHOD(RCTNativeAppEventEmitter, emit); -RCT_IMPORT_METHOD(RCTDeviceEventEmitter, emit); -RCT_IMPORT_METHOD(RCTEventEmitter, receiveEvent); - - (void)sendAppEventWithName:(NSString *)name body:(id)body { [_bridge enqueueJSCall:@"RCTNativeAppEventEmitter.emit" diff --git a/React/Base/RCTRootView.m b/React/Base/RCTRootView.m index 16bee5475..094e88840 100644 --- a/React/Base/RCTRootView.m +++ b/React/Base/RCTRootView.m @@ -119,9 +119,6 @@ RCT_NOT_IMPLEMENTED(-initWithCoder:(NSCoder *)aDecoder) return YES; } -RCT_IMPORT_METHOD(AppRegistry, runApplication) -RCT_IMPORT_METHOD(ReactNative, unmountComponentAtNodeAndRemoveContainer) - - (void)setLoadingView:(UIView *)loadingView { _loadingView = loadingView; diff --git a/React/Base/RCTTouchHandler.m b/React/Base/RCTTouchHandler.m index 759f1078d..c7c19ed9b 100644 --- a/React/Base/RCTTouchHandler.m +++ b/React/Base/RCTTouchHandler.m @@ -149,8 +149,6 @@ typedef NS_ENUM(NSInteger, RCTTouchEventType) { reactTouch[@"timestamp"] = @(nativeTouch.timestamp * 1000); // in ms, for JS } -RCT_IMPORT_METHOD(RCTEventEmitter, receiveTouches); - /** * Constructs information about touch events to send across the serialized * boundary. This data should be compliant with W3C `Touch` objects. This data diff --git a/React/Executors/RCTContextExecutor.m b/React/Executors/RCTContextExecutor.m index 270bc4a93..54736613e 100644 --- a/React/Executors/RCTContextExecutor.m +++ b/React/Executors/RCTContextExecutor.m @@ -365,7 +365,7 @@ static NSError *RCTNSErrorFromJSError(JSContextRef context, JSValueRef jsError) JSValueRef moduleJSRef = JSObjectCallAsFunction(contextJSRef, (JSObjectRef)requireJSRef, NULL, 1, (const JSValueRef *)&moduleNameJSRef, &errorJSRef); JSStringRelease(moduleNameJSStringRef); - if (moduleJSRef != NULL && errorJSRef == NULL) { + if (moduleJSRef != NULL && errorJSRef == NULL && !JSValueIsUndefined(contextJSRef, moduleJSRef)) { // get method JSStringRef methodNameJSStringRef = JSStringCreateWithCFString((__bridge CFStringRef)method); diff --git a/React/Modules/RCTTiming.m b/React/Modules/RCTTiming.m index 06cb8b3e9..d6387d1d6 100644 --- a/React/Modules/RCTTiming.m +++ b/React/Modules/RCTTiming.m @@ -74,8 +74,6 @@ RCT_EXPORT_MODULE() -RCT_IMPORT_METHOD(JSTimersExecution, callTimers) - - (instancetype)init { if ((self = [super init])) { From e2fc7d23628ab8162ae02e35a434dabb13b18968 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Mon, 15 Jun 2015 13:27:20 -0700 Subject: [PATCH 12/16] Sort StyleProps alphabetically Summary: Sorting the StyleProps alphabetically makes it easier to scan through the list of available props e.g. in case of typos. Filled out the FB CLA form just now. Related to #1605 Closes https://github.com/facebook/react-native/pull/1607 Github Author: Jan Monschke Test Plan: Imported from GitHub, without a `Test Plan:` line. --- Libraries/StyleSheet/StyleSheetValidation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Libraries/StyleSheet/StyleSheetValidation.js b/Libraries/StyleSheet/StyleSheetValidation.js index c4875222d..be59b2ec5 100644 --- a/Libraries/StyleSheet/StyleSheetValidation.js +++ b/Libraries/StyleSheet/StyleSheetValidation.js @@ -26,7 +26,7 @@ class StyleSheetValidation { if (allStylePropTypes[prop] === undefined) { var message1 = '"' + prop + '" is not a valid style property.'; var message2 = '\nValid style props: ' + - JSON.stringify(Object.keys(allStylePropTypes), null, ' '); + JSON.stringify(Object.keys(allStylePropTypes).sort(), null, ' '); styleError(message1, style, caller, message2); } var error = allStylePropTypes[prop]( From 3393b8653425ae797d4f5a5f25ad339e6fa8181a Mon Sep 17 00:00:00 2001 From: James Ide Date: Mon, 15 Jun 2015 13:29:02 -0700 Subject: [PATCH 13/16] [ListView] Update curRenderedRowsCount when data source changes Summary: When a new data source is provided, update `curRenderedRowsCount` in addition to `prevRenderedRowsCount`. What was happening is that I had an empty data source, so `curRenderedRowsCount` and `prevRenderedRowsCount` both settled at zero after the first few frames and `curRenderedRowsCount` wasn't getting increased when the data source was updated. I also changed the `setState` calls to use the transactional API since several of the new state values are computed from the old ones. Maybe fixes #1547 Closes https://github.com/facebook/react-native/pull/1612 Github Author: James Ide Test Plan: Imported from GitHub, without a `Test Plan:` line. --- .../CustomComponents/ListView/ListView.js | 40 +++++++++++-------- 1 file changed, 24 insertions(+), 16 deletions(-) diff --git a/Libraries/CustomComponents/ListView/ListView.js b/Libraries/CustomComponents/ListView/ListView.js index 717f03847..857f476c1 100644 --- a/Libraries/CustomComponents/ListView/ListView.js +++ b/Libraries/CustomComponents/ListView/ListView.js @@ -262,7 +262,16 @@ var ListView = React.createClass({ componentWillReceiveProps: function(nextProps) { if (this.props.dataSource !== nextProps.dataSource) { - this.setState({prevRenderedRowsCount: 0}); + this.setState((state, props) => { + var rowsToRender = Math.min( + state.curRenderedRowsCount + props.pageSize, + props.dataSource.getRowCount() + ); + return { + prevRenderedRowsCount: 0, + curRenderedRowsCount: rowsToRender, + }; + }); } }, @@ -412,22 +421,21 @@ var ListView = React.createClass({ }, _pageInNewRows: function() { - var rowsToRender = Math.min( - this.state.curRenderedRowsCount + this.props.pageSize, - this.props.dataSource.getRowCount() - ); - this.setState( - { - prevRenderedRowsCount: this.state.curRenderedRowsCount, + this.setState((state, props) => { + var rowsToRender = Math.min( + state.curRenderedRowsCount + props.pageSize, + props.dataSource.getRowCount() + ); + return { + prevRenderedRowsCount: state.curRenderedRowsCount, curRenderedRowsCount: rowsToRender - }, - () => { - this._measureAndUpdateScrollProps(); - this.setState({ - prevRenderedRowsCount: this.state.curRenderedRowsCount, - }); - } - ); + }; + }, () => { + this._measureAndUpdateScrollProps(); + this.setState(state => ({ + prevRenderedRowsCount: state.curRenderedRowsCount, + })); + }); }, _getDistanceFromEnd: function(scrollProperties) { From 9218c0bfb74fb86133c73f691fb28714d5652817 Mon Sep 17 00:00:00 2001 From: James Ide Date: Mon, 15 Jun 2015 14:39:48 -0700 Subject: [PATCH 14/16] Update version in package.json to 0.6.0 Summary: The version in master should at least match the latest rc's version. Closes https://github.com/facebook/react-native/pull/1599 Github Author: James Ide Test Plan: Imported from GitHub, without a `Test Plan:` line. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 08db6d6c1..606c9bf59 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native", - "version": "0.4.4", + "version": "0.6.0", "description": "A framework for building native apps using React", "license": "BSD-3-Clause", "repository": { From 1d030ae64e14465f35e5baeb9d0649aa77dbda0f Mon Sep 17 00:00:00 2001 From: James Ide Date: Mon, 15 Jun 2015 14:17:27 -0700 Subject: [PATCH 15/16] [Docs] Clarify in the AsyncStorage docs that it is global to the app, not OS Summary: There was some confusion over whether AsyncStorage is shared across the entire OS (definitely not); clearing that up. Closes https://github.com/facebook/react-native/pull/1596 Github Author: James Ide Test Plan: Imported from GitHub, without a `Test Plan:` line. --- Libraries/Storage/AsyncStorage.ios.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Libraries/Storage/AsyncStorage.ios.js b/Libraries/Storage/AsyncStorage.ios.js index fe92f5c58..ed028db4b 100644 --- a/Libraries/Storage/AsyncStorage.ios.js +++ b/Libraries/Storage/AsyncStorage.ios.js @@ -19,14 +19,14 @@ var RCTAsyncRocksDBStorage = NativeModules.AsyncRocksDBStorage; var RCTAsyncStorage = RCTAsyncRocksDBStorage || RCTAsyncLocalStorage; /** - * AsyncStorage is a simple, asynchronous, persistent, global, key-value storage - * system. It should be used instead of LocalStorage. + * AsyncStorage is a simple, asynchronous, persistent, key-value storage + * system that is global to the app. It should be used instead of LocalStorage. * * It is recommended that you use an abstraction on top of AsyncStorage instead * of AsyncStorage directly for anything more than light usage since it * operates globally. * - * This JS code is a simple facad over the native iOS implementation to provide + * This JS code is a simple facade over the native iOS implementation to provide * a clear JS API, real Error objects, and simple non-multi functions. Each * method returns a `Promise` object. */ @@ -133,7 +133,7 @@ var AsyncStorage = { }, /** - * Gets *all* keys known to the system, for all callers, libraries, etc. Returns a `Promise` object. + * Gets *all* keys known to the app, for all callers, libraries, etc. Returns a `Promise` object. */ getAllKeys: function(callback?: ?(error: ?Error, keys: ?Array) => void): Promise { return new Promise((resolve, reject) => { From bd081d84a7627a98eff10314652ead65a665c98d Mon Sep 17 00:00:00 2001 From: Alex Akers Date: Tue, 16 Jun 2015 02:51:29 -0700 Subject: [PATCH 16/16] [React Native] Update operating system and architecture check --- .../UIExplorerIntegrationTests/IntegrationTestsTests.m | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Examples/UIExplorer/UIExplorerIntegrationTests/IntegrationTestsTests.m b/Examples/UIExplorer/UIExplorerIntegrationTests/IntegrationTestsTests.m index ddd204f99..9783fca38 100644 --- a/Examples/UIExplorer/UIExplorerIntegrationTests/IntegrationTestsTests.m +++ b/Examples/UIExplorer/UIExplorerIntegrationTests/IntegrationTestsTests.m @@ -25,11 +25,12 @@ - (void)setUp { -#ifdef __LP64__ - RCTAssert(!__LP64__, @"Tests should be run on 32-bit device simulators (e.g. iPhone 5)"); +#if __LP64__ + #error Tests should be run on 32-bit device simulators (e.g. iPhone 5) #endif - NSString *version = [[UIDevice currentDevice] systemVersion]; - RCTAssert([version integerValue] == 8, @"Tests should be run on iOS 8.x, found %@", version); + + NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion]; + RCTAssert(version.majorVersion == 8 || version.minorVersion == 3, @"Tests should be run on iOS 8.3, found %zd.%zd.%zd", version.majorVersion, version.minorVersion, version.patchVersion); _runner = RCTInitRunnerForApp(@"Examples/UIExplorer/UIExplorerIntegrationTests/js/IntegrationTestsApp"); // If tests have changes, set recordMode = YES below and run the affected