From be4d29cd9a63734449bee0650cbf8fb141482510 Mon Sep 17 00:00:00 2001 From: Gregory Moskaliuk Date: Thu, 29 Oct 2026 22:18:05 +0100 Subject: [PATCH] Keep the ShadowNode vtable compatible after the asLayoutable change #59290 added a virtual asLayoutable() to ShadowNode after completeClone, which moved every later virtual method by one vtable slot. Native code built against older headers (for example a prebuilt Fabric component) then calls the wrong methods: appendChild lands on asLayoutable, and so on. Replace the virtual method with a LayoutableKind trait set by the LayoutableShadowNode constructors. ShadowView checks the trait and uses a static_cast, so it still avoids the dynamic_cast, as asLayoutable() did. Co-Authored-By: Claude Opus 5.5 --- .../react/renderer/core/LayoutableShadowNode.cpp | 8 ++++++-- .../react/renderer/core/LayoutableShadowNode.h | 5 ----- .../ReactCommon/react/renderer/core/ShadowNode.h | 10 ---------- .../react/renderer/core/ShadowNodeTraits.h | 4 ++++ .../react/renderer/mounting/ShadowView.cpp | 13 +++++++++---- .../cxx-api/api-snapshots/ReactAndroidDebugCxx.api | 3 +-- .../api-snapshots/ReactAndroidFrameworksCxx.api | 3 +-- .../api-snapshots/ReactAndroidNewarchCxx.api | 3 +-- .../api-snapshots/ReactAndroidReleaseCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactAppleDebugCxx.api | 3 +-- .../api-snapshots/ReactAppleFrameworksCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactAppleNewarchCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactAppleReleaseCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactCommonDebugCxx.api | 3 +-- .../api-snapshots/ReactCommonFrameworksCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactCommonNewarchCxx.api | 3 +-- .../cxx-api/api-snapshots/ReactCommonReleaseCxx.api | 3 +-- 17 files changed, 31 insertions(+), 45 deletions(-) diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp index 73e685becf39..f7a469f6cb90 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.cpp @@ -23,7 +23,9 @@ LayoutableShadowNode::LayoutableShadowNode( const ShadowNodeFragment& fragment, const ShadowNodeFamily::Shared& family, ShadowNodeTraits traits) - : ShadowNode(fragment, family, traits), layoutMetrics_({}) {} + : ShadowNode(fragment, family, traits), layoutMetrics_({}) { + traits_.set(ShadowNodeTraits::Trait::LayoutableKind); +} LayoutableShadowNode::LayoutableShadowNode( const ShadowNode& sourceShadowNode, @@ -31,7 +33,9 @@ LayoutableShadowNode::LayoutableShadowNode( : ShadowNode(sourceShadowNode, fragment), layoutMetrics_( static_cast(sourceShadowNode) - .layoutMetrics_) {} + .layoutMetrics_) { + traits_.set(ShadowNodeTraits::Trait::LayoutableKind); +} LayoutMetrics LayoutableShadowNode::computeLayoutMetricsFromRoot( const ShadowNodeFamily& descendantNodeFamily, diff --git a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h index 2fdf36483d89..ef5da291ce80 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/LayoutableShadowNode.h @@ -117,11 +117,6 @@ class LayoutableShadowNode : public ShadowNode { */ LayoutMetrics getLayoutMetrics() const; - const LayoutableShadowNode *asLayoutable() const override - { - return this; - } - /* * Returns a transform object that represents transformations that will/should * be applied on top of regular layout metrics by mounting layer. diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h index b21cb21b4f3b..2426c9065fc8 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNode.h @@ -27,7 +27,6 @@ namespace facebook::react { class ComponentDescriptor; -class LayoutableShadowNode; struct ShadowNodeFragment; struct ShadowNodeWrapper; @@ -123,15 +122,6 @@ class ShadowNode : public Sealable, public DebugStringConvertible, public jsi::N */ virtual void completeClone(const ShadowNode & /* sourceShadowNode */, const ShadowNodeFragment & /* fragment */) {} - /** - * Returns this node as a `LayoutableShadowNode`, or `nullptr` if it isn't - * one. Cheaper than a `dynamic_cast`. - */ - virtual const LayoutableShadowNode *asLayoutable() const - { - return nullptr; - } - #pragma mark - Getters ComponentName getComponentName() const; diff --git a/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeTraits.h b/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeTraits.h index 39694f28fa7c..bc7221030265 100644 --- a/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeTraits.h +++ b/packages/react-native/ReactCommon/react/renderer/core/ShadowNodeTraits.h @@ -93,6 +93,10 @@ class ShadowNodeTraits { // **Deprecated**: This trait is deprecated and will be removed in a future // version of React Native. DirtyYogaNode = 1 << 14, + + // Inherits `LayoutableShadowNode`. Set by its constructors, so a node is a + // `LayoutableShadowNode` exactly when it has this trait. + LayoutableKind = 1 << 15, }; /* diff --git a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp index 1f4a7e0aa2a6..7ad93e298353 100644 --- a/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp +++ b/packages/react-native/ReactCommon/react/renderer/mounting/ShadowView.cpp @@ -13,10 +13,15 @@ namespace facebook::react { static LayoutMetrics layoutMetricsFromShadowNode(const ShadowNode& shadowNode) { - auto layoutableShadowNode = shadowNode.asLayoutable(); - return layoutableShadowNode != nullptr - ? layoutableShadowNode->getLayoutMetrics() - : EmptyLayoutMetrics; + // `LayoutableShadowNode`'s constructors set `LayoutableKind`, so the trait + // tells whether the node is one without a `dynamic_cast`. A trait rather + // than a virtual method keeps the `ShadowNode` vtable unchanged for native + // code built against other headers. + if (!shadowNode.getTraits().check(ShadowNodeTraits::Trait::LayoutableKind)) { + return EmptyLayoutMetrics; + } + return static_cast(shadowNode) + .getLayoutMetrics(); } ShadowView::ShadowView(const ShadowNode& shadowNode) diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api index 97a6a1f652cc..ff7ef434d50f 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidDebugCxx.api @@ -1719,7 +1719,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2251,7 +2250,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -2307,6 +2305,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api index e793d6f7de2c..ae79879bd028 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidFrameworksCxx.api @@ -2598,7 +2598,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -3646,7 +3645,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -3702,6 +3700,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api index 05dc03891252..e9f38feb9b2d 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidNewarchCxx.api @@ -1718,7 +1718,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2244,7 +2243,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -2300,6 +2298,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api index 05dc03891252..e9f38feb9b2d 100644 --- a/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAndroidReleaseCxx.api @@ -1718,7 +1718,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2244,7 +2243,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -2300,6 +2298,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api index cb68d6c58bd7..af13970eee6f 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleDebugCxx.api @@ -3983,7 +3983,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4492,7 +4491,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -4548,6 +4546,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api index b05f7665f7da..02cd7d7df31a 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleFrameworksCxx.api @@ -4794,7 +4794,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -5833,7 +5832,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -5889,6 +5887,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api index 497a3a43a3ee..4b7793753f33 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleNewarchCxx.api @@ -3975,7 +3975,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4478,7 +4477,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -4534,6 +4532,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api index 4f7774be13cd..40bc5fc8d58b 100644 --- a/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactAppleReleaseCxx.api @@ -3982,7 +3982,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Float baseline(const facebook::react::LayoutContext& layoutContext, facebook::react::Size size) const; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -4485,7 +4484,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -4541,6 +4539,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api index 507e71d72698..f4ce8c717b26 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonDebugCxx.api @@ -843,7 +843,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1058,7 +1057,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -1114,6 +1112,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api index 2772d8e63b9e..1833cdfd48a7 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonFrameworksCxx.api @@ -1529,7 +1529,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -2239,7 +2238,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -2295,6 +2293,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api index 004abd9081df..284c5da01093 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonNewarchCxx.api @@ -842,7 +842,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1051,7 +1050,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -1107,6 +1105,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None, diff --git a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api index 004abd9081df..284c5da01093 100644 --- a/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api +++ b/scripts/cxx-api/api-snapshots/ReactCommonReleaseCxx.api @@ -842,7 +842,6 @@ class facebook::react::LayoutableShadowNode : public facebook::react::ShadowNode public virtual bool canBeTouchTarget() const; public virtual bool canChildrenBeTouchTarget() const; public virtual bool getIsLayoutClean() const = 0; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const override; public virtual facebook::react::Point getContentOriginOffset(bool includeTransform) const; public virtual facebook::react::Size measure(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; public virtual facebook::react::Size measureContent(const facebook::react::LayoutContext& layoutContext, const facebook::react::LayoutConstraints& layoutConstraints) const; @@ -1051,7 +1050,6 @@ class facebook::react::ShadowNode : public facebook::react::Sealable, public fac public std::shared_ptr cloneMultiple(const std::unordered_set>& familiesToUpdate, const std::function(const facebook::react::ShadowNode& oldShadowNode, const facebook::react::ShadowNodeFragment& fragment)>& callback) const; public std::shared_ptr cloneTree(const facebook::react::ShadowNodeFamily& shadowNodeFamily, const std::function(const facebook::react::ShadowNode& oldShadowNode)>& callback) const; public using AncestorList = std::vector, int>>; - public virtual const facebook::react::LayoutableShadowNode* asLayoutable() const; public virtual void appendChild(const std::shared_ptr& child); public virtual void completeClone(const facebook::react::ShadowNode&, const facebook::react::ShadowNodeFragment&); public virtual void replaceChild(const facebook::react::ShadowNode& oldChild, const std::shared_ptr& newChild, size_t suggestedIndex = std::numeric_limits::max()); @@ -1107,6 +1105,7 @@ enum facebook::react::ShadowNodeTraits::Trait : int32_t { FormsView, Hidden, KeyboardFocusable, + LayoutableKind, LeafYogaNode, MeasurableYogaNode, None,