From 142c66f341bb34b0de62a5d026786e8df4fed31d Mon Sep 17 00:00:00 2001 From: Samuel Susla Date: Tue, 28 Jan 2020 09:27:56 -0800 Subject: [PATCH] Create ShadowNodeFamily inside ComponentDescriptor Summary: Changelog: [internal] 1. Creates `ShadowNodeFamily` inside `ComponentDescriptor`. 2. As a side effect of this, we no longer need `ComponentDescriptor::createEventEmitter` so it is removed. This is a step in order to merge `StateCoordinator` into `ShadowNodeFamily` and use it as target for state updates. Reviewed By: shergin Differential Revision: D19514906 fbshipit-source-id: 04ad3c621886be56925acd76f9b35a09d8c5e15a --- .../componentdescriptor/ComponentDescriptor.h | 15 +++--- .../ConcreteComponentDescriptor.h | 18 ++++--- .../core/tests/ComponentDescriptorTest.cpp | 51 +++++++++++++------ .../fabric/element/ComponentBuilder.cpp | 9 ++-- ReactCommon/fabric/mounting/ShadowTree.cpp | 4 +- .../uimanager/ComponentDescriptorRegistry.cpp | 9 ++-- ReactCommon/fabric/uimanager/UIManager.cpp | 9 ++-- 7 files changed, 65 insertions(+), 50 deletions(-) diff --git a/ReactCommon/fabric/core/componentdescriptor/ComponentDescriptor.h b/ReactCommon/fabric/core/componentdescriptor/ComponentDescriptor.h index e1edd533b4d..20e23f43ad5 100644 --- a/ReactCommon/fabric/core/componentdescriptor/ComponentDescriptor.h +++ b/ReactCommon/fabric/core/componentdescriptor/ComponentDescriptor.h @@ -103,14 +103,6 @@ class ComponentDescriptor { const SharedProps &props, const RawProps &rawProps) const = 0; - /* - * Creates a new `EventEmitter` object compatible with particular type of - * shadow nodes. - */ - virtual SharedEventEmitter createEventEmitter( - SharedEventTarget eventTarget, - const Tag &tag) const = 0; - /* * Create an initial State object that represents (and contains) an initial * State's data which can be constructed based on initial Props. @@ -127,6 +119,13 @@ class ComponentDescriptor { const State::Shared &previousState, const StateData::Shared &data) const = 0; + /* + * Creates a shadow node family for particular node. + */ + virtual ShadowNodeFamily::Shared createFamily( + ShadowNodeFamilyFragment const &fragment, + SharedEventTarget eventTarget) const = 0; + protected: EventDispatcher::Weak eventDispatcher_; ContextContainer::Shared contextContainer_; diff --git a/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h b/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h index f66574a97c7..2b6003e887b 100644 --- a/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h +++ b/ReactCommon/fabric/core/componentdescriptor/ConcreteComponentDescriptor.h @@ -118,13 +118,6 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { return ShadowNodeT::Props(rawProps, props); }; - virtual SharedEventEmitter createEventEmitter( - SharedEventTarget eventTarget, - const Tag &tag) const override { - return std::make_shared( - std::move(eventTarget), tag, eventDispatcher_); - } - virtual State::Shared createInitialState( ShadowNodeFragment const &fragment, SurfaceId const surfaceId) const override { @@ -157,6 +150,17 @@ class ConcreteComponentDescriptor : public ComponentDescriptor { *std::static_pointer_cast(previousState)); } + virtual ShadowNodeFamily::Shared createFamily( + ShadowNodeFamilyFragment const &fragment, + SharedEventTarget eventTarget) const override { + auto eventEmitter = std::make_shared( + std::move(eventTarget), fragment.tag, eventDispatcher_); + return std::make_shared( + ShadowNodeFamilyFragment{ + fragment.tag, fragment.surfaceId, eventEmitter}, + *this); + } + protected: virtual void adopt(UnsharedShadowNode shadowNode) const { // Default implementation does nothing. diff --git a/ReactCommon/fabric/core/tests/ComponentDescriptorTest.cpp b/ReactCommon/fabric/core/tests/ComponentDescriptorTest.cpp index a695d558be7..1dfc1878eff 100644 --- a/ReactCommon/fabric/core/tests/ComponentDescriptorTest.cpp +++ b/ReactCommon/fabric/core/tests/ComponentDescriptorTest.cpp @@ -23,9 +23,14 @@ TEST(ComponentDescriptorTest, createShadowNode) { const auto &raw = RawProps(folly::dynamic::object("nativeID", "abc")); SharedProps props = descriptor->cloneProps(nullptr, raw); - auto family = std::make_shared( - ShadowNodeFamilyFragment{9, 1, descriptor->createEventEmitter(0, 9)}, - *descriptor); + + auto family = descriptor->createFamily( + ShadowNodeFamilyFragment{ + /* .tag = */ 9, + /* .surfaceId = */ 1, + /* .eventEmitter = */ nullptr, + }, + nullptr); SharedShadowNode node = descriptor->createShadowNode( ShadowNodeFragment{ @@ -49,9 +54,13 @@ TEST(ComponentDescriptorTest, cloneShadowNode) { const auto &raw = RawProps(folly::dynamic::object("nativeID", "abc")); SharedProps props = descriptor->cloneProps(nullptr, raw); - auto family = std::make_shared( - ShadowNodeFamilyFragment{9, 1, descriptor->createEventEmitter(0, 9)}, - *descriptor); + auto family = descriptor->createFamily( + ShadowNodeFamilyFragment{ + /* .tag = */ 9, + /* .surfaceId = */ 1, + /* .eventEmitter = */ nullptr, + }, + nullptr); SharedShadowNode node = descriptor->createShadowNode( ShadowNodeFragment{ /* .props = */ props, @@ -73,25 +82,37 @@ TEST(ComponentDescriptorTest, appendChild) { const auto &raw = RawProps(folly::dynamic::object("nativeID", "abc")); SharedProps props = descriptor->cloneProps(nullptr, raw); - auto family1 = std::make_shared( - ShadowNodeFamilyFragment{1, 1, descriptor->createEventEmitter(0, 9)}, - *descriptor); + auto family1 = descriptor->createFamily( + ShadowNodeFamilyFragment{ + /* .tag = */ 1, + /* .surfaceId = */ 1, + /* .eventEmitter = */ nullptr, + }, + nullptr); SharedShadowNode node1 = descriptor->createShadowNode( ShadowNodeFragment{ /* .props = */ props, }, family1); - auto family2 = std::make_shared( - ShadowNodeFamilyFragment{2, 1, descriptor->createEventEmitter(0, 2)}, - *descriptor); + auto family2 = descriptor->createFamily( + ShadowNodeFamilyFragment{ + /* .tag = */ 2, + /* .surfaceId = */ 1, + /* .eventEmitter = */ nullptr, + }, + nullptr); SharedShadowNode node2 = descriptor->createShadowNode( ShadowNodeFragment{ /* .props = */ props, }, family2); - auto family3 = std::make_shared( - ShadowNodeFamilyFragment{3, 1, descriptor->createEventEmitter(0, 3)}, - *descriptor); + auto family3 = descriptor->createFamily( + ShadowNodeFamilyFragment{ + /* .tag = */ 3, + /* .surfaceId = */ 1, + /* .eventEmitter = */ nullptr, + }, + nullptr); SharedShadowNode node3 = descriptor->createShadowNode( ShadowNodeFragment{ /* .props = */ props, diff --git a/ReactCommon/fabric/element/ComponentBuilder.cpp b/ReactCommon/fabric/element/ComponentBuilder.cpp index d42d6d40912..7c59f7a63c1 100644 --- a/ReactCommon/fabric/element/ComponentBuilder.cpp +++ b/ReactCommon/fabric/element/ComponentBuilder.cpp @@ -25,13 +25,10 @@ ShadowNode::Shared ComponentBuilder::build( children.push_back(build(childFragment)); } - auto eventEmitter = - componentDescriptor.createEventEmitter(nullptr, elementFragment.tag); - - auto family = std::make_shared( + auto family = componentDescriptor.createFamily( ShadowNodeFamilyFragment{ - elementFragment.tag, elementFragment.surfaceId, eventEmitter}, - componentDescriptor); + elementFragment.tag, elementFragment.surfaceId, nullptr}, + nullptr); auto shadowNode = componentDescriptor.createShadowNode( ShadowNodeFragment{ diff --git a/ReactCommon/fabric/mounting/ShadowTree.cpp b/ReactCommon/fabric/mounting/ShadowTree.cpp index af002b0f628..cdcd6b8a9bf 100644 --- a/ReactCommon/fabric/mounting/ShadowTree.cpp +++ b/ReactCommon/fabric/mounting/ShadowTree.cpp @@ -102,9 +102,9 @@ ShadowTree::ShadowTree( const auto props = std::make_shared( *RootShadowNode::defaultSharedProps(), layoutConstraints, layoutContext); - auto family = std::make_shared( + auto family = rootComponentDescriptor.createFamily( ShadowNodeFamilyFragment{surfaceId, surfaceId, noopEventEmitter}, - rootComponentDescriptor); + nullptr); rootShadowNode_ = std::static_pointer_cast( rootComponentDescriptor.createShadowNode( ShadowNodeFragment{ diff --git a/ReactCommon/fabric/uimanager/ComponentDescriptorRegistry.cpp b/ReactCommon/fabric/uimanager/ComponentDescriptorRegistry.cpp index a935232509e..6faeff8714c 100644 --- a/ReactCommon/fabric/uimanager/ComponentDescriptorRegistry.cpp +++ b/ReactCommon/fabric/uimanager/ComponentDescriptorRegistry.cpp @@ -172,12 +172,9 @@ SharedShadowNode ComponentDescriptorRegistry::createNode( auto unifiedComponentName = componentNameByReactViewName(viewName); auto const &componentDescriptor = this->at(unifiedComponentName); - auto family = std::make_shared( - ShadowNodeFamilyFragment{ - tag, - surfaceId, - componentDescriptor.createEventEmitter(std::move(eventTarget), tag)}, - componentDescriptor); + auto family = componentDescriptor.createFamily( + ShadowNodeFamilyFragment{tag, surfaceId, nullptr}, + std::move(eventTarget)); auto const props = componentDescriptor.cloneProps(nullptr, RawProps(propsDynamic)); auto const state = componentDescriptor.createInitialState( diff --git a/ReactCommon/fabric/uimanager/UIManager.cpp b/ReactCommon/fabric/uimanager/UIManager.cpp index d748ce4b2ee..08fb9ef10e4 100644 --- a/ReactCommon/fabric/uimanager/UIManager.cpp +++ b/ReactCommon/fabric/uimanager/UIManager.cpp @@ -33,12 +33,9 @@ SharedShadowNode UIManager::createNode( auto fallbackDescriptor = componentDescriptorRegistry_->getFallbackComponentDescriptor(); - auto family = std::make_shared( - ShadowNodeFamilyFragment{ - tag, - surfaceId, - componentDescriptor.createEventEmitter(std::move(eventTarget), tag)}, - componentDescriptor); + auto family = componentDescriptor.createFamily( + ShadowNodeFamilyFragment{tag, surfaceId, nullptr}, + std::move(eventTarget)); auto const props = componentDescriptor.cloneProps(nullptr, rawProps); auto const state = componentDescriptor.createInitialState( ShadowNodeFragment{props}, surfaceId);