| Index: third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| index ed11a5f59456429003e40b71959ad004281aa62b..60d2e274f07a9216e201e9cb52986dcd891c4e46 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| @@ -181,6 +181,16 @@ int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di
|
| return beforeMarginInLineDirection(direction) + baseline;
|
| }
|
|
|
| +static const StyleContentAlignmentData& normalValueBehavior()
|
| +{
|
| + // The justify-content property applies along the main axis, but since flexing
|
| + // in the main axis is controlled by flex, stretch behaves as flex-start (ignoring
|
| + // the specified fallback alignment, if any).
|
| + // https://drafts.csswg.org/css-align/#distribution-flex
|
| + static const StyleContentAlignmentData normalBehavior = {ContentPositionNormal, ContentDistributionStretch};
|
| + return normalBehavior;
|
| +}
|
| +
|
| int LayoutFlexibleBox::firstLineBoxBaseline() const
|
| {
|
| if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
|
| @@ -1302,10 +1312,13 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
|
| {
|
| ASSERT(childSizes.size() == children.size());
|
|
|
| + ContentPosition position = styleRef().resolvedJustifyContentPosition(normalValueBehavior());
|
| + ContentDistributionType distribution = styleRef().resolvedJustifyContentDistribution(normalValueBehavior());
|
| +
|
| size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(children);
|
| LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, availableFreeSpace);
|
| LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart();
|
| - mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, style()->justifyContentPosition(), style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
|
| + mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent);
|
| if (style()->flexDirection() == FlowRowReverse)
|
| mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight();
|
|
|
| @@ -1372,7 +1385,7 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
|
|
|
| ++seenInFlowPositionedChildren;
|
| if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
|
| - mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSpace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
|
| + mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSpace, distribution, numberOfChildrenForJustifyContent);
|
| }
|
|
|
| if (isColumnFlow())
|
| @@ -1393,12 +1406,15 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons
|
|
|
| void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace)
|
| {
|
| + ContentPosition position = styleRef().resolvedJustifyContentPosition(normalValueBehavior());
|
| + ContentDistributionType distribution = styleRef().resolvedJustifyContentDistribution(normalValueBehavior());
|
| +
|
| // This is similar to the logic in layoutAndPlaceChildren, except we place the children
|
| // starting from the end of the flexbox. We also don't need to layout anything since we're
|
| // just moving the children to a new position.
|
| size_t numberOfChildrenForJustifyContent = numberOfInFlowPositionedChildren(children);
|
| LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwarePaddingEnd();
|
| - mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, style()->justifyContentPosition(), style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
|
| + mainAxisOffset -= initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent);
|
| mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight();
|
|
|
| size_t seenInFlowPositionedChildren = 0;
|
| @@ -1417,7 +1433,7 @@ void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children,
|
|
|
| ++seenInFlowPositionedChildren;
|
| if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
|
| - mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSpace, style()->justifyContentDistribution(), numberOfChildrenForJustifyContent);
|
| + mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSpace, distribution, numberOfChildrenForJustifyContent);
|
| }
|
| }
|
|
|
| @@ -1451,6 +1467,9 @@ static LayoutUnit alignContentSpaceBetweenChildren(LayoutUnit availableFreeSpace
|
|
|
| void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
|
| {
|
| + ContentPosition position = styleRef().resolvedAlignContentPosition(normalValueBehavior());
|
| + ContentDistributionType distribution = styleRef().resolvedAlignContentDistribution(normalValueBehavior());
|
| +
|
| // If we have a single line flexbox or a multiline line flexbox with only one flex line,
|
| // the line height is all the available space.
|
| // For flex-direction: row, this means we need to use the height, so we do this after calling updateLogicalHeight.
|
| @@ -1459,7 +1478,7 @@ void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
|
| return;
|
| }
|
|
|
| - if (style()->alignContentPosition() == ContentPositionFlexStart)
|
| + if (position == ContentPositionFlexStart)
|
| return;
|
|
|
| LayoutUnit availableCrossAxisSpace = crossAxisContentExtent();
|
| @@ -1467,16 +1486,16 @@ void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts)
|
| availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
|
|
|
| LayoutBox* child = m_orderIterator.first();
|
| - LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, style()->alignContentPosition(), style()->alignContentDistribution(), lineContexts.size());
|
| + LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, position, distribution, lineContexts.size());
|
| for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
|
| lineContexts[lineNumber].crossAxisOffset += lineOffset;
|
| for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numberOfChildren; ++childNumber, child = m_orderIterator.next())
|
| adjustAlignmentForChild(*child, lineOffset);
|
|
|
| - if (style()->alignContentDistribution() == ContentDistributionStretch && availableCrossAxisSpace > 0)
|
| + if (distribution == ContentDistributionStretch && availableCrossAxisSpace > 0)
|
| lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size());
|
|
|
| - lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, style()->alignContentDistribution(), lineContexts.size());
|
| + lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, distribution, lineContexts.size());
|
| }
|
| }
|
|
|
|
|