mirror of
https://github.com/status-im/react-native.git
synced 2025-01-09 17:15:54 +00:00
e7c6a4c038
Summary: React Native uses JSON to marshal the data across the bridge. And because of this we have to avoid using NaN and INF values in events and other pieces of data that suppose to be transfered to/from JS side. (We also don't want to introduce additional wrapping/escaping semantics for perfomance reasons.) So, we have to gate all particular cases where there is a possibility of NaN or INF values, and replace these value with something meaningful for each particular case. We are using `0` as NaN substitution here because: * NaN in touch event is super rare case; * Conversion to `0` is fast; * `0` is okay value for product code in most cases; * In all cases `0` is decent analog to "undefined position on screen" for touch event; * Nobody will explicitly handle NaN case in product code, just because it is super rare case and actually indicates that something else went wrong. Reviewed By: javache Differential Revision: D4918669 fbshipit-source-id: e95fa29e59dcdc40b57519e307b74c1f293da188
138 lines
5.9 KiB
Objective-C
138 lines
5.9 KiB
Objective-C
/**
|
|
* 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.
|
|
*/
|
|
|
|
#import <tgmath.h>
|
|
|
|
#import <CoreGraphics/CoreGraphics.h>
|
|
#import <Foundation/Foundation.h>
|
|
#import <UIKit/UIKit.h>
|
|
|
|
#import <React/RCTAssert.h>
|
|
#import <React/RCTDefines.h>
|
|
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
|
|
// JSON serialization/deserialization
|
|
RCT_EXTERN NSString *__nullable RCTJSONStringify(id __nullable jsonObject, NSError **error);
|
|
RCT_EXTERN id __nullable RCTJSONParse(NSString *__nullable jsonString, NSError **error);
|
|
RCT_EXTERN id __nullable RCTJSONParseMutable(NSString *__nullable jsonString, NSError **error);
|
|
|
|
// Sanitize a JSON object by stripping invalid types and/or NaN values
|
|
RCT_EXTERN id RCTJSONClean(id object);
|
|
|
|
// Get MD5 hash of a string
|
|
RCT_EXTERN NSString *RCTMD5Hash(NSString *string);
|
|
|
|
// Check if we are currently on the main queue (not to be confused with
|
|
// the main thread, which is not neccesarily the same thing)
|
|
// https://twitter.com/olebegemann/status/738656134731599872
|
|
RCT_EXTERN BOOL RCTIsMainQueue(void);
|
|
|
|
// Execute the specified block on the main queue. Unlike dispatch_async()
|
|
// this will execute immediately if we're already on the main queue.
|
|
RCT_EXTERN void RCTExecuteOnMainQueue(dispatch_block_t block);
|
|
|
|
// Legacy function to execute the specified block on the main queue synchronously.
|
|
// Please do not use this unless you know what you're doing.
|
|
RCT_EXTERN void RCTUnsafeExecuteOnMainQueueSync(dispatch_block_t block);
|
|
|
|
// Get screen metrics in a thread-safe way
|
|
RCT_EXTERN CGFloat RCTScreenScale(void);
|
|
RCT_EXTERN CGSize RCTScreenSize(void);
|
|
|
|
// Round float coordinates to nearest whole screen pixel (not point)
|
|
RCT_EXTERN CGFloat RCTRoundPixelValue(CGFloat value);
|
|
RCT_EXTERN CGFloat RCTCeilPixelValue(CGFloat value);
|
|
RCT_EXTERN CGFloat RCTFloorPixelValue(CGFloat value);
|
|
|
|
// Convert a size in points to pixels, rounded up to the nearest integral size
|
|
RCT_EXTERN CGSize RCTSizeInPixels(CGSize pointSize, CGFloat scale);
|
|
|
|
// Method swizzling
|
|
RCT_EXTERN void RCTSwapClassMethods(Class cls, SEL original, SEL replacement);
|
|
RCT_EXTERN void RCTSwapInstanceMethods(Class cls, SEL original, SEL replacement);
|
|
|
|
// Module subclass support
|
|
RCT_EXTERN BOOL RCTClassOverridesClassMethod(Class cls, SEL selector);
|
|
RCT_EXTERN BOOL RCTClassOverridesInstanceMethod(Class cls, SEL selector);
|
|
|
|
// Creates a standardized error object to return in callbacks
|
|
RCT_EXTERN NSDictionary<NSString *, id> *RCTMakeError(NSString *message, id __nullable toStringify, NSDictionary<NSString *, id> *__nullable extraData);
|
|
RCT_EXTERN NSDictionary<NSString *, id> *RCTMakeAndLogError(NSString *message, id __nullable toStringify, NSDictionary<NSString *, id> *__nullable extraData);
|
|
RCT_EXTERN NSDictionary<NSString *, id> *RCTJSErrorFromNSError(NSError *error);
|
|
RCT_EXTERN NSDictionary<NSString *, id> *RCTJSErrorFromCodeMessageAndNSError(NSString *code, NSString *message, NSError *__nullable error);
|
|
|
|
// The default error code to use as the `code` property for callback error objects
|
|
RCT_EXTERN NSString *const RCTErrorUnspecified;
|
|
|
|
// Returns YES if React is running in a test environment
|
|
RCT_EXTERN BOOL RCTRunningInTestEnvironment(void);
|
|
|
|
// Returns YES if React is running in an iOS App Extension
|
|
RCT_EXTERN BOOL RCTRunningInAppExtension(void);
|
|
|
|
// Returns the shared UIApplication instance, or nil if running in an App Extension
|
|
RCT_EXTERN UIApplication *__nullable RCTSharedApplication(void);
|
|
|
|
// Returns the current main window, useful if you need to access the root view
|
|
// or view controller
|
|
RCT_EXTERN UIWindow *__nullable RCTKeyWindow(void);
|
|
|
|
// Returns the presented view controller, useful if you need
|
|
// e.g. to present a modal view controller or alert over it
|
|
RCT_EXTERN UIViewController *__nullable RCTPresentedViewController(void);
|
|
|
|
// Does this device support force touch (aka 3D Touch)?
|
|
RCT_EXTERN BOOL RCTForceTouchAvailable(void);
|
|
|
|
// Create an NSError in the RCTErrorDomain
|
|
RCT_EXTERN NSError *RCTErrorWithMessage(NSString *message);
|
|
|
|
// Convert nil values to NSNull, and vice-versa
|
|
#define RCTNullIfNil(value) (value ?: (id)kCFNull)
|
|
#define RCTNilIfNull(value) (value == (id)kCFNull ? nil : value)
|
|
|
|
// Convert NaN or infinite values to zero, as these aren't JSON-safe
|
|
RCT_EXTERN double RCTZeroIfNaN(double value);
|
|
|
|
// Returns `0` and log special warning if value is NaN or INF.
|
|
RCT_EXTERN double RCTSanitizeNaNValue(double value, NSString *property);
|
|
|
|
// Convert data to a Base64-encoded data URL
|
|
RCT_EXTERN NSURL *RCTDataURL(NSString *mimeType, NSData *data);
|
|
|
|
// Gzip functionality - compression level in range 0 - 1 (-1 for default)
|
|
RCT_EXTERN NSData *__nullable RCTGzipData(NSData *__nullable data, float level);
|
|
|
|
// Returns the relative path within the main bundle for an absolute URL
|
|
// (or nil, if the URL does not specify a path within the main bundle)
|
|
RCT_EXTERN NSString *__nullable RCTBundlePathForURL(NSURL *__nullable URL);
|
|
|
|
// Determines if a given image URL refers to a local image
|
|
RCT_EXTERN BOOL RCTIsLocalAssetURL(NSURL *__nullable imageURL);
|
|
|
|
// Returns an UIImage for a local image asset. Returns nil if the URL
|
|
// does not correspond to a local asset.
|
|
RCT_EXTERN UIImage *__nullable RCTImageFromLocalAssetURL(NSURL *imageURL);
|
|
|
|
// Creates a new, unique temporary file path with the specified extension
|
|
RCT_EXTERN NSString *__nullable RCTTempFilePath(NSString *__nullable extension, NSError **error);
|
|
|
|
// Converts a CGColor to a hex string
|
|
RCT_EXTERN NSString *RCTColorToHexString(CGColorRef color);
|
|
|
|
// Get standard localized string (if it exists)
|
|
RCT_EXTERN NSString *RCTUIKitLocalizedString(NSString *string);
|
|
|
|
// URL manipulation
|
|
RCT_EXTERN NSString *__nullable RCTGetURLQueryParam(NSURL *__nullable URL, NSString *param);
|
|
RCT_EXTERN NSURL *__nullable RCTURLByReplacingQueryParam(NSURL *__nullable URL, NSString *param, NSString *__nullable value);
|
|
|
|
NS_ASSUME_NONNULL_END
|