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 b7ab63ea86b52cb9f0b03a7d11b1a7e03e175713..28090ecde820d2355c97689736368741834e006b 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp |
| @@ -241,6 +241,64 @@ int LayoutFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const |
| return synthesizedBaselineFromContentBox(*this, direction) + marginAscent; |
| } |
| +IntSize LayoutFlexibleBox::originAdjustmentForScrollbars() const |
| +{ |
| + IntSize size; |
| + int adjustmentWidth = verticalScrollbarWidth(); |
| + int adjustmentHeight = horizontalScrollbarHeight(); |
| + if (!adjustmentWidth && !adjustmentHeight) |
| + return size; |
| + |
| + EFlexDirection flexDirection = style()->flexDirection(); |
| + TextDirection textDirection = style()->direction(); |
| + WritingMode writingMode = style()->getWritingMode(); |
| + |
| + if (flexDirection == FlowRow) { |
|
leviw_travelin_and_unemployed
2016/05/10 17:52:42
This is super easy to follow now, but I can totall
|
| + if (textDirection == RTL) { |
| + if (writingMode == TopToBottomWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + else |
| + size.expand(0, adjustmentHeight); |
| + } |
| + if (writingMode == RightToLeftWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + } else if (flexDirection == FlowRowReverse) { |
| + if (textDirection == LTR) { |
| + if (writingMode == TopToBottomWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + else |
| + size.expand(0, adjustmentHeight); |
| + } |
| + if (writingMode == RightToLeftWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + } else if (flexDirection == FlowColumn) { |
| + if (writingMode == RightToLeftWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + } else { |
| + if (writingMode == TopToBottomWritingMode) |
| + size.expand(0, adjustmentHeight); |
| + else if (writingMode == LeftToRightWritingMode) |
| + size.expand(adjustmentWidth, 0); |
| + } |
| + return size; |
| +} |
| + |
| +bool LayoutFlexibleBox::hasTopOverflow() const |
| +{ |
| + EFlexDirection flexDirection = style()->flexDirection(); |
| + if (isHorizontalWritingMode()) |
| + return flexDirection == FlowColumnReverse; |
| + return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReverse : FlowRow); |
| +} |
| + |
| +bool LayoutFlexibleBox::hasLeftOverflow() const |
| +{ |
| + EFlexDirection flexDirection = style()->flexDirection(); |
| + if (isHorizontalWritingMode()) |
| + return flexDirection == (style()->isLeftToRightDirection() ? FlowRowReverse : FlowRow); |
| + return flexDirection == FlowColumnReverse; |
| +} |
| + |
| void LayoutFlexibleBox::removeChild(LayoutObject* child) |
| { |
| LayoutBlock::removeChild(child); |
| @@ -1532,10 +1590,12 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons |
| LayoutUnit autoMarginOffset = autoMarginOffsetInMainAxis(children, availableFreeSpace); |
| LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart(); |
| mainAxisOffset += initialJustifyContentOffset(availableFreeSpace, position, distribution, numberOfChildrenForJustifyContent); |
| - if (style()->flexDirection() == FlowRowReverse) |
| + if (style()->flexDirection() == FlowRowReverse && shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); |
| LayoutUnit totalMainExtent = mainAxisExtent(); |
| + if (!shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) |
| + totalMainExtent -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); |
| LayoutUnit maxAscent, maxDescent; // Used when align-items: baseline. |
| LayoutUnit maxChildCrossAxisExtent; |
| size_t seenInFlowPositionedChildren = 0; |
| @@ -1599,7 +1659,6 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, cons |
| // This will be fixed later in flipForRightToLeftColumn. |
| LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxisOffset - childMainExtent : mainAxisOffset, |
| crossAxisOffset + flowAwareMarginBeforeForChild(*child)); |
| - |
| setFlowAwareLocationForChild(*child, childLocation); |
| mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child); |
| @@ -1827,6 +1886,8 @@ void LayoutFlexibleBox::flipForRightToLeftColumn() |
| // For vertical flows, setFlowAwareLocationForChild will transpose x and y, |
| // so using the y axis for a column cross axis extent is correct. |
| location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y()); |
| + if (!isHorizontalWritingMode()) |
| + location.move(LayoutSize(0, -horizontalScrollbarHeight())); |
| setFlowAwareLocationForChild(*child, location); |
| } |
| } |