From c6aa9f4feb2fc2d1d77a71ea3a1e6be5e5b6deab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rub=C3=A9n=20Norte?= Date: Thu, 29 Aug 2024 12:28:15 -0700 Subject: [PATCH] Add surfaceId to EventTarget (#46254) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/46254 Changelog: [internal] Right now it's very hard to access the surface ID from the target when dispatching events, and we need that to determine if the event we dispatched produced any updates its surface ID. This adds surfaceId to EventTarget so we can access it without an unnecessary large amount of indirection in the current code. This is a dependency for https://github.com/facebook/react-native/pull/46253 / D61939260, split to simplify reviewing. Reviewed By: sammy-SC, rshest Differential Revision: D61939910 fbshipit-source-id: 6dd6bc55fc6d4aa6cf8a535080c14a7a5b573b71 --- .../react/renderer/core/ConcreteComponentDescriptor.h | 3 ++- .../ReactCommon/react/renderer/core/EventTarget.cpp | 9 ++++++++- .../ReactCommon/react/renderer/core/EventTarget.h | 7 ++++++- .../react/renderer/core/tests/EventTargetTests.cpp | 4 +++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h index 3e9aa922776..54056606cbe 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ConcreteComponentDescriptor.h @@ -169,7 +169,8 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { ShadowNodeFamily::Shared createFamily( const ShadowNodeFamilyFragment& fragment) const override { auto eventEmitter = std::make_shared( - std::make_shared(fragment.instanceHandle), + std::make_shared( + fragment.instanceHandle, fragment.surfaceId), eventDispatcher_); return std::make_shared( fragment, std::move(eventEmitter), eventDispatcher_, *this); diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventTarget.cpp b/packages/react-native/ReactCommon/react/renderer/core/EventTarget.cpp index c864960c6f4..83ed43b8653 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventTarget.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/EventTarget.cpp @@ -13,8 +13,11 @@ namespace facebook::react { using Tag = EventTarget::Tag; -EventTarget::EventTarget(InstanceHandle::Shared instanceHandle) +EventTarget::EventTarget( + InstanceHandle::Shared instanceHandle, + SurfaceId surfaceId) : instanceHandle_(std::move(instanceHandle)), + surfaceId_(surfaceId), strongInstanceHandle_(jsi::Value::null()) {} void EventTarget::setEnabled(bool enabled) const { @@ -64,6 +67,10 @@ jsi::Value EventTarget::getInstanceHandle(jsi::Runtime& runtime) const { return jsi::Value(runtime, strongInstanceHandle_); } +SurfaceId EventTarget::getSurfaceId() const { + return surfaceId_; +} + Tag EventTarget::getTag() const { return instanceHandle_->getTag(); } diff --git a/packages/react-native/ReactCommon/react/renderer/core/EventTarget.h b/packages/react-native/ReactCommon/react/renderer/core/EventTarget.h index 1d65d7cd9fa..e08ddcab047 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/EventTarget.h +++ b/packages/react-native/ReactCommon/react/renderer/core/EventTarget.h @@ -34,7 +34,9 @@ class EventTarget { /* * Constructs an EventTarget from a weak instance handler and a tag. */ - explicit EventTarget(InstanceHandle::Shared instanceHandle); + explicit EventTarget( + InstanceHandle::Shared instanceHandle, + SurfaceId surfaceId); /* * Sets the `enabled` flag that allows creating a strong instance handle from @@ -59,6 +61,8 @@ class EventTarget { */ jsi::Value getInstanceHandle(jsi::Runtime& runtime) const; + SurfaceId getSurfaceId() const; + /* * Deprecated. Do not use. */ @@ -66,6 +70,7 @@ class EventTarget { private: const InstanceHandle::Shared instanceHandle_; + const SurfaceId surfaceId_; mutable bool enabled_{false}; // Protected by `EventEmitter::DispatchMutex()`. mutable jsi::Value strongInstanceHandle_; // Protected by `jsi::Runtime &`. mutable size_t retainCount_{0}; // Protected by `jsi::Runtime &`. diff --git a/packages/react-native/ReactCommon/react/renderer/core/tests/EventTargetTests.cpp b/packages/react-native/ReactCommon/react/renderer/core/tests/EventTargetTests.cpp index 2f919870c79..25c7e3ed2a6 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/tests/EventTargetTests.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/tests/EventTargetTests.cpp @@ -21,10 +21,12 @@ TEST(EventTargetTests, getInstanceHandle) { EXPECT_EQ(instanceHandle->getTag(), 1); - auto eventTarget = EventTarget(std::move(instanceHandle)); + auto eventTarget = EventTarget(std::move(instanceHandle), 41); EXPECT_EQ(eventTarget.getTag(), 1); + EXPECT_EQ(eventTarget.getSurfaceId(), 41); + EXPECT_TRUE(eventTarget.getInstanceHandle(*runtime).isNull()); eventTarget.retain(*runtime);