Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutGrid.cpp | 
| diff --git a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp | 
| index aef12064b28b22e8fc7cb60aa7930439b557840b..ad2d435e6ed18da3b5827c4c95ab8faaf56402e2 100644 | 
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp | 
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp | 
| @@ -418,7 +418,7 @@ void LayoutGrid::computeTrackSizesForDirection(GridTrackSizingDirection directio | 
| sizingData.nextState(); | 
| } | 
| -void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows) | 
| +void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData) | 
| { | 
| DCHECK(sizingData.sizingState > GridSizingData::RowSizingFirstIteration); | 
| @@ -430,12 +430,43 @@ void LayoutGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUn | 
| // a new cycle of the sizing algorithm; there may be more. In addition, not all the | 
| // cases with orthogonal flows require this extra cycle; we need a more specific | 
| // condition to detect whether child's min-content contribution has changed or not. | 
| - if (m_hasAnyOrthogonalChild) { | 
| - computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForColumns); | 
| - computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows); | 
| + bool minContentContributionChanged = false; | 
| + for (auto* child : m_orthogonalChilds) { | 
| + if (updateOverrideContainingBlockContentSizeForChild(*child, ForRows, sizingData)) | 
| + child->setNeedsLayout(LayoutInvalidationReason::GridChanged); | 
| + child->layoutIfNeeded(); | 
| + if (!minContentContributionChanged) { | 
| 
 
svillar
2016/09/13 13:44:18
I don't get this. For example for the first orthog
 
jfernandez
2016/09/13 14:56:59
Umm, why "first orthogonal child" ? We definitivel
 
 | 
| + LayoutUnit minContentInlineSize = child->hasOverrideContainingBlockLogicalWidth() ? child->overrideContainingBlockContentLogicalWidth() : LayoutUnit(); | 
| + minContentContributionChanged = child->logicalHeight() > minContentInlineSize; | 
| + } | 
| + } | 
| + | 
| + if (minContentContributionChanged) { | 
| + setPreferredLogicalWidthsDirty(); | 
| + updateLogicalWidth(); | 
| + computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWidth()); | 
| + resolveSizeOfGridRows(sizingData); | 
| } | 
| 
 
svillar
2016/09/13 13:44:18
I have many doubts about the above block. It's lik
 
jfernandez
2016/09/13 14:56:59
I understand your concerns. However, notice that w
 
 | 
| } | 
| +void LayoutGrid::resolveSizeOfGridRows(GridSizingData& sizingData) | 
| +{ | 
| + bool logicalHeightWasIndefinite = !hasDefiniteLogicalHeight(); | 
| + if (logicalHeightWasIndefinite) | 
| + computeIntrinsicLogicalHeight(sizingData); | 
| + else | 
| + computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeight(ExcludeMarginBorderPadding)); | 
| + setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight()); | 
| + | 
| + updateLogicalHeight(); | 
| + | 
| + // The above call might have changed the grid's logical height depending on min|max height restrictions. | 
| + // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes). | 
| + LayoutUnit availableSpaceForRows = contentLogicalHeight(); | 
| + if (logicalHeightWasIndefinite) | 
| + computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows); | 
| +} | 
| + | 
| void LayoutGrid::layoutBlock(bool relayoutChildren) | 
| { | 
| ASSERT(needsLayout()); | 
| @@ -453,7 +484,6 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) | 
| LayoutSize previousSize = size(); | 
| updateLogicalWidth(); | 
| - bool logicalHeightWasIndefinite = !hasDefiniteLogicalHeight(); | 
| TextAutosizer::LayoutScope textAutosizerLayoutScope(this, &layoutScope); | 
| @@ -470,30 +500,17 @@ void LayoutGrid::layoutBlock(bool relayoutChildren) | 
| // properly resolves intrinsic sizes. We cannot do the same for heights though because many code | 
| // paths inside updateLogicalHeight() require a previous call to setLogicalHeight() to resolve | 
| // heights properly (like for positioned items for example). | 
| - LayoutUnit availableSpaceForColumns = availableLogicalWidth(); | 
| - computeTrackSizesForDirection(ForColumns, sizingData, availableSpaceForColumns); | 
| + computeTrackSizesForDirection(ForColumns, sizingData, availableLogicalWidth()); | 
| // 2- Next, the track sizing algorithm resolves the sizes of the grid rows, using the | 
| // grid column sizes calculated in the previous step. | 
| - if (logicalHeightWasIndefinite) | 
| - computeIntrinsicLogicalHeight(sizingData); | 
| - else | 
| - computeTrackSizesForDirection(ForRows, sizingData, availableLogicalHeight(ExcludeMarginBorderPadding)); | 
| - setLogicalHeight(computeTrackBasedLogicalHeight(sizingData) + borderAndPaddingLogicalHeight() + scrollbarLogicalHeight()); | 
| - | 
| LayoutUnit oldClientAfterEdge = clientLogicalBottom(); | 
| - updateLogicalHeight(); | 
| - | 
| - // The above call might have changed the grid's logical height depending on min|max height restrictions. | 
| - // Update the sizes of the rows whose size depends on the logical height (also on definite|indefinite sizes). | 
| - LayoutUnit availableSpaceForRows = contentLogicalHeight(); | 
| - if (logicalHeightWasIndefinite) | 
| - computeTrackSizesForDirection(ForRows, sizingData, availableSpaceForRows); | 
| + resolveSizeOfGridRows(sizingData); | 
| // 3- If the min-content contribution of any grid items have changed based on the row | 
| // sizes calculated in step 2, steps 1 and 2 are repeated with the new min-content | 
| // contribution (once only). | 
| - repeatTracksSizingIfNeeded(sizingData, availableSpaceForColumns, availableSpaceForRows); | 
| + repeatTracksSizingIfNeeded(sizingData); | 
| // Grid container should have the minimum height of a line if it's editable. That doesn't affect track sizing though. | 
| if (hasLineIfEmpty()) | 
| @@ -1565,12 +1582,13 @@ void LayoutGrid::placeItemsOnGrid(SizingOperation sizingOperation) | 
| Vector<LayoutBox*> autoMajorAxisAutoGridItems; | 
| Vector<LayoutBox*> specifiedMajorAxisAutoGridItems; | 
| - m_hasAnyOrthogonalChild = false; | 
| + m_orthogonalChilds.shrink(0); | 
| for (LayoutBox* child = m_orderIterator.first(); child; child = m_orderIterator.next()) { | 
| if (child->isOutOfFlowPositioned()) | 
| continue; | 
| - m_hasAnyOrthogonalChild = m_hasAnyOrthogonalChild || isOrthogonalChild(*child); | 
| + if (isOrthogonalChild(*child)) | 
| + m_orthogonalChilds.append(child); | 
| GridArea area = cachedGridArea(*child); | 
| if (!area.rows.isIndefinite()) |