From 030ca3c54301bd35c8060dc386fa5f76eb16fcef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Tue, 29 Apr 2025 10:13:09 -0700 Subject: [PATCH] Fix bug when dispatching unique and non-unique events of the same type on the same target (#50988) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/50988 Changelog: [internal] This fixes a potential bug where we coalesce unique events with non-unique ones of the same type and target. Not marked as a bug fix in the changelog because this wouldn't happen in practice, as we always dispatch events of a given type the same way (all unique or all non-unique). Reviewed By: sammy-SC, javache Differential Revision: D73849222 fbshipit-source-id: 6f387d63b3a68dccc81c110287d42e15e31c181e --- .../src/__tests__/Fantom-itest.js | 17 ++++++++++++----- .../ScrollView/__tests__/ScrollView-itest.js | 17 ++++++++++++----- .../react/renderer/core/EventQueue.cpp | 2 +- .../core/__tests__/EventDispatching-itest.js | 2 +- 4 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/react-native-fantom/src/__tests__/Fantom-itest.js b/packages/react-native-fantom/src/__tests__/Fantom-itest.js index a30c058464d..d58ebd15043 100644 --- a/packages/react-native-fantom/src/__tests__/Fantom-itest.js +++ b/packages/react-native-fantom/src/__tests__/Fantom-itest.js @@ -497,12 +497,19 @@ describe('Fantom', () => { const element = ensureInstance(ref.current, ReactNativeElement); Fantom.runOnUIThread(() => { - Fantom.enqueueNativeEvent(element, 'scroll', { - contentOffset: { - x: 0, - y: 1, + Fantom.enqueueNativeEvent( + element, + 'scroll', + { + contentOffset: { + x: 0, + y: 1, + }, }, - }); + { + isUnique: true, + }, + ); Fantom.enqueueNativeEvent( element, 'scroll', diff --git a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js index fc14bd8e24d..a052de476c5 100644 --- a/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js +++ b/packages/react-native/Libraries/Components/ScrollView/__tests__/ScrollView-itest.js @@ -83,12 +83,19 @@ describe('onScroll', () => { const element = ensureInstance(scrollViewRef.current, ReactNativeElement); Fantom.runOnUIThread(() => { - Fantom.enqueueNativeEvent(element, 'scroll', { - contentOffset: { - x: 0, - y: 1, + Fantom.enqueueNativeEvent( + element, + 'scroll', + { + contentOffset: { + x: 0, + y: 1, + }, }, - }); + { + isUnique: true, + }, + ); Fantom.enqueueNativeEvent( element, 'scroll', diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp index 45e650b33df..defac2e416e 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventQueue.cpp @@ -35,7 +35,7 @@ void EventQueue::enqueueEvent(RawEvent&& rawEvent) const { for (auto it = eventQueue_.rbegin(); it != eventQueue_.rend(); ++it) { if (it->type == rawEvent.type && - it->eventTarget == rawEvent.eventTarget) { + it->eventTarget == rawEvent.eventTarget && it->isUnique) { repeatedEvent = it; break; } else if (it->eventTarget == rawEvent.eventTarget) { diff --git a/packages/react-native/src/private/renderer/core/__tests__/EventDispatching-itest.js b/packages/react-native/src/private/renderer/core/__tests__/EventDispatching-itest.js index bec84e358fc..bdcaf83bbc0 100644 --- a/packages/react-native/src/private/renderer/core/__tests__/EventDispatching-itest.js +++ b/packages/react-native/src/private/renderer/core/__tests__/EventDispatching-itest.js @@ -483,7 +483,7 @@ describe('Event Dispatching', () => { expect(onPointerMove).toHaveBeenCalledTimes(2); }); - it.skip('are NOT combined with the same type if it is non-unique', () => { + it('are NOT combined with the same type if it is non-unique', () => { const root = Fantom.createRoot(); const ref = React.createRef>();