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 58a94f8034fed8e205f959f5efea3e4dcc9c1c2c..89bf5b7cb9f01f32d2ff732f5952e3ea8d049010 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutGrid.cpp |
| @@ -680,13 +680,11 @@ GridTrackSize LayoutGrid::gridTrackSize(GridTrackSizingDirection direction, size |
| return GridTrackSize(minTrackBreadth, maxTrackBreadth); |
| } |
| -LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child, GridSizingData& sizingData) |
| +LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child, GridSizingData& sizingData, bool overrideWidthHasChanged) |
|
jfernandez
2016/04/04 15:23:24
We shouldn't need this new argument. We only use t
svillar
2016/04/05 08:34:29
Acknowledged.
|
| { |
| SubtreeLayoutScope layoutScope(child); |
| - LayoutUnit oldOverrideContainingBlockContentLogicalWidth = child.hasOverrideContainingBlockLogicalWidth() ? child.overrideContainingBlockContentLogicalWidth() : LayoutUnit(); |
| - LayoutUnit overrideContainingBlockContentLogicalWidth = gridAreaBreadthForChild(child, ForColumns, sizingData.columnTracks); |
| bool shouldClearContainingBlockLogicalHeight = child.hasRelativeLogicalHeight() || child.styleRef().logicalHeight().isIntrinsicOrAuto(); |
| - if (shouldClearContainingBlockLogicalHeight || oldOverrideContainingBlockContentLogicalWidth != overrideContainingBlockContentLogicalWidth) |
| + if (shouldClearContainingBlockLogicalHeight || overrideWidthHasChanged) |
| layoutScope.setNeedsLayout(&child, LayoutInvalidationReason::GridChanged); |
| bool hasOverrideHeight = child.hasOverrideLogicalContentHeight(); |
| @@ -694,7 +692,6 @@ LayoutUnit LayoutGrid::logicalHeightForChild(LayoutBox& child, GridSizingData& s |
| if (hasOverrideHeight && child.needsLayout()) |
| child.clearOverrideLogicalContentHeight(); |
| - child.setOverrideContainingBlockContentLogicalWidth(overrideContainingBlockContentLogicalWidth); |
| // If |child| has a relative logical height, we shouldn't let it override its intrinsic height, which is |
| // what we are interested in here. Thus we need to set the override logical height to -1 (no possible resolution). |
| if (shouldClearContainingBlockLogicalHeight) |
| @@ -717,10 +714,26 @@ LayoutUnit LayoutGrid::minSizeForChild(LayoutBox& child, GridTrackSizingDirectio |
| if (!childSize.isAuto() || childMinSize.isAuto()) |
| return minContentForChild(child, direction, sizingData); |
| + SubtreeLayoutScope layoutScope(child); |
| + if (updateOverrideContainingBlockContentLogicalWidthForChild(child, sizingData)) |
| + layoutScope.setNeedsLayout(&child, LayoutInvalidationReason::GridChanged); |
| + child.layoutIfNeeded(); |
| + |
| + ASSERT(child.hasOverrideContainingBlockLogicalWidth()); |
|
jfernandez
2016/04/04 15:23:24
Why we need this ASSERT ?
It's already part overr
|
| if (isRowAxis) |
| - return child.computeLogicalWidthUsing(MinSize, childMinSize, contentLogicalWidth(), this); |
| + return child.computeLogicalWidthUsing(MinSize, childMinSize, child.overrideContainingBlockContentLogicalWidth(), this) + child.marginLogicalWidth(); |
| + |
| + return child.computeLogicalHeightUsing(MinSize, childMinSize, child.intrinsicLogicalHeight()) + child.marginLogicalHeight() + child.scrollbarLogicalHeight(); |
| +} |
| - return child.computeLogicalHeightUsing(MinSize, childMinSize, child.intrinsicLogicalHeight()) + child.scrollbarLogicalHeight(); |
| +bool LayoutGrid::updateOverrideContainingBlockContentLogicalWidthForChild(LayoutBox& child, GridSizingData& sizingData) |
| +{ |
| + LayoutUnit overrideWidth = gridAreaBreadthForChild(child, ForColumns, sizingData.columnTracks); |
| + if (child.hasOverrideContainingBlockLogicalWidth() && child.overrideContainingBlockContentLogicalWidth() == overrideWidth) |
| + return false; |
| + |
| + child.setOverrideContainingBlockContentLogicalWidth(overrideWidth); |
| + return true; |
| } |
| LayoutUnit LayoutGrid::minContentForChild(LayoutBox& child, GridTrackSizingDirection direction, GridSizingData& sizingData) |
| @@ -741,7 +754,8 @@ LayoutUnit LayoutGrid::minContentForChild(LayoutBox& child, GridTrackSizingDirec |
| return child.minPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(child); |
| } |
| - return logicalHeightForChild(child, sizingData); |
| + bool overrideWidthHasChanged = updateOverrideContainingBlockContentLogicalWidthForChild(child, sizingData); |
|
jfernandez
2016/04/01 11:00:46
Why we can't call this function inside logicalHeig
svillar
2016/04/05 08:34:29
Because it's pretty weird that a function that ret
|
| + return logicalHeightForChild(child, sizingData, overrideWidthHasChanged); |
| } |
| LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child, GridTrackSizingDirection direction, GridSizingData& sizingData) |
| @@ -762,7 +776,8 @@ LayoutUnit LayoutGrid::maxContentForChild(LayoutBox& child, GridTrackSizingDirec |
| return child.maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(child); |
| } |
| - return logicalHeightForChild(child, sizingData); |
| + bool overrideWidthHasChanged = updateOverrideContainingBlockContentLogicalWidthForChild(child, sizingData); |
| + return logicalHeightForChild(child, sizingData, overrideWidthHasChanged); |
| } |
| // We're basically using a class instead of a std::pair because of accessing gridItem() or getGridSpan() is much more |
| @@ -1568,8 +1583,11 @@ LayoutUnit LayoutGrid::gridAreaBreadthForChild(const LayoutBox& child, GridTrack |
| { |
| const GridSpan& span = cachedGridSpan(child, direction); |
| LayoutUnit gridAreaBreadth; |
| - for (const auto& trackPosition : span) |
| + for (const auto& trackPosition : span) { |
| + if (tracks[trackPosition].baseSize() == infinity) |
| + return LayoutUnit(infinity); |
|
jfernandez
2016/04/01 11:00:46
Could you explain this change ?
svillar
2016/04/05 08:34:29
Sure. This function can now be called just after i
svillar
2016/04/05 08:42:33
Now that I think about it, base sizes are never in
|
| gridAreaBreadth += tracks[trackPosition].baseSize(); |
| + } |
| gridAreaBreadth += guttersSize(direction, span.integerSpan()); |