From 73c4df219a45cd448ed971e847122c9f09524dab Mon Sep 17 00:00:00 2001 From: David Vacca Date: Tue, 19 Jun 2018 14:35:28 -0700 Subject: [PATCH] Avoid loading FabricUIManager from UIManagerModule in setJSResponder method Summary: In D8515300 we used the uiManagerType to call the setJSResponder method in UIImplementation or FabricUIManager. There is a small chance that one of the reactTags received by parameter belongs to a View that is not managed by ReactNative, in that case we could be try to use FabricUIManager from UIManagerModule when Fabric is not running yet, causing a RN crash. The fix consists in keep calling the UIImplementation.setJSResponder() method for any reactTag, and then perform a NOOP if the ReactShadowNode can not be found. Reviewed By: fkgozali Differential Revision: D8518192 fbshipit-source-id: 954fdd5dbed758ef73c16dad7da6b59ed83fe46a --- .../com/facebook/react/uimanager/UIImplementation.java | 8 +++++++- .../com/facebook/react/uimanager/UIManagerModule.java | 9 +-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index c1adee2e6..2baee93ce 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -776,8 +776,14 @@ public class UIImplementation { } public void setJSResponder(int reactTag, boolean blockNativeResponder) { - assertViewExists(reactTag, "setJSResponder"); ReactShadowNode node = mShadowNodeRegistry.getNode(reactTag); + + if (node == null) { + //TODO: this should only happen when using Fabric renderer. This is a temporary approach + //and it will be refactored when fabric supports JS Responder. + return; + } + while (node.isVirtual() || node.isLayoutOnly()) { node = node.getParent(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java index ed98ab9a0..7c03ec96b 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIManagerModule.java @@ -586,14 +586,7 @@ public class UIManagerModule extends ReactContextBaseJavaModule implements @Override @ReactMethod public void setJSResponder(int reactTag, boolean blockNativeResponder) { - //TODO: this is a temporary approach to support ViewManagerCommands in Fabric until - // the dispatchViewManagerCommand() method is supported by Fabric JS API. - int uiManagerType = ViewUtil.getUIManagerType(reactTag); - if (uiManagerType != DEFAULT) { - UIManagerHelper.getUIManager(getReactApplicationContext(), uiManagerType).setJSResponder(reactTag, blockNativeResponder); - } else { - mUIImplementation.setJSResponder(reactTag, blockNativeResponder); - } + mUIImplementation.setJSResponder(reactTag, blockNativeResponder); } @Override