[React Native] Fix infinite loop in css-layout

Summary:
Manual pick of https://github.com/facebook/css-layout/commit/9001a3d2 since we're still lagging behind the upstream. Fixes #1378.
This commit is contained in:
Ben Alpert 2015-08-19 15:36:36 -07:00
parent d9bd445940
commit 5a2d2007a4
1 changed files with 10 additions and 6 deletions

View File

@ -448,11 +448,12 @@ static void layoutNodeImpl(css_node_t *node, float parentMaxWidth) {
// We want to execute the next two loops one per line with flex-wrap // We want to execute the next two loops one per line with flex-wrap
int startLine = 0; int startLine = 0;
int endLine = 0; int endLine = 0;
int nextLine = 0; // int nextOffset = 0;
int alreadyComputedNextLayout = 0;
// We aggregate the total dimensions of the container in those two variables // We aggregate the total dimensions of the container in those two variables
float linesCrossDim = 0; float linesCrossDim = 0;
float linesMainDim = 0; float linesMainDim = 0;
while (endLine != node->children_count) { while (endLine < node->children_count) {
// <Loop A> Layout non flexible children and count children by type // <Loop A> Layout non flexible children and count children by type
// mainContentDim is accumulation of the dimensions and margin of all the // mainContentDim is accumulation of the dimensions and margin of all the
@ -496,7 +497,7 @@ static void layoutNodeImpl(css_node_t *node, float parentMaxWidth) {
} }
// This is the main recursive call. We layout non flexible children. // This is the main recursive call. We layout non flexible children.
if (nextLine == 0) { if (alreadyComputedNextLayout == 0) {
layoutNode(child, maxWidth); layoutNode(child, maxWidth);
} }
@ -512,12 +513,15 @@ static void layoutNodeImpl(css_node_t *node, float parentMaxWidth) {
// The element we are about to add would make us go to the next line // The element we are about to add would make us go to the next line
if (isFlexWrap(node) && if (isFlexWrap(node) &&
!isUndefined(node->layout.dimensions[dim[mainAxis]]) && !isUndefined(node->layout.dimensions[dim[mainAxis]]) &&
mainContentDim + nextContentDim > definedMainDim) { mainContentDim + nextContentDim > definedMainDim &&
// If there's only one element, then it's bigger than the content
// and needs its own line
i != startLine) {
nonFlexibleChildrenCount--; nonFlexibleChildrenCount--;
nextLine = i + 1; alreadyComputedNextLayout = 1;
break; break;
} }
nextLine = 0; alreadyComputedNextLayout = 0;
mainContentDim += nextContentDim; mainContentDim += nextContentDim;
endLine = i + 1; endLine = i + 1;
} }