Skip to content

Commit e55277c

Browse files
NickGerlemanfacebook-github-bot
authored andcommitted
Import "Fix percent absolute position and size calcuate different with web" behind experimental feature (#1028) (#1201)
Summary: Fixes facebook/yoga#850 facebook/yoga#850 describes a conformance issue where positioning of an absolute child using percentages is not calculated against the correct box size. This takes the fix for that in facebook/yoga#1028, regenerates tests, and fixes tests so that the experimental feature can be enabled. Goal is to run this as an experiment internally to see if we can enable by default. Changelog: [Internal] X-link: facebook/yoga#1201 Reviewed By: yungsters Differential Revision: D42282358 Pulled By: NickGerleman fbshipit-source-id: 57c0dd9b0f1c47cb9335ff6e13d44b4646e5fa58
1 parent ac66512 commit e55277c

File tree

4 files changed

+66
-6
lines changed

4 files changed

+66
-6
lines changed

ReactAndroid/src/main/java/com/facebook/yoga/YogaExperimentalFeature.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@
1010
package com.facebook.yoga;
1111

1212
public enum YogaExperimentalFeature {
13-
WEB_FLEX_BASIS(0);
13+
WEB_FLEX_BASIS(0),
14+
ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE(1),
15+
FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN(2);
1416

1517
private final int mIntValue;
1618

@@ -25,6 +27,8 @@ public int intValue() {
2527
public static YogaExperimentalFeature fromInt(int value) {
2628
switch (value) {
2729
case 0: return WEB_FLEX_BASIS;
30+
case 1: return ABSOLUTE_PERCENTAGE_AGAINST_PADDING_EDGE;
31+
case 2: return FIX_ABSOLUTE_TRAILING_COLUMN_MARGIN;
2832
default: throw new IllegalArgumentException("Unknown enum value: " + value);
2933
}
3034
}

ReactCommon/yoga/yoga/YGEnums.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,10 @@ const char* YGExperimentalFeatureToString(const YGExperimentalFeature value) {
9191
switch (value) {
9292
case YGExperimentalFeatureWebFlexBasis:
9393
return "web-flex-basis";
94+
case YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge:
95+
return "absolute-percentage-against-padding-edge";
96+
case YGExperimentalFeatureFixAbsoluteTrailingColumnMargin:
97+
return "fix-absolute-trailing-column-margin";
9498
}
9599
return "unknown";
96100
}

ReactCommon/yoga/yoga/YGEnums.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ YG_ENUM_SEQ_DECL(
5656

5757
YG_ENUM_SEQ_DECL(
5858
YGExperimentalFeature,
59-
YGExperimentalFeatureWebFlexBasis)
59+
YGExperimentalFeatureWebFlexBasis,
60+
YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge,
61+
YGExperimentalFeatureFixAbsoluteTrailingColumnMargin)
6062

6163
YG_ENUM_SEQ_DECL(
6264
YGFlexDirection,

ReactCommon/yoga/yoga/Yoga.cpp

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,13 +1595,21 @@ static void YGNodeAbsoluteLayoutChild(
15951595
depth,
15961596
generationCount);
15971597

1598+
auto trailingMarginOuterSize =
1599+
YGConfigIsExperimentalFeatureEnabled(
1600+
node->getConfig(),
1601+
YGExperimentalFeatureFixAbsoluteTrailingColumnMargin)
1602+
? isMainAxisRow ? height : width
1603+
: width;
1604+
15981605
if (child->isTrailingPosDefined(mainAxis) &&
15991606
!child->isLeadingPositionDefined(mainAxis)) {
16001607
child->setLayoutPosition(
16011608
node->getLayout().measuredDimensions[dim[mainAxis]] -
16021609
child->getLayout().measuredDimensions[dim[mainAxis]] -
16031610
node->getTrailingBorder(mainAxis) -
1604-
child->getTrailingMargin(mainAxis, width).unwrap() -
1611+
child->getTrailingMargin(mainAxis, trailingMarginOuterSize)
1612+
.unwrap() -
16051613
child->getTrailingPosition(mainAxis, isMainAxisRow ? width : height)
16061614
.unwrap(),
16071615
leading[mainAxis]);
@@ -1620,6 +1628,22 @@ static void YGNodeAbsoluteLayoutChild(
16201628
(node->getLayout().measuredDimensions[dim[mainAxis]] -
16211629
child->getLayout().measuredDimensions[dim[mainAxis]]),
16221630
leading[mainAxis]);
1631+
} else if (
1632+
YGConfigIsExperimentalFeatureEnabled(
1633+
node->getConfig(),
1634+
YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge) &&
1635+
child->isLeadingPositionDefined(mainAxis)) {
1636+
child->setLayoutPosition(
1637+
child->getLeadingPosition(
1638+
mainAxis, node->getLayout().measuredDimensions[dim[mainAxis]])
1639+
.unwrap() +
1640+
node->getLeadingBorder(mainAxis) +
1641+
child
1642+
->getLeadingMargin(
1643+
mainAxis,
1644+
node->getLayout().measuredDimensions[dim[mainAxis]])
1645+
.unwrap(),
1646+
leading[mainAxis]);
16231647
}
16241648

16251649
if (child->isTrailingPosDefined(crossAxis) &&
@@ -1628,7 +1652,8 @@ static void YGNodeAbsoluteLayoutChild(
16281652
node->getLayout().measuredDimensions[dim[crossAxis]] -
16291653
child->getLayout().measuredDimensions[dim[crossAxis]] -
16301654
node->getTrailingBorder(crossAxis) -
1631-
child->getTrailingMargin(crossAxis, width).unwrap() -
1655+
child->getTrailingMargin(crossAxis, trailingMarginOuterSize)
1656+
.unwrap() -
16321657
child
16331658
->getTrailingPosition(crossAxis, isMainAxisRow ? height : width)
16341659
.unwrap(),
@@ -1650,6 +1675,23 @@ static void YGNodeAbsoluteLayoutChild(
16501675
(node->getLayout().measuredDimensions[dim[crossAxis]] -
16511676
child->getLayout().measuredDimensions[dim[crossAxis]]),
16521677
leading[crossAxis]);
1678+
} else if (
1679+
YGConfigIsExperimentalFeatureEnabled(
1680+
node->getConfig(),
1681+
YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge) &&
1682+
child->isLeadingPositionDefined(crossAxis)) {
1683+
child->setLayoutPosition(
1684+
child->getLeadingPosition(
1685+
crossAxis,
1686+
node->getLayout().measuredDimensions[dim[crossAxis]])
1687+
.unwrap() +
1688+
node->getLeadingBorder(crossAxis) +
1689+
child
1690+
->getLeadingMargin(
1691+
crossAxis,
1692+
node->getLayout().measuredDimensions[dim[crossAxis]])
1693+
.unwrap(),
1694+
leading[crossAxis]);
16531695
}
16541696
}
16551697

@@ -3569,9 +3611,17 @@ static void YGNodelayoutImpl(
35693611
YGNodeAbsoluteLayoutChild(
35703612
node,
35713613
child,
3572-
availableInnerWidth,
3614+
YGConfigIsExperimentalFeatureEnabled(
3615+
node->getConfig(),
3616+
YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge)
3617+
? node->getLayout().measuredDimensions[YGDimensionWidth]
3618+
: availableInnerWidth,
35733619
isMainAxisRow ? measureModeMainDim : measureModeCrossDim,
3574-
availableInnerHeight,
3620+
YGConfigIsExperimentalFeatureEnabled(
3621+
node->getConfig(),
3622+
YGExperimentalFeatureAbsolutePercentageAgainstPaddingEdge)
3623+
? node->getLayout().measuredDimensions[YGDimensionHeight]
3624+
: availableInnerHeight,
35753625
direction,
35763626
config,
35773627
layoutMarkerData,

0 commit comments

Comments
 (0)