From 2bc522926695a3dba8ede65f9df8d8abef4b8e0d Mon Sep 17 00:00:00 2001 From: Vincent Riemer Date: Mon, 11 Dec 2023 13:01:53 -0800 Subject: [PATCH] Clean up eventTarget retaining logic in the pointer event processor (#41471) Summary: Changelog: [Internal] - Clean up eventTarget retaining logic in the pointer event processor This refactors calls to EventTarget::retain/release to occur in the actual methods that require the event target to be retained instead of expecting the caller to manage that which should be more maintainable. Reviewed By: sammy-SC Differential Revision: D51279974 --- .../react/renderer/uimanager/PointerEventsProcessor.cpp | 8 ++------ .../react/renderer/uimanager/UIManagerBinding.cpp | 5 ++++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp index cdb83add952f2a..c24ec473530064 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/PointerEventsProcessor.cpp @@ -12,7 +12,9 @@ namespace facebook::react { static ShadowNode::Shared getShadowNodeFromEventTarget( jsi::Runtime& runtime, const EventTarget& target) { + target.retain(runtime); auto instanceHandle = target.getInstanceHandle(runtime); + target.release(runtime); if (instanceHandle.isObject()) { auto handleObj = instanceHandle.asObject(runtime); if (handleObj.hasProperty(runtime, "stateNode")) { @@ -230,13 +232,11 @@ void PointerEventsProcessor::interceptPointerEvent( } } - eventTarget->retain(runtime); auto shadowNode = getShadowNodeFromEventTarget(runtime, *eventTarget); if (shadowNode != nullptr && shouldEmitPointerEvent(*shadowNode, type, uiManager)) { eventDispatcher(runtime, eventTarget, type, priority, pointerEvent); } - eventTarget->release(runtime); // Implicit pointer capture release if (overrideTarget != nullptr && @@ -354,7 +354,6 @@ void PointerEventsProcessor::processPendingPointerCapture( if (hasActiveOverride && activeOverrideTag != pendingOverrideTag) { auto retargeted = retargetPointerEvent(event, *activeOverride, uiManager); - retargeted.target->retain(runtime); auto shadowNode = getShadowNodeFromEventTarget(runtime, *retargeted.target); if (shadowNode != nullptr && shouldEmitPointerEvent( @@ -366,13 +365,11 @@ void PointerEventsProcessor::processPendingPointerCapture( ReactEventPriority::Discrete, retargeted.event); } - retargeted.target->release(runtime); } if (hasPendingOverride && activeOverrideTag != pendingOverrideTag) { auto retargeted = retargetPointerEvent(event, *pendingOverride, uiManager); - retargeted.target->retain(runtime); auto shadowNode = getShadowNodeFromEventTarget(runtime, *retargeted.target); if (shadowNode != nullptr && shouldEmitPointerEvent( @@ -384,7 +381,6 @@ void PointerEventsProcessor::processPendingPointerCapture( ReactEventPriority::Discrete, retargeted.event); } - retargeted.target->release(runtime); } if (!hasPendingOverride) { diff --git a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp index 739729f2d8fe6b..970b90c48cc98f 100644 --- a/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp +++ b/packages/react-native/ReactCommon/react/renderer/uimanager/UIManagerBinding.cpp @@ -97,7 +97,8 @@ void UIManagerBinding::dispatchEvent( const EventPayload& eventPayload) const { SystraceSection s("UIManagerBinding::dispatchEvent", "type", type); - if (eventPayload.getType() == EventPayloadType::PointerEvent) { + if (eventTarget != nullptr && + eventPayload.getType() == EventPayloadType::PointerEvent) { auto pointerEvent = static_cast(eventPayload); auto dispatchCallback = [this]( jsi::Runtime& runtime, @@ -105,8 +106,10 @@ void UIManagerBinding::dispatchEvent( const std::string& type, ReactEventPriority priority, const EventPayload& eventPayload) { + eventTarget->retain(runtime); this->dispatchEventToJS( runtime, eventTarget, type, priority, eventPayload); + eventTarget->release(runtime); }; pointerEventsProcessor_.interceptPointerEvent( runtime,