From 249d010dad6b504cf3181e70b6ecfa57ef26e998 Mon Sep 17 00:00:00 2001 From: Emil Sjolander Date: Fri, 17 Mar 2017 09:07:23 -0700 Subject: [PATCH] Invalidate layout when node is removed from tree Summary: The layout of a node is invalid once it leaves the tree. Let's reset it for safety in case it is added to another tree. Reviewed By: astreet Differential Revision: D4716022 fbshipit-source-id: 399cc64a4b3f5fd3fc469ea37bdd31abe474dc6c --- tests/YGNodeChildTest.cpp | 36 ++++++++++++++++++++++++++++++++++++ yoga/Yoga.c | 1 + 2 files changed, 37 insertions(+) create mode 100644 tests/YGNodeChildTest.cpp diff --git a/tests/YGNodeChildTest.cpp b/tests/YGNodeChildTest.cpp new file mode 100644 index 00000000..781ac7f4 --- /dev/null +++ b/tests/YGNodeChildTest.cpp @@ -0,0 +1,36 @@ +/** + * Copyright (c) 2014-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#include +#include + +TEST(YogaTest, reset_layout_when_child_removed) { + const YGNodeRef root = YGNodeNew(); + + const YGNodeRef root_child0 = YGNodeNew(); + YGNodeStyleSetWidth(root_child0, 100); + YGNodeStyleSetHeight(root_child0, 100); + YGNodeInsertChild(root, root_child0, 0); + + YGNodeCalculateLayout(root, YGUndefined, YGUndefined, YGDirectionLTR); + + ASSERT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_EQ(100, YGNodeLayoutGetWidth(root_child0)); + ASSERT_EQ(100, YGNodeLayoutGetHeight(root_child0)); + + YGNodeRemoveChild(root, root_child0); + + ASSERT_EQ(0, YGNodeLayoutGetLeft(root_child0)); + ASSERT_EQ(0, YGNodeLayoutGetTop(root_child0)); + ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetWidth(root_child0))); + ASSERT_TRUE(YGFloatIsUndefined(YGNodeLayoutGetHeight(root_child0))); + + YGNodeFreeRecursive(root); +} diff --git a/yoga/Yoga.c b/yoga/Yoga.c index 323bb881..65a3ba46 100644 --- a/yoga/Yoga.c +++ b/yoga/Yoga.c @@ -423,6 +423,7 @@ void YGNodeInsertChild(const YGNodeRef node, const YGNodeRef child, const uint32 void YGNodeRemoveChild(const YGNodeRef node, const YGNodeRef child) { if (YGNodeListDelete(node->children, child) != NULL) { + child->layout = gYGNodeDefaults.layout; // layout is no longer valid child->parent = NULL; YGNodeMarkDirtyInternal(node); }