Fix display: contents
nodes not being cloned with the wrong owner (#1826)
Summary: X-link: https://github.com/facebook/react-native/pull/52530 This PR fixes two issues with `display: contents` implementation: 1. When a node with `display: contents` set is a leaf, it won't be cloned after the initial tree is built. The added test case covers this scenario. 2. It was possible for the subtree of `display: contents` nodes not to be cloned during layout. I don't have a minimal reproduction for this one, unfortunately. It was discovered in the Expensify app: https://github.com/Expensify/App/issues/65268, along with a consistent reproduction. In that specific case, it seems to be heavily tied to `react-native-onyx`, which is a state management library. Changelog: [GENERAL][FIXED] - Fixed nodes with `display: contents` set being cloned with the wrong owner Pull Request resolved: https://github.com/facebook/yoga/pull/1826 Reviewed By: adityasharat, NickGerleman Differential Revision: D78084270 Pulled By: j-piasecki fbshipit-source-id: eb81f6d7dcd1665974d07261ba693e2abea239bb
This commit is contained in:
committed by
Facebook GitHub Bot
parent
73980a3cf8
commit
c7c85621fc
@@ -181,4 +181,34 @@ TEST_F(
|
||||
EXPECT_EQ(nodesCloned[0], a.get());
|
||||
}
|
||||
|
||||
TEST_F(YGPersistentNodeCloningTest, clone_leaf_display_contents_node) {
|
||||
// <View id="A">
|
||||
// <View id="B" style={{ display: 'contents' }} />
|
||||
// </View>
|
||||
|
||||
auto b = std::make_shared<NodeWrapper>(config);
|
||||
auto a = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
YGNodeStyleSetDisplay(b->node, YGDisplayContents);
|
||||
|
||||
// We don't expect any cloning during the first layout
|
||||
onClone = [](...) { FAIL(); };
|
||||
|
||||
YGNodeCalculateLayout(a->node, YGUndefined, YGUndefined, YGDirectionLTR);
|
||||
|
||||
auto aPrime = std::make_shared<NodeWrapper>(config, std::vector{b});
|
||||
|
||||
std::vector<NodeWrapper*> nodesCloned;
|
||||
// We should clone "C"
|
||||
onClone = [&](YGNodeConstRef oldNode,
|
||||
YGNodeConstRef /*owner*/,
|
||||
size_t /*childIndex*/) {
|
||||
nodesCloned.push_back(static_cast<NodeWrapper*>(YGNodeGetContext(oldNode)));
|
||||
};
|
||||
|
||||
YGNodeCalculateLayout(aPrime->node, 100, 100, YGDirectionLTR);
|
||||
|
||||
EXPECT_EQ(nodesCloned.size(), 1);
|
||||
EXPECT_EQ(nodesCloned[0], b.get());
|
||||
}
|
||||
|
||||
} // namespace facebook::yoga
|
||||
|
Reference in New Issue
Block a user