Chromium Code Reviews| Index: Source/core/layout/LayoutFlexibleBox.cpp |
| diff --git a/Source/core/layout/LayoutFlexibleBox.cpp b/Source/core/layout/LayoutFlexibleBox.cpp |
| index a748a9193fd9f5b3d77750cec992380119c0db2d..a5550220c738f7901e0e33c93e5ae060610dbc84 100644 |
| --- a/Source/core/layout/LayoutFlexibleBox.cpp |
| +++ b/Source/core/layout/LayoutFlexibleBox.cpp |
| @@ -117,7 +117,6 @@ void LayoutFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidt |
| maxLogicalWidth = std::max(maxPreferredLogicalWidth, maxLogicalWidth); |
| } |
| } |
| - |
| maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); |
| LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); |
| @@ -339,6 +338,11 @@ Length LayoutFlexibleBox::flexBasisForChild(LayoutBox& child) const |
| return flexLength; |
| } |
| +bool LayoutFlexibleBox::percentageMainSizeIsResolvable() |
| +{ |
| + return isHorizontalFlow() ? hasDefiniteLogicalWidth() : hasDefiniteLogicalHeight(); |
| +} |
| + |
| LayoutUnit LayoutFlexibleBox::crossAxisExtentForChild(LayoutBox& child) const |
| { |
| return isHorizontalFlow() ? child.size().height() : child.size().width(); |
| @@ -411,7 +415,7 @@ LayoutUnit LayoutFlexibleBox::computeMainAxisExtentForChild(LayoutBox& child, Si |
| // We don't have to check for "auto" here - computeContentLogicalHeight will just return -1 for that case anyway. |
| if (size.isIntrinsic()) |
| child.layoutIfNeeded(); |
| - return child.computeContentLogicalHeight(size, child.logicalHeight() - child.borderAndPaddingLogicalHeight()) + child.scrollbarLogicalHeight(); |
| + return child.computeContentLogicalHeight(sizeType, size, child.logicalHeight() - child.borderAndPaddingLogicalHeight()) + child.scrollbarLogicalHeight(); |
| } |
| return child.computeLogicalWidthUsing(sizeType, size, contentLogicalWidth(), this) - child.borderAndPaddingLogicalWidth(); |
| } |
| @@ -827,19 +831,51 @@ void LayoutFlexibleBox::prepareOrderIteratorAndMargins() |
| } |
| } |
| -LayoutUnit LayoutFlexibleBox::adjustChildSizeForMinAndMax(LayoutBox& child, LayoutUnit childSize) |
| +LayoutUnit LayoutFlexibleBox::adjustChildSizeForMinAndMax(LayoutBox& child, LayoutUnit childSize, bool hasInfiniteLineLength) |
| { |
| Length max = isHorizontalFlow() ? child.style()->maxWidth() : child.style()->maxHeight(); |
| + LayoutUnit maxExtent = -1; |
| if (max.isSpecifiedOrIntrinsic()) { |
| - LayoutUnit maxExtent = computeMainAxisExtentForChild(child, MaxSize, max); |
| + maxExtent = computeMainAxisExtentForChild(child, MaxSize, max); |
| if (maxExtent != -1 && childSize > maxExtent) |
| childSize = maxExtent; |
| } |
| Length min = isHorizontalFlow() ? child.style()->minWidth() : child.style()->minHeight(); |
| LayoutUnit minExtent = 0; |
| - if (min.isSpecifiedOrIntrinsic()) |
| + if (min.isSpecifiedOrIntrinsic()) { |
| minExtent = computeMainAxisExtentForChild(child, MinSize, min); |
| + // computeMainAxisExtentForChild can return -1 when the child has a percentage |
| + // min size, but we have an indefinite size in that axis. |
| + minExtent = std::max(LayoutUnit(0), minExtent); |
| + } else if (min.isAuto() && mainAxisOverflowForChild(child) == OVISIBLE) { |
| + // css-flexbox section 4.5 |
| + LayoutUnit contentSize = computeMainAxisExtentForChild(child, MinSize, Length(MinContent)); |
| + ASSERT(contentSize >= 0); |
| + if (maxExtent != -1 && contentSize > maxExtent) |
| + contentSize = maxExtent; |
| + |
| + bool hasClampedSize = !childPreferredMainAxisContentExtentRequiresLayout(child, hasInfiniteLineLength); |
| + if (hasClampedSize) { |
| + Length flexBasis = flexBasisForChild(child); |
| + bool flexBasisIsDefinite = flexBasis.isFixed() || (flexBasis.isPercent() && percentageMainSizeIsResolvable()); |
| + if (flexBasisIsDefinite) { |
| + LayoutUnit resolvedFlexBasis = computeMainAxisExtentForChild(child, MainOrPreferredSize, flexBasis); |
| + ASSERT(resolvedFlexBasis >= 0); |
| + LayoutUnit clampedSize = resolvedFlexBasis; |
| + if (maxExtent != -1 && clampedSize > maxExtent) |
| + clampedSize = maxExtent; |
| + |
| + minExtent = std::min(clampedSize, contentSize); |
| + } else { |
| + minExtent = contentSize; |
| + } |
| + } else { |
| + minExtent = contentSize; |
| + } |
| + // TODO(cbiesinger): Implement aspect ratio handling (here, transferred size) |
|
leviw_travelin_and_unemployed
2015/04/02 22:14:36
Tracking bug?
cbiesinger
2015/04/03 18:49:17
Done.
|
| + } |
| + ASSERT(minExtent >= 0); |
| return std::max(childSize, minExtent); |
| } |
| @@ -869,7 +905,7 @@ bool LayoutFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren |
| + (isHorizontalFlow() ? child->marginWidth() : child->marginHeight()); |
| LayoutUnit childFlexBaseSize = childMainAxisExtent + childMainAxisMarginBorderPadding; |
| - LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(*child, childMainAxisExtent); |
| + LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(*child, childMainAxisExtent, hasInfiniteLineLength); |
| LayoutUnit childHypotheticalMainSize = childMinMaxAppliedMainAxisExtent + childMainAxisMarginBorderPadding; |
| if (isMultiline() && sumHypotheticalMainSize + childHypotheticalMainSize > lineBreakLength && lineHasInFlowItem) |
| @@ -925,7 +961,7 @@ bool LayoutFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedF |
| if (std::isfinite(extraSpace)) |
| childSize += LayoutUnit::fromFloatRound(extraSpace); |
| - LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(*child, childSize); |
| + LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(*child, childSize, hasInfiniteLineLength); |
| childSizes.append(adjustedChildSize); |
| usedFreeSpace += adjustedChildSize - preferredChildSize; |
| @@ -1052,6 +1088,13 @@ bool LayoutFlexibleBox::needToStretchChildLogicalHeight(LayoutBox& child) const |
| return isHorizontalFlow() && child.style()->height().isAuto(); |
| } |
| +EOverflow LayoutFlexibleBox::mainAxisOverflowForChild(LayoutBox& child) const |
| +{ |
| + if (isHorizontalFlow()) |
| + return child.styleRef().overflowX(); |
| + return child.styleRef().overflowY(); |
| +} |
| + |
| void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, LayoutUnit availableFreeSpace, bool relayoutChildren, Vector<LineContext>& lineContexts, bool hasInfiniteLineLength) |
| { |
| ASSERT(childSizes.size() == children.size()); |