From 0c234c90a2b831eb0f3e054de17fa26a4cee7934 Mon Sep 17 00:00:00 2001 From: Ram N Date: Wed, 4 Oct 2017 13:48:29 -0700 Subject: [PATCH] Add error customizer for React Native Android Reviewed By: achen1 Differential Revision: D5954205 fbshipit-source-id: 8b92bf1484a037b333a6f0f4aeddd39ffee25361 --- .../devsupport/DevSupportManagerImpl.java | 34 +++++++++++++++++-- .../devsupport/DisabledDevSupportManager.java | 6 ++++ .../interfaces/DevSupportManager.java | 1 + .../interfaces/ErrorCustomizer.java | 22 ++++++++++++ 4 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/ErrorCustomizer.java diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java index df70ef88b..2163a63aa 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DevSupportManagerImpl.java @@ -21,6 +21,7 @@ import android.content.pm.PackageManager; import android.hardware.SensorManager; import android.net.Uri; import android.os.AsyncTask; +import android.util.Pair; import android.widget.Toast; import com.facebook.common.logging.FLog; import com.facebook.debug.holder.PrinterHolder; @@ -44,6 +45,7 @@ import com.facebook.react.devsupport.DevServerHelper.PackagerCommandListener; import com.facebook.react.devsupport.interfaces.DevBundleDownloadListener; import com.facebook.react.devsupport.interfaces.DevOptionHandler; import com.facebook.react.devsupport.interfaces.DevSupportManager; +import com.facebook.react.devsupport.interfaces.ErrorCustomizer; import com.facebook.react.devsupport.interfaces.PackagerStatusCallback; import com.facebook.react.devsupport.interfaces.StackFrame; import com.facebook.react.modules.debug.interfaces.DeveloperSettings; @@ -53,6 +55,7 @@ import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; +import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; @@ -134,6 +137,7 @@ public class DevSupportManagerImpl implements private int mLastErrorCookie = 0; private @Nullable ErrorType mLastErrorType; private @Nullable DevBundleDownloadListener mBundleDownloadListener; + private @Nullable List mErrorCustomizers; private static class JscProfileTask extends AsyncTask { private static final MediaType JSON = @@ -286,6 +290,29 @@ public class DevSupportManagerImpl implements showNewError(message, StackTraceHelper.convertJsStackTrace(details), errorCookie, ErrorType.JS); } + @Override + public void registerErrorCustomizer(ErrorCustomizer errorCustomizer){ + if (mErrorCustomizers == null){ + mErrorCustomizers = new ArrayList<>(); + } + mErrorCustomizers.add(errorCustomizer); + } + + private Pair processErrorCustomizers( + Pair errorInfo) { + if (mErrorCustomizers == null) { + return errorInfo; + } else { + for (ErrorCustomizer errorCustomizer : mErrorCustomizers) { + Pair result = errorCustomizer.customizeErrorInfo(errorInfo); + if (result != null) { + errorInfo = result; + } + } + return errorInfo; + } + } + @Override public void updateJSError( final String message, @@ -304,7 +331,9 @@ public class DevSupportManagerImpl implements return; } StackFrame[] stack = StackTraceHelper.convertJsStackTrace(details); - mRedBoxDialog.setExceptionDetails(message, stack); + Pair errorInfo = + processErrorCustomizers(Pair.create(message, stack)); + mRedBoxDialog.setExceptionDetails(errorInfo.first, errorInfo.second); updateLastErrorInfo(message, stack, errorCookie, ErrorType.JS); // JS errors are reported here after source mapping. if (mRedBoxHandler != null) { @@ -342,7 +371,8 @@ public class DevSupportManagerImpl implements // show the first and most actionable one. return; } - mRedBoxDialog.setExceptionDetails(message, stack); + Pair errorInfo = processErrorCustomizers(Pair.create(message, stack)); + mRedBoxDialog.setExceptionDetails(errorInfo.first, errorInfo.second); updateLastErrorInfo(message, stack, errorCookie, errorType); // Only report native errors here. JS errors are reported // inside {@link #updateJSError} after source mapping. diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java index 4373ebe07..51bc07e8a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/DisabledDevSupportManager.java @@ -9,6 +9,7 @@ package com.facebook.react.devsupport; +import com.facebook.react.devsupport.interfaces.ErrorCustomizer; import javax.annotation.Nullable; import java.io.File; @@ -161,6 +162,11 @@ public class DisabledDevSupportManager implements DevSupportManager { return null; } + @Override + public void registerErrorCustomizer(ErrorCustomizer errorCustomizer) { + + } + @Override public void handleException(Exception e) { mDefaultNativeModuleCallExceptionHandler.handleException(e); diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java index a5fae4b7b..b12027f15 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/DevSupportManager.java @@ -52,4 +52,5 @@ public interface DevSupportManager extends NativeModuleCallExceptionHandler { final File outputFile); @Nullable String getLastErrorTitle(); @Nullable StackFrame[] getLastErrorStack(); + void registerErrorCustomizer(ErrorCustomizer errorCustomizer); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/ErrorCustomizer.java b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/ErrorCustomizer.java new file mode 100644 index 000000000..03f273e97 --- /dev/null +++ b/ReactAndroid/src/main/java/com/facebook/react/devsupport/interfaces/ErrorCustomizer.java @@ -0,0 +1,22 @@ +/** + * 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. + */ +package com.facebook.react.devsupport.interfaces; + +import android.util.Pair; + +/** + * Interface that lets parts of the app process the errors before showing the redbox + */ +public interface ErrorCustomizer { + + /** + * The function that need to be registered using {@link DevSupportManager}.registerErrorCustomizer + * and is called before passing the error to the RedBox. + */ + Pair customizeErrorInfo(Pair errorInfo); +}