From 5c045861b9891cb6b17755cd4888767dbf6fa47b Mon Sep 17 00:00:00 2001 From: Andrei Shikov Date: Wed, 3 Nov 2021 12:07:16 -0700 Subject: [PATCH] Copy touch objects before consuming them in new touch path Summary: Ensures that copy of the native touch objects happens before consuming them. The reverse order seems accidental after refactor, as copying objects doesn't consume them whereas adding to a native array does. This behavior didn't show up during testing in dev environment (only affects CANCEL events), and it seems to be the cause of high-firing crash on production. Changelog: [Internal] Copy touch objects before consuming them in the new touch path. Reviewed By: mdvacca Differential Revision: D32112036 fbshipit-source-id: e9ec47689b7ceb0a40a23bab9f03367c4acb8632 --- .../com/facebook/react/uimanager/events/TouchesHelper.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java index 9b60f6f8030..42610200d5a 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/TouchesHelper.java @@ -158,10 +158,11 @@ public class TouchesHelper { break; } - WritableArray touchesArray = getWritableArray(touches); - WritableArray changedTouchesArray = getWritableArray(/* copyObjects */ true, changedTouches); + for (WritableMap touchData : changedTouches) { + WritableMap eventData = touchData.copy(); + WritableArray changedTouchesArray = getWritableArray(/* copyObjects */ true, changedTouches); + WritableArray touchesArray = getWritableArray(/* copyObjects */ true, touches); - for (WritableMap eventData : changedTouches) { eventData.putArray(CHANGED_TOUCHES_KEY, changedTouchesArray); eventData.putArray(TOUCHES_KEY, touchesArray);