Fix bug where we used border box for size of containing block in a certain case (#1486)

Summary:
Pull Request resolved: https://github.com/facebook/yoga/pull/1486

X-link: https://github.com/facebook/react-native/pull/41688

Somehow missed this case. We never want to measure the CB as that gets border box but we want padding box

Reviewed By: NickGerleman

Differential Revision: D51376309

fbshipit-source-id: 2b5119c421ef92fadb28a70254cb7fe02aeb8c28
This commit is contained in:
Joe Vilches
2023-12-07 21:25:45 -08:00
committed by Facebook GitHub Bot
parent d1dda2185e
commit f8d048bb1a
5 changed files with 820 additions and 4 deletions

View File

@@ -4036,3 +4036,264 @@ TEST(YogaTest, static_position_justify_flex_start_position_set_amalgamation) {
YGConfigFree(config);
}
TEST(YogaTest, static_position_no_definite_size_amalgamation) {
const YGConfigRef config = YGConfigNew();
YGConfigSetExperimentalFeatureEnabled(config, YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge, true);
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root_child0, YGEdgeLeft, 4);
YGNodeStyleSetMargin(root_child0, YGEdgeTop, 5);
YGNodeStyleSetMargin(root_child0, YGEdgeRight, 9);
YGNodeStyleSetMargin(root_child0, YGEdgeBottom, 1);
YGNodeStyleSetPadding(root_child0, YGEdgeLeft, 2);
YGNodeStyleSetPadding(root_child0, YGEdgeTop, 9);
YGNodeStyleSetPadding(root_child0, YGEdgeRight, 11);
YGNodeStyleSetPadding(root_child0, YGEdgeBottom, 13);
YGNodeStyleSetBorder(root_child0, YGEdgeLeft, 5);
YGNodeStyleSetBorder(root_child0, YGEdgeTop, 6);
YGNodeStyleSetBorder(root_child0, YGEdgeRight, 7);
YGNodeStyleSetBorder(root_child0, YGEdgeBottom, 8);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root_child0_child0, YGPositionTypeStatic);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeLeft, 8);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeTop, 6);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeRight, 3);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeBottom, 9);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeLeft, 1);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeTop, 7);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeRight, 9);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeBottom, 4);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeLeft, 8);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeTop, 10);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeRight, 2);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeBottom, 1);
YGNodeInsertChild(root_child0, root_child0_child0, 0);
const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root_child0_child0_child0, YGPositionTypeAbsolute);
YGNodeStyleSetPositionPercent(root_child0_child0_child0, YGEdgeLeft, 23);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeLeft, 9);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeTop, 12);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeRight, 4);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeBottom, 7);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeLeft, 5);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeTop, 3);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeRight, 8);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeBottom, 10);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeLeft, 2);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeTop, 1);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeRight, 5);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeBottom, 9);
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
const YGNodeRef root_child0_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeLeft, 9);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeTop, 12);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeRight, 4);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeBottom, 7);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeLeft, 5);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeTop, 3);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeRight, 8);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeBottom, 10);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeLeft, 2);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeTop, 1);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeRight, 5);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeBottom, 9);
YGNodeStyleSetWidth(root_child0_child0_child0_child0, 100);
YGNodeStyleSetHeight(root_child0_child0_child0_child0, 50);
YGNodeInsertChild(root_child0_child0_child0, root_child0_child0_child0_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(69, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(79, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(4, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(56, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(73, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(15, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(21, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(22, YGNodeLayoutGetHeight(root_child0_child0));
ASSERT_FLOAT_EQ(9, YGNodeLayoutGetLeft(root_child0_child0_child0));
ASSERT_FLOAT_EQ(29, YGNodeLayoutGetTop(root_child0_child0_child0));
ASSERT_FLOAT_EQ(133, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(92, YGNodeLayoutGetHeight(root_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(69, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(79, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(4, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(56, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(73, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(15, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(21, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(22, YGNodeLayoutGetHeight(root_child0_child0));
ASSERT_FLOAT_EQ(9, YGNodeLayoutGetLeft(root_child0_child0_child0));
ASSERT_FLOAT_EQ(29, YGNodeLayoutGetTop(root_child0_child0_child0));
ASSERT_FLOAT_EQ(133, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(92, YGNodeLayoutGetHeight(root_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}
TEST(YogaTest, static_position_both_insets_set_amalgamation) {
const YGConfigRef config = YGConfigNew();
YGConfigSetExperimentalFeatureEnabled(config, YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge, true);
const YGNodeRef root = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root, YGPositionTypeAbsolute);
const YGNodeRef root_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root_child0, YGEdgeLeft, 4);
YGNodeStyleSetMargin(root_child0, YGEdgeTop, 5);
YGNodeStyleSetMargin(root_child0, YGEdgeRight, 9);
YGNodeStyleSetMargin(root_child0, YGEdgeBottom, 1);
YGNodeStyleSetPadding(root_child0, YGEdgeLeft, 2);
YGNodeStyleSetPadding(root_child0, YGEdgeTop, 9);
YGNodeStyleSetPadding(root_child0, YGEdgeRight, 11);
YGNodeStyleSetPadding(root_child0, YGEdgeBottom, 13);
YGNodeStyleSetBorder(root_child0, YGEdgeLeft, 5);
YGNodeStyleSetBorder(root_child0, YGEdgeTop, 6);
YGNodeStyleSetBorder(root_child0, YGEdgeRight, 7);
YGNodeStyleSetBorder(root_child0, YGEdgeBottom, 8);
YGNodeInsertChild(root, root_child0, 0);
const YGNodeRef root_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root_child0_child0, YGPositionTypeStatic);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeLeft, 8);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeTop, 6);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeRight, 3);
YGNodeStyleSetMargin(root_child0_child0, YGEdgeBottom, 9);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeLeft, 1);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeTop, 7);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeRight, 9);
YGNodeStyleSetPadding(root_child0_child0, YGEdgeBottom, 4);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeLeft, 8);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeTop, 10);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeRight, 2);
YGNodeStyleSetBorder(root_child0_child0, YGEdgeBottom, 1);
YGNodeInsertChild(root_child0, root_child0_child0, 0);
const YGNodeRef root_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetPositionType(root_child0_child0_child0, YGPositionTypeAbsolute);
YGNodeStyleSetPositionPercent(root_child0_child0_child0, YGEdgeLeft, 23);
YGNodeStyleSetPosition(root_child0_child0_child0, YGEdgeRight, 13);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeLeft, 9);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeTop, 12);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeRight, 4);
YGNodeStyleSetMargin(root_child0_child0_child0, YGEdgeBottom, 7);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeLeft, 5);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeTop, 3);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeRight, 8);
YGNodeStyleSetPadding(root_child0_child0_child0, YGEdgeBottom, 10);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeLeft, 2);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeTop, 1);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeRight, 5);
YGNodeStyleSetBorder(root_child0_child0_child0, YGEdgeBottom, 9);
YGNodeInsertChild(root_child0_child0, root_child0_child0_child0, 0);
const YGNodeRef root_child0_child0_child0_child0 = YGNodeNewWithConfig(config);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeLeft, 9);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeTop, 12);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeRight, 4);
YGNodeStyleSetMargin(root_child0_child0_child0_child0, YGEdgeBottom, 7);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeLeft, 5);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeTop, 3);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeRight, 8);
YGNodeStyleSetPadding(root_child0_child0_child0_child0, YGEdgeBottom, 10);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeLeft, 2);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeTop, 1);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeRight, 5);
YGNodeStyleSetBorder(root_child0_child0_child0_child0, YGEdgeBottom, 9);
YGNodeStyleSetWidth(root_child0_child0_child0_child0, 100);
YGNodeStyleSetHeight(root_child0_child0_child0_child0, 50);
YGNodeInsertChild(root_child0_child0_child0, root_child0_child0_child0_child0, 0);
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(69, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(79, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(4, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(56, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(73, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(15, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(21, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(22, YGNodeLayoutGetHeight(root_child0_child0));
ASSERT_FLOAT_EQ(9, YGNodeLayoutGetLeft(root_child0_child0_child0));
ASSERT_FLOAT_EQ(29, YGNodeLayoutGetTop(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(92, YGNodeLayoutGetHeight(root_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionRTL);
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetLeft(root));
ASSERT_FLOAT_EQ(0, YGNodeLayoutGetTop(root));
ASSERT_FLOAT_EQ(69, YGNodeLayoutGetWidth(root));
ASSERT_FLOAT_EQ(79, YGNodeLayoutGetHeight(root));
ASSERT_FLOAT_EQ(4, YGNodeLayoutGetLeft(root_child0));
ASSERT_FLOAT_EQ(5, YGNodeLayoutGetTop(root_child0));
ASSERT_FLOAT_EQ(56, YGNodeLayoutGetWidth(root_child0));
ASSERT_FLOAT_EQ(73, YGNodeLayoutGetHeight(root_child0));
ASSERT_FLOAT_EQ(15, YGNodeLayoutGetLeft(root_child0_child0));
ASSERT_FLOAT_EQ(21, YGNodeLayoutGetTop(root_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0));
ASSERT_FLOAT_EQ(22, YGNodeLayoutGetHeight(root_child0_child0));
ASSERT_FLOAT_EQ(-3, YGNodeLayoutGetLeft(root_child0_child0_child0));
ASSERT_FLOAT_EQ(29, YGNodeLayoutGetTop(root_child0_child0_child0));
ASSERT_FLOAT_EQ(20, YGNodeLayoutGetWidth(root_child0_child0_child0));
ASSERT_FLOAT_EQ(92, YGNodeLayoutGetHeight(root_child0_child0_child0));
ASSERT_FLOAT_EQ(-97, YGNodeLayoutGetLeft(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(16, YGNodeLayoutGetTop(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(100, YGNodeLayoutGetWidth(root_child0_child0_child0_child0));
ASSERT_FLOAT_EQ(50, YGNodeLayoutGetHeight(root_child0_child0_child0_child0));
YGNodeFreeRecursive(root);
YGConfigFree(config);
}