diff --git a/tests/YGDirtyMarkingTest.cpp b/tests/YGDirtyMarkingTest.cpp index c1582e7f..10c27d20 100644 --- a/tests/YGDirtyMarkingTest.cpp +++ b/tests/YGDirtyMarkingTest.cpp @@ -70,6 +70,54 @@ TEST(YogaTest, dirty_propagation_only_if_prop_changed) { YGNodeFreeRecursive(root); } +TEST(Yogatest, dirty_mark_all_children_as_dirty_when_display_changes){ + const YGNodeRef root = YGNodeNew(); + YGNodeStyleSetFlexDirection(root, YGFlexDirectionRow); + YGNodeStyleSetHeight(root, 100); + + const YGNodeRef child0 = YGNodeNew(); + YGNodeStyleSetFlexGrow(child0, 1); + const YGNodeRef child1 = YGNodeNew(); + YGNodeStyleSetFlexGrow(child1, 1); + + const YGNodeRef child1_child0 = YGNodeNew(); + const YGNodeRef child1_child0_child0 = YGNodeNew(); + YGNodeStyleSetWidth(child1_child0_child0, 8); + YGNodeStyleSetHeight(child1_child0_child0, 16); + + YGNodeInsertChild(child1_child0, child1_child0_child0, 0); + + YGNodeInsertChild(child1, child1_child0, 0); + YGNodeInsertChild(root, child0, 0); + YGNodeInsertChild(root, child1, 0); + + YGNodeStyleSetDisplay(child0, YGDisplayFlex); + YGNodeStyleSetDisplay(child1, YGDisplayNone); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(child1_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(child1_child0_child0)); + + YGNodeStyleSetDisplay(child0, YGDisplayNone); + YGNodeStyleSetDisplay(child1, YGDisplayFlex); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + ASSERT_FLOAT_EQ(8, YGNodeLayoutGetWidth(child1_child0_child0)); + ASSERT_FLOAT_EQ(16, YGNodeLayoutGetHeight(child1_child0_child0)); + + YGNodeStyleSetDisplay(child0, YGDisplayFlex); + YGNodeStyleSetDisplay(child1, YGDisplayNone); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetWidth(child1_child0_child0)); + ASSERT_FLOAT_EQ(0, YGNodeLayoutGetHeight(child1_child0_child0)); + + YGNodeStyleSetDisplay(child0, YGDisplayNone); + YGNodeStyleSetDisplay(child1, YGDisplayFlex); + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + ASSERT_FLOAT_EQ(8, YGNodeLayoutGetWidth(child1_child0_child0)); + ASSERT_FLOAT_EQ(16, YGNodeLayoutGetHeight(child1_child0_child0)); + + YGNodeFreeRecursive(root); +} + TEST(YogaTest, dirty_node_only_if_children_are_actually_removed) { const YGNodeRef root = YGNodeNew(); YGNodeStyleSetAlignItems(root, YGAlignFlexStart); diff --git a/yoga/Yoga.c b/yoga/Yoga.c index 51838d87..d4743518 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -1791,6 +1791,12 @@ static void YGZeroOutLayoutRecursivly(const YGNodeRef node) { node->layout.position[YGEdgeBottom] = 0; node->layout.position[YGEdgeLeft] = 0; node->layout.position[YGEdgeRight] = 0; + node->layout.cachedLayout.availableHeight = 0; + node->layout.cachedLayout.availableWidth = 0; + node->layout.cachedLayout.heightMeasureMode = YGMeasureModeExactly; + node->layout.cachedLayout.widthMeasureMode = YGMeasureModeExactly; + node->layout.cachedLayout.computedWidth = 0; + node->layout.cachedLayout.computedHeight = 0; const uint32_t childCount = YGNodeGetChildCount(node); for (uint32_t i = 0; i < childCount; i++) { const YGNodeRef child = YGNodeListGet(node->children, i);