From e54af5e854a38ad6bed734945dac10b837b9d203 Mon Sep 17 00:00:00 2001 From: Dustin Shahidehpour Date: Wed, 9 Nov 2016 08:42:45 -0800 Subject: [PATCH] Allow MeasureFunc to be set to NULL no matter how many children a node has. Summary: Within `UIView+CSSLayout`, we often nil out the measure function of a node because view hierarchy can often change. Unfortunately, this causes us to hit an assert which crashes the app. Instead, lets the measure func to be set to NULL, regardless of how many children a node might have. Reviewed By: emilsjolander Differential Revision: D4148727 fbshipit-source-id: 79a0f3ef1bf7b1dce9a14de96f870e35c042b78b --- CSSLayout/CSSLayout.c | 9 +++++++-- tests/CSSLayoutMeasureTest.cpp | 14 +++++++++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CSSLayout/CSSLayout.c b/CSSLayout/CSSLayout.c index d9d7d65b..4aac54ec 100644 --- a/CSSLayout/CSSLayout.c +++ b/CSSLayout/CSSLayout.c @@ -259,8 +259,13 @@ static void _CSSNodeMarkDirty(const CSSNodeRef node) { } void CSSNodeSetMeasureFunc(const CSSNodeRef node, CSSMeasureFunc measureFunc) { - CSS_ASSERT(CSSNodeChildCount(node) == 0, "Cannot set measure function: Nodes with measure functions cannot have children."); - node->measure = measureFunc; + // You can always NULLify the measure function of a node. + if (measureFunc == NULL) { + node->measure = NULL; + } else { + CSS_ASSERT(CSSNodeChildCount(node) == 0, "Cannot set measure function: Nodes with measure functions cannot have children."); + node->measure = measureFunc; + } } CSSMeasureFunc CSSNodeGetMeasureFunc(const CSSNodeRef node) { diff --git a/tests/CSSLayoutMeasureTest.cpp b/tests/CSSLayoutMeasureTest.cpp index 960f3e50..cfed9363 100644 --- a/tests/CSSLayoutMeasureTest.cpp +++ b/tests/CSSLayoutMeasureTest.cpp @@ -28,13 +28,25 @@ TEST(CSSLayoutTest, cannot_add_child_to_node_with_measure_func) { const CSSNodeRef root_child0 = CSSNodeNew(); ASSERT_DEATH(CSSNodeInsertChild(root, root_child0, 0), "Cannot add child.*"); + CSSNodeFreeRecursive(root); } -TEST(CSSLayoutTest, cannot_add_measure_func_to_non_leaf_node) { +TEST(CSSLayoutTest, cannot_add_nonnull_measure_func_to_non_leaf_node) { const CSSNodeRef root = CSSNodeNew(); const CSSNodeRef root_child0 = CSSNodeNew(); CSSNodeInsertChild(root, root_child0, 0); ASSERT_DEATH(CSSNodeSetMeasureFunc(root, _measure), "Cannot set measure function.*"); + CSSNodeFreeRecursive(root); } + +TEST(CSSLayoutTest, can_nullify_measure_func_on_any_node) { + const CSSNodeRef root = CSSNodeNew(); + CSSNodeInsertChild(root, CSSNodeNew(), 0); + + CSSNodeSetMeasureFunc(root, NULL); + ASSERT_TRUE(CSSNodeGetMeasureFunc(root) == NULL); + CSSNodeFreeRecursive(root); +} + #endif