From c70abb393fb1d7410d5a092a331de4919a5ad0ea Mon Sep 17 00:00:00 2001 From: Valentin Shergin Date: Sun, 30 Sep 2018 22:01:51 -0700 Subject: [PATCH] Fabric: Enabling view hierarchy flattening (for component only for now) Summary: This change implements `onLayoutOnly` for regular bare component (*not* for its descendants!) After this view flattening is actually starting working for all platforms. Reviewed By: mdvacca Differential Revision: D9511001 fbshipit-source-id: 3562dd1b7570a064150f100cc2e1bc4220b81290 --- .../fabric/components/view/ViewShadowNode.cpp | 27 +++++++++++++++++++ .../fabric/components/view/ViewShadowNode.h | 15 ++++++++--- .../view/accessibility/AccessibilityProps.h | 2 +- 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/ReactCommon/fabric/components/view/ViewShadowNode.cpp b/ReactCommon/fabric/components/view/ViewShadowNode.cpp index 2beb57c8d71..07636a5276f 100644 --- a/ReactCommon/fabric/components/view/ViewShadowNode.cpp +++ b/ReactCommon/fabric/components/view/ViewShadowNode.cpp @@ -12,5 +12,32 @@ namespace react { const char ViewComponentName[] = "View"; +bool ViewShadowNode::isLayoutOnly() const { +#ifdef ANDROID + // This feature is not properly tested on Android yet. + return false; +#else + const auto &viewProps = *std::static_pointer_cast(props_); + + return + // Event listeners + !viewProps.onLayout && + // Generic Props + viewProps.nativeId.empty() && + // Accessibility Props + !viewProps.accessible && + // Style Props + viewProps.yogaStyle.overflow == YGOverflowVisible && + viewProps.opacity == 1.0 && + !viewProps.backgroundColor && + !viewProps.foregroundColor && + !viewProps.shadowColor && + viewProps.transform == Transform {} && + viewProps.zIndex == 0 && + // Layout Metrics + getLayoutMetrics().borderWidth == EdgeInsets {}; +#endif +} + } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/components/view/ViewShadowNode.h b/ReactCommon/fabric/components/view/ViewShadowNode.h index effac24c4fb..9dedb15aa99 100644 --- a/ReactCommon/fabric/components/view/ViewShadowNode.h +++ b/ReactCommon/fabric/components/view/ViewShadowNode.h @@ -15,12 +15,21 @@ namespace react { extern const char ViewComponentName[]; -using ViewShadowNode = - ConcreteViewShadowNode< +/* + * `ShadowNode` for component. + */ +class ViewShadowNode final: + public ConcreteViewShadowNode< ViewComponentName, ViewProps, ViewEventEmitter - >; + > { + +public: + using ConcreteViewShadowNode::ConcreteViewShadowNode; + + bool isLayoutOnly() const; +}; } // namespace react } // namespace facebook diff --git a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h index f50d4553cbe..5533667a637 100644 --- a/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h +++ b/ReactCommon/fabric/components/view/accessibility/AccessibilityProps.h @@ -29,7 +29,7 @@ public: #pragma mark - Props - const bool accessible {true}; + const bool accessible {false}; const std::vector accessibilityActions {}; const std::string accessibilityLabel {""}; const AccessibilityTraits accessibilityTraits {AccessibilityTraits::None};