mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
6b783b4fb0
Summary: This diff switches the exception manager over to the reportException native module function on iOS and adds a new field `extraData.showRedbox` as a temporary hack to control hiding/showing native redboxes for LogBox. Once LogBox is rolled out we'll remove this field, so we're hacking it into the available unused and untyped extraData bag, which will simplify gutting it in the future. Changelog: [Internal] Reviewed By: motiz88 Differential Revision: D18212047 fbshipit-source-id: f14e31d90359b7d455a73c2368ce010c28364a5c
108 lines
2.7 KiB
JavaScript
108 lines
2.7 KiB
JavaScript
/**
|
|
* 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.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
import type {TurboModule} from '../TurboModule/RCTExport';
|
|
import * as TurboModuleRegistry from '../TurboModule/TurboModuleRegistry';
|
|
|
|
export type StackFrame = {|
|
|
column: ?number,
|
|
file: ?string,
|
|
lineNumber: ?number,
|
|
methodName: string,
|
|
collapse?: boolean,
|
|
|};
|
|
|
|
export type ExceptionData = {
|
|
message: string,
|
|
originalMessage: ?string,
|
|
name: ?string,
|
|
componentStack: ?string,
|
|
stack: Array<StackFrame>,
|
|
id: number,
|
|
isFatal: boolean,
|
|
// flowlint-next-line unclear-type:off
|
|
extraData?: Object,
|
|
};
|
|
|
|
export interface Spec extends TurboModule {
|
|
// Deprecated: Use `reportException`
|
|
+reportFatalException: (
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) => void;
|
|
// Deprecated: Use `reportException`
|
|
+reportSoftException: (
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) => void;
|
|
// TODO(T53311281): This is a noop on iOS now. Implement it.
|
|
+reportException?: (data: ExceptionData) => void;
|
|
+updateExceptionMessage: (
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) => void;
|
|
// TODO(T53311281): This is a noop on iOS now. Implement it.
|
|
+dismissRedbox?: () => void;
|
|
}
|
|
|
|
const Platform = require('../Utilities/Platform');
|
|
|
|
const NativeModule = TurboModuleRegistry.getEnforcing<Spec>(
|
|
'ExceptionsManager',
|
|
);
|
|
|
|
const ExceptionsManager = {
|
|
reportFatalException(
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) {
|
|
NativeModule.reportFatalException(message, stack, exceptionId);
|
|
},
|
|
reportSoftException(
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) {
|
|
NativeModule.reportSoftException(message, stack, exceptionId);
|
|
},
|
|
updateExceptionMessage(
|
|
message: string,
|
|
stack: Array<StackFrame>,
|
|
exceptionId: number,
|
|
) {
|
|
NativeModule.updateExceptionMessage(message, stack, exceptionId);
|
|
},
|
|
dismissRedbox(): void {
|
|
if (Platform.OS !== 'ios' && NativeModule.dismissRedbox) {
|
|
// TODO(T53311281): This is a noop on iOS now. Implement it.
|
|
NativeModule.dismissRedbox();
|
|
}
|
|
},
|
|
reportException(data: ExceptionData): void {
|
|
if (NativeModule.reportException) {
|
|
NativeModule.reportException(data);
|
|
return;
|
|
}
|
|
if (data.isFatal) {
|
|
ExceptionsManager.reportFatalException(data.message, data.stack, data.id);
|
|
} else {
|
|
ExceptionsManager.reportSoftException(data.message, data.stack, data.id);
|
|
}
|
|
},
|
|
};
|
|
|
|
export default ExceptionsManager;
|