earlyjs: Implement decoratedExtraDataKey#46932
Conversation
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
f799f1b to
0719464
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
54377f5 to
87fa947
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
1 similar comment
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
87fa947 to
ecdb29a
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
ecdb29a to
2004a4d
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
2004a4d to
e0158b9
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
e0158b9 to
4b5f5cd
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
4b5f5cd to
1b8cef2
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
1b8cef2 to
cb2aebc
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
cb2aebc to
ea1c1ae
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
ea1c1ae to
af41f50
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
af41f50 to
d2e256c
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
d2e256c to
f57cf25
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
f57cf25 to
ce4156a
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
ce4156a to
c24e061
Compare
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
c24e061 to
13723b8
Compare
Summary: For the js error handling pipeline, the javascript data structure looks like [this](https://www.internalfb.com/code/fbsource/[6181b57f4ba3619f58056bcec65382650d6ff59a]/xplat/js/react-native-github/packages/react-native/src/private/specs/modules/NativeExceptionsManager.js?lines=17-35): ``` 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, ... }; ``` So, I made the c++ data structure look similar ``` struct ParsedError { struct StackFrame { std::optional<std::string> file; std::string methodName; std::optional<int> lineNumber; std::optional<int> column; }; std::string message; std::optional<std::string> originalMessage; std::optional<std::string> name; std::optional<std::string> componentStack; std::vector<StackFrame> stack; int id; bool isFatal; jsi::Object extraData; }; ``` Notes: * [parseErrorStack](https://fburl.com/code/e27q9gkc) doesn't actually generate a collapse property on the error object. So, I omitted it from the c++. * ExceptionsManager [always provides an extraData field](https://fburl.com/code/2bvcsxac). So, I made it required. * In C++, I just stored extraData as a jsi::Object. I wanted the freedom to store arbitrary key/value pairs. But, I also didn't want to use folly::dynamic. Changelog: [Internal] Differential Revision: D63929580
Summary: This diff re-implements [js error stack trace parsing](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/parseErrorStack.js#L41-L57) in c++. Details: - I migrated [stacktrace-parser](https://github.com/errwischt/stacktrace-parser/blob/ad379de5e5ac056012bbeb12923cf502aefe4710/src/stack-trace-parser.js#L7) - I migrated [parseHermesStack.js](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/parseHermesStack.js#L82) I also migrated all their tests to c++: - [stacktrace-parser tests](https://github.com/errwischt/stacktrace-parser/blob/ad379de5e5ac056012bbeb12923cf502aefe4710/test/stack-trace-parser.spec.js#L5) - [parseHermesStack tests](https://github.com/facebook/react-native/blob/86cac6836502aaeb5c894bff6427e837c52c09e0/packages/react-native/Libraries/Core/Devtools/__tests__/parseHermesStack-test.js#L16) Changelog: [Internal] Differential Revision: D63659013 Reviewed By: javache, NickGerleman
Summary: Before, the c++ pipeline only supported fatal errors. Now, it supports soft errors! Changelog: [Internal] Differential Revision: D63927090
Summary: Pull Request resolved: facebook#46935 Now, whenever the earlyjs c++ pipeline handles an error, it'll invoke callbacks registered via javascript. ## The API ``` if (global.RN$registerExceptionListener != null) { global.RN$registerExceptionListener( (error: ExtendedExceptionData & {preventDefault: () => mixed}) => { error.preventDefault(); // show logbox }, ); } ``` ## The Future API We want something more aligned with the HTML spec: ``` addEventListener('error', (event) => { event.preventDefault(); // show logbox }); ``` ## Fatals vs soft errors The earlyjs pipeline covers just main bundle execution for now. So, it displays logbox only if there was a soft error. If there was a fatal error, it'll just continue to display redbox as usual. Changelog: [Internal] Differential Revision: D63769385 Reviewed By: javache
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
13723b8 to
bfbc243
Compare
Summary: Pull Request resolved: facebook#46932 In the old error handling pipeline, when the app [assigns an object to error[ExceptionsManager.decoratedExtraDataKey]](https://fburl.com/code/9t9u8rgv) ``` const error = new Error('Some error happened'); // Annotates the error with some custom extra data. error[ExceptionsManager.decoratedExtraDataKey] = {foo: 'bar'}; ExceptionsManager.handleException(error, true); ``` That object [gets forwarded as extraData](https://fburl.com/code/gy7v173u) to ExceptionsManager. This diff implements that functionality within the c++ earlyjs pipeline. Changelog: [Internal] Reviewed By: javache Differential Revision: D63927091
|
This pull request was exported from Phabricator. Differential Revision: D63927091 |
bfbc243 to
a08cc47
Compare
|
This pull request has been merged in 9119c32. |
Summary:
In the old error handling pipeline, when the app assigns an object to error[ExceptionsManager.decoratedExtraDataKey]
That object gets forwarded as extraData to ExceptionsManager.
This diff implements that functionality within the c++ earlyjs pipeline.
Changelog: [Internal]
Reviewed By: javache
Differential Revision: D63927091