diff --git a/tests/InstrumentationTest.cpp b/tests/InstrumentationTest.cpp index be988ec0..42e36efa 100644 --- a/tests/InstrumentationTest.cpp +++ b/tests/InstrumentationTest.cpp @@ -32,6 +32,9 @@ struct MarkerTest : public ::testing::Test { struct EndData { Data data; void* cookie; + union { + YGMarkerLayoutData layout; + } markerData; }; static struct { @@ -43,6 +46,7 @@ struct MarkerTest : public ::testing::Test { static void endMarker(YGMarker, YGNodeRef, YGMarkerData, void*); static uniquePtr makeConfig(); static uniquePtr makeNode(uniquePtr&); + static uniquePtr makeNode(uniquePtr&, uniquePtr&); void SetUp() override; }; @@ -95,6 +99,28 @@ TEST_F(MarkerTest, layout_marker) { ASSERT_EQ(markerCookie.start.node, root.get()); } +TEST_F(MarkerTest, layout_marker_counts_single_node_layout) { + auto config = makeConfig(); + auto root = makeNode(config); + + YGNodeCalculateLayout(root.get(), YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_EQ(markerCookie.end.markerData.layout.layouts, 1); + ASSERT_EQ(markerCookie.end.markerData.layout.measures, 0); +} + +TEST_F(MarkerTest, layout_marker_counts_multi_node_layout) { + auto config = makeConfig(); + auto root = makeNode(config); + auto childA = makeNode(config, root); + auto childB = makeNode(config, root); + + YGNodeCalculateLayout(root.get(), YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_EQ(markerCookie.end.markerData.layout.layouts, 3); + ASSERT_EQ(markerCookie.end.markerData.layout.measures, 4); +} + void* MarkerTest::startMarker( YGMarker marker, YGNodeRef node, @@ -108,7 +134,12 @@ void MarkerTest::endMarker( YGNodeRef node, YGMarkerData data, void* id) { - markerCookie.end = {{marker, node, data}, id}; + markerCookie.end = {{marker, node, data}, id, {}}; + switch (marker) { + case YGMarkerLayout: + markerCookie.end.markerData.layout = *marker::data(data); + break; + }; } uniquePtr MarkerTest::makeConfig() { @@ -122,6 +153,14 @@ uniquePtr MarkerTest::makeNode(uniquePtr& config) { return n; } +uniquePtr MarkerTest::makeNode( + uniquePtr& config, + uniquePtr& owner) { + auto n = makeNode(config); + YGNodeInsertChild(owner.get(), n.get(), YGNodeGetChildCount(owner.get())); + return n; +} + void MarkerTest::SetUp() { markerCookie = {}; } diff --git a/yoga/YGMarker.h b/yoga/YGMarker.h index f7da1b58..15280927 100644 --- a/yoga/YGMarker.h +++ b/yoga/YGMarker.h @@ -18,7 +18,8 @@ typedef YG_ENUM_BEGIN(YGMarker){ } YG_ENUM_END(YGMarker); typedef struct { - int unused; + int layouts; + int measures; } YGMarkerLayoutData; typedef union { @@ -54,6 +55,15 @@ struct MarkerData { }; } // namespace detail + +template +typename detail::MarkerData::type* data(YGMarkerData) = delete; + +template <> +inline YGMarkerLayoutData* data(YGMarkerData d) { + return d.layout; +} + } // namespace marker } // namespace yoga } // namespace facebook diff --git a/yoga/Yoga.cpp b/yoga/Yoga.cpp index 6b91b7e1..9461bb3f 100644 --- a/yoga/Yoga.cpp +++ b/yoga/Yoga.cpp @@ -2685,6 +2685,8 @@ static void YGNodelayoutImpl( "availableHeight is indefinite so heightMeasureMode must be " "YGMeasureModeUndefined"); + (performLayout ? layoutMarkerData.layouts : layoutMarkerData.measures) += 1; + // Set the resolved resolution in the node's layout. const YGDirection direction = node->resolveDirection(ownerDirection); node->setLayoutDirection(direction);