mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
6991e28653
Summary: `NativeExceptionsManager.js` contains the JS spec for this native module. This diff moves the objc code to CoreModules (since it's the only directory that supports TM at the moment) and makes it conform to the spec. NOTE: I will update podfiles after this diff is reviewed, before I land. Adding those generated changes makes it really hard to review. Reviewed By: RSNara Differential Revision: D16812212 fbshipit-source-id: 38b6e9a20ce15e7e9995df34493b37ed7adb2911
109 lines
3.1 KiB
Plaintext
109 lines
3.1 KiB
Plaintext
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
|
|
#import "RCTExceptionsManager.h"
|
|
|
|
#import <FBReactNativeSpec/FBReactNativeSpec.h>
|
|
#import <React/RCTConvert.h>
|
|
#import <React/RCTDefines.h>
|
|
#import <React/RCTLog.h>
|
|
#import <React/RCTRedBox.h>
|
|
#import <React/RCTRootView.h>
|
|
|
|
#import "CoreModulesPlugins.h"
|
|
|
|
@interface RCTExceptionsManager() <NativeExceptionsManagerSpec>
|
|
|
|
@end
|
|
|
|
@implementation RCTExceptionsManager
|
|
|
|
@synthesize bridge = _bridge;
|
|
|
|
RCT_EXPORT_MODULE()
|
|
|
|
- (instancetype)initWithDelegate:(id<RCTExceptionsManagerDelegate>)delegate
|
|
{
|
|
if ((self = [self init])) {
|
|
_delegate = delegate;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(reportSoftException:(NSString *)message
|
|
stack:(NSArray<NSDictionary *> *)stack
|
|
exceptionId:(double)exceptionId)
|
|
{
|
|
[_bridge.redBox showErrorMessage:message withStack:stack];
|
|
|
|
if (_delegate) {
|
|
[_delegate handleSoftJSExceptionWithMessage:message stack:stack exceptionId:[NSNumber numberWithDouble:exceptionId]];
|
|
}
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(reportFatalException:(NSString *)message
|
|
stack:(NSArray<NSDictionary *> *)stack
|
|
exceptionId:(double) exceptionId)
|
|
{
|
|
[_bridge.redBox showErrorMessage:message withStack:stack];
|
|
|
|
if (_delegate) {
|
|
[_delegate handleFatalJSExceptionWithMessage:message stack:stack exceptionId:[NSNumber numberWithDouble:exceptionId]];
|
|
}
|
|
|
|
static NSUInteger reloadRetries = 0;
|
|
if (!RCT_DEBUG && reloadRetries < _maxReloadAttempts) {
|
|
reloadRetries++;
|
|
[_bridge reload];
|
|
} else {
|
|
NSString *description = [@"Unhandled JS Exception: " stringByAppendingString:message];
|
|
NSDictionary *errorInfo = @{ NSLocalizedDescriptionKey: description, RCTJSStackTraceKey: stack };
|
|
RCTFatal([NSError errorWithDomain:RCTErrorDomain code:0 userInfo:errorInfo]);
|
|
}
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(updateExceptionMessage:(NSString *)message
|
|
stack:(NSArray<NSDictionary *> *)stack
|
|
exceptionId:(double)exceptionId)
|
|
{
|
|
[_bridge.redBox updateErrorMessage:message withStack:stack];
|
|
|
|
if (_delegate && [_delegate respondsToSelector:@selector(updateJSExceptionWithMessage:stack:exceptionId:)]) {
|
|
[_delegate updateJSExceptionWithMessage:message stack:stack exceptionId:[NSNumber numberWithDouble:exceptionId]];
|
|
}
|
|
}
|
|
|
|
// Deprecated. Use reportFatalException directly instead.
|
|
RCT_EXPORT_METHOD(reportUnhandledException:(NSString *)message
|
|
stack:(NSArray<NSDictionary *> *)stack)
|
|
{
|
|
[self reportFatalException:message stack:stack exceptionId:-1];
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(dismissRedbox)
|
|
{
|
|
|
|
}
|
|
|
|
RCT_EXPORT_METHOD(reportException:(JS::NativeExceptionsManager::ExceptionData &)data)
|
|
{
|
|
|
|
}
|
|
|
|
- (std::shared_ptr<facebook::react::TurboModule>)getTurboModuleWithJsInvoker:
|
|
(std::shared_ptr<facebook::react::JSCallInvoker>)jsInvoker
|
|
{
|
|
return std::make_shared<facebook::react::NativeExceptionsManagerSpecJSI>(self, jsInvoker);
|
|
}
|
|
|
|
@end
|
|
|
|
Class RCTExceptionsManagerCls(void)
|
|
{
|
|
return RCTExceptionsManager.class;
|
|
}
|