Chromium Code Reviews| 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 865c52edd13b30c58097534f46551aec07ee7312..ebb82fdfa089c63307b4bfe0bef8e1831b1d6002 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp |
| @@ -1314,17 +1314,122 @@ void LayoutFlexibleBox::setOverrideMainAxisSizeForChild(LayoutBox& child, Layout |
| child.setOverrideLogicalContentWidth(childPreferredSize - child.borderAndPaddingLogicalWidth()); |
| } |
| -void LayoutFlexibleBox::prepareChildForPositionedLayout(LayoutBox& child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset, PositionedLayoutMode layoutMode) |
| +LayoutUnit LayoutFlexibleBox::staticMainAxisPositionForPositionedChild(const LayoutBox& child) |
| +{ |
| + const LayoutUnit mainAxisExtent = mainAxisContentExtent(contentLogicalHeight()); |
| + |
| + ContentPosition position = styleRef().resolvedJustifyContentPosition(normalValueBehavior()); |
| + ContentDistributionType distribution = styleRef().resolvedJustifyContentDistribution(normalValueBehavior()); |
| + // TODO(cbiesinger): Support the other values for these properties (we're not shipping them yet) |
| + // TODO(cbiesinger): what should row-reverse/column-reverse do? https://lists.w3.org/Archives/Public/www-style/2016Apr/0387.html |
| + switch (position) { |
| + case ContentPositionFlexEnd: |
| + return (mainAxisExtent - mainAxisExtentForChild(child)); |
| + case ContentPositionCenter: |
| + return (mainAxisExtent - mainAxisExtentForChild(child)) / 2; |
| + default: |
| + break; |
| + } |
| + switch (distribution) { |
|
eae
2016/04/25 02:37:28
Probably easier to use a regular if statement here
cbiesinger
2016/04/26 18:21:56
I realized I can simplify this by reusing code, so
|
| + case ContentDistributionSpaceAround: |
| + return (mainAxisExtent - mainAxisExtentForChild(child)) / 2; |
| + default: |
| + break; |
| + } |
| + return LayoutUnit(); |
| +} |
| + |
| +LayoutUnit LayoutFlexibleBox::staticCrossAxisPositionForPositionedChild(const LayoutBox& child) |
| +{ |
| + switch (alignmentForChild(child)) { |
| + case ItemPositionAuto: |
| + case ItemPositionStretch: |
| + return LayoutUnit(); // static position is unaffected by stretching |
| + case ItemPositionBaseline: |
| + case ItemPositionLastBaseline: |
| + return LayoutUnit(); |
| + case ItemPositionCenter: |
| + return (crossAxisContentExtent() - crossAxisExtentForChild(child)) / 2; |
| + case ItemPositionStart: |
| + case ItemPositionFlexStart: |
| + // These are equivalent here because alignmentForChild maps |
| + // flex-start to flex-end when they would be different. |
| + return LayoutUnit(); |
| + case ItemPositionEnd: |
| + case ItemPositionFlexEnd: |
| + return (crossAxisContentExtent() - crossAxisExtentForChild(child)); |
| + case ItemPositionSelfStart: |
| + // TODO(cbiesinger): Support this value (not shipped yet) |
| + return LayoutUnit(); |
| + case ItemPositionSelfEnd: |
| + // TODO(cbiesinger): Support this value (not shipped yet) |
| + return LayoutUnit(); |
| + case ItemPositionLeft: |
| + if (!isHorizontalFlow()) |
| + return LayoutUnit(); |
| + if (styleRef().isLeftToRightDirection()) |
| + return LayoutUnit(); |
| + return (crossAxisContentExtent() - crossAxisExtentForChild(child)); |
| + case ItemPositionRight: |
| + if (!isHorizontalFlow()) |
| + return LayoutUnit(); |
| + if (!styleRef().isLeftToRightDirection()) |
| + return LayoutUnit(); |
| + return (crossAxisContentExtent() - crossAxisExtentForChild(child)); |
| + } |
| + return LayoutUnit(); |
| +} |
| + |
| +LayoutUnit LayoutFlexibleBox::staticInlinePositionForPositionedChild(const LayoutBox& child) |
| +{ |
| + LayoutUnit staticInlineOffset = flowAwareBorderStart() + flowAwarePaddingStart(); |
| + if (isColumnFlow()) |
|
eae
2016/04/25 02:37:28
(optional) There is a bit of code duplication here
cbiesinger
2016/04/26 18:21:56
I like the second idea, thanks! Changed, modulo so
|
| + return staticInlineOffset + staticCrossAxisPositionForPositionedChild(child); |
| + return staticInlineOffset + staticMainAxisPositionForPositionedChild(child); |
| +} |
| + |
| +LayoutUnit LayoutFlexibleBox::staticBlockPositionForPositionedChild(const LayoutBox& child) |
| +{ |
| + LayoutUnit staticBlockOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); |
| + if (isColumnFlow()) |
| + return staticBlockOffset + staticMainAxisPositionForPositionedChild(child); |
| + return staticBlockOffset + staticCrossAxisPositionForPositionedChild(child); |
| +} |
| + |
| +bool LayoutFlexibleBox::setStaticPositionForPositionedLayout(LayoutBox& child) |
| +{ |
| + bool positionChanged = false; |
| + PaintLayer* childLayer = child.layer(); |
| + if (child.styleRef().hasStaticInlinePosition(styleRef().isHorizontalWritingMode())) { |
| + LayoutUnit inlinePosition = staticInlinePositionForPositionedChild(child); |
| + if (childLayer->staticInlinePosition() != inlinePosition) { |
| + childLayer->setStaticInlinePosition(inlinePosition); |
| + positionChanged = true; |
| + } |
| + } |
| + if (child.styleRef().hasStaticBlockPosition(styleRef().isHorizontalWritingMode())) { |
| + LayoutUnit blockPosition = staticBlockPositionForPositionedChild(child); |
| + if (childLayer->staticBlockPosition() != blockPosition) { |
| + childLayer->setStaticBlockPosition(blockPosition); |
| + positionChanged = true; |
| + } |
| + } |
| + return positionChanged; |
| +} |
| + |
| +void LayoutFlexibleBox::prepareChildForPositionedLayout(LayoutBox& child) |
| { |
| ASSERT(child.isOutOfFlowPositioned()); |
| child.containingBlock()->insertPositionedObject(&child); |
| PaintLayer* childLayer = child.layer(); |
| - LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffset; |
| - if (layoutMode == FlipForRowReverse && style()->flexDirection() == FlowRowReverse) |
| - inlinePosition = mainAxisExtent() - mainAxisOffset; |
| - childLayer->setStaticInlinePosition(inlinePosition); |
| + LayoutUnit staticInlinePosition = flowAwareBorderStart() + flowAwarePaddingStart(); |
| + if (childLayer->staticInlinePosition() != staticInlinePosition) { |
| + childLayer->setStaticInlinePosition(staticInlinePosition); |
| + if (child.style()->hasStaticInlinePosition(style()->isHorizontalWritingMode())) |
| + child.setChildNeedsLayout(MarkOnlyThis); |
| + } |
| - LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxisOffset; |
| + LayoutUnit staticBlockPosition = flowAwareBorderBefore() + flowAwarePaddingBefore(); |
| if (childLayer->staticBlockPosition() != staticBlockPosition) { |
| childLayer->setStaticBlockPosition(staticBlockPosition); |
| if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMode())) |
| @@ -1446,7 +1551,7 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons |
| LayoutBox* child = children[i]; |
| if (child->isOutOfFlowPositioned()) { |
| - prepareChildForPositionedLayout(*child, mainAxisOffset, crossAxisOffset, FlipForRowReverse); |
| + prepareChildForPositionedLayout(*child); |
| continue; |
| } |
| @@ -1544,10 +1649,9 @@ void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, |
| for (size_t i = 0; i < children.size(); ++i) { |
| LayoutBox* child = children[i]; |
| - if (child->isOutOfFlowPositioned()) { |
| - child->layer()->setStaticBlockPosition(mainAxisOffset); |
| + if (child->isOutOfFlowPositioned()) |
| continue; |
| - } |
| + |
| mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndForChild(*child); |
| setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAxisOffset + flowAwareMarginBeforeForChild(*child))); |
| @@ -1624,15 +1728,8 @@ void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) |
| void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit delta) |
| { |
| - if (child.isOutOfFlowPositioned()) { |
| - LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition(); |
| - LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition(); |
| - LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlinePosition; |
| - LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlockPosition; |
| - crossAxis += delta; |
| - prepareChildForPositionedLayout(child, mainAxis, crossAxis, NoFlipForRowReverse); |
| + if (child.isOutOfFlowPositioned()) |
| return; |
| - } |
| setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + LayoutSize(LayoutUnit(), delta)); |
| } |