diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-02-03 09:55:33 +0100 |
commit | cd44dc59cdfc39534aef4d417e9f3c412e3be139 (patch) | |
tree | 8d89889ba95ed6ec9322e733846cc9cce9d7dff1 /Source/WebCore/rendering/RenderFlexibleBox.cpp | |
parent | d11f84f5b5cdc0d92a08af01b13472fdd5f9acb9 (diff) | |
download | qtwebkit-cd44dc59cdfc39534aef4d417e9f3c412e3be139.tar.gz |
Imported WebKit commit fce473cb4d55aa9fe9d0b0322a2fffecb731b961 (http://svn.webkit.org/repository/webkit/trunk@106560)
Diffstat (limited to 'Source/WebCore/rendering/RenderFlexibleBox.cpp')
-rw-r--r-- | Source/WebCore/rendering/RenderFlexibleBox.cpp | 58 |
1 files changed, 46 insertions, 12 deletions
diff --git a/Source/WebCore/rendering/RenderFlexibleBox.cpp b/Source/WebCore/rendering/RenderFlexibleBox.cpp index 0a646d993..45543fe90 100644 --- a/Source/WebCore/rendering/RenderFlexibleBox.cpp +++ b/Source/WebCore/rendering/RenderFlexibleBox.cpp @@ -175,6 +175,14 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, int, BlockLayoutPass) m_overflow.clear(); + // For overflow:scroll blocks, ensure we have both scrollbars in place always. + if (scrollsOverflow()) { + if (style()->overflowX() == OSCROLL) + layer()->setHasHorizontalScrollbar(true); + if (style()->overflowY() == OSCROLL) + layer()->setHasVerticalScrollbar(true); + } + layoutFlexItems(relayoutChildren); LayoutUnit oldClientAfterEdge = clientLogicalBottom(); @@ -191,6 +199,11 @@ void RenderFlexibleBox::layoutBlock(bool relayoutChildren, int, BlockLayoutPass) updateLayerTransform(); + // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if + // we overflow or not. + if (hasOverflowClip()) + layer()->updateScrollInfoAfterLayout(); + repainter.repaintAfterLayout(); setNeedsLayout(false); @@ -403,6 +416,11 @@ LayoutUnit RenderFlexibleBox::crossAxisMarginExtentForChild(RenderBox* child) co return isHorizontalFlow() ? child->marginTop() + child->marginBottom() : child->marginLeft() + child->marginRight(); } +LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtent() const +{ + return isHorizontalFlow() ? horizontalScrollbarHeight() : verticalScrollbarWidth(); +} + LayoutPoint RenderFlexibleBox::flowAwareLocationForChild(RenderBox* child) const { return isHorizontalFlow() ? child->location() : child->location().transposedPoint(); @@ -573,21 +591,27 @@ static bool hasPackingSpace(LayoutUnit availableFreeSpace, float totalPositiveFl return availableFreeSpace > 0 && !totalPositiveFlexibility; } -static LayoutUnit initialPackingOffset(LayoutUnit availableFreeSpace, float totalPositiveFlexibility, EFlexPack flexPack) +static LayoutUnit initialPackingOffset(LayoutUnit availableFreeSpace, float totalPositiveFlexibility, EFlexPack flexPack, size_t numberOfChildren) { if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility)) { if (flexPack == PackEnd) return availableFreeSpace; if (flexPack == PackCenter) return availableFreeSpace / 2; + if (flexPack == PackDistribute && numberOfChildren) + return availableFreeSpace / (2 * numberOfChildren); } return 0; } static LayoutUnit packingSpaceBetweenChildren(LayoutUnit availableFreeSpace, float totalPositiveFlexibility, EFlexPack flexPack, size_t numberOfChildren) { - if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility) && flexPack == PackJustify && numberOfChildren > 1) - return availableFreeSpace / (numberOfChildren - 1); + if (hasPackingSpace(availableFreeSpace, totalPositiveFlexibility) && numberOfChildren > 1) { + if (flexPack == PackJustify) + return availableFreeSpace / (numberOfChildren - 1); + if (flexPack == PackDistribute) + return availableFreeSpace / numberOfChildren; + } return 0; } @@ -618,10 +642,20 @@ void RenderFlexibleBox::prepareChildForPositionedLayout(RenderBox* child, Layout } } +static EFlexAlign flexAlignForChild(RenderBox* child) +{ + EFlexAlign align = child->style()->flexItemAlign(); + if (align == AlignAuto) + return child->parent()->style()->flexAlign(); + return align; +} + void RenderFlexibleBox::layoutAndPlaceChildren(FlexOrderIterator& iterator, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace, float totalPositiveFlexibility) { LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart(); - mainAxisOffset += initialPackingOffset(availableFreeSpace, totalPositiveFlexibility, style()->flexPack()); + mainAxisOffset += initialPackingOffset(availableFreeSpace, totalPositiveFlexibility, style()->flexPack(), childSizes.size()); + if (style()->flexDirection() == FlowRowReverse) + mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); LayoutUnit totalMainExtent = mainAxisExtent(); @@ -639,18 +673,17 @@ void RenderFlexibleBox::layoutAndPlaceChildren(FlexOrderIterator& iterator, cons child->setChildNeedsLayout(true); child->layoutIfNeeded(); - if (child->style()->flexItemAlign() == AlignBaseline) { + if (flexAlignForChild(child) == AlignBaseline) { LayoutUnit ascent = marginBoxAscent(child); LayoutUnit descent = (crossAxisMarginExtentForChild(child) + crossAxisExtentForChild(child)) - ascent; maxAscent = std::max(maxAscent, ascent); maxDescent = std::max(maxDescent, descent); - // FIXME: add flowAwareScrollbarLogicalHeight. if (crossAxisLength().isAuto()) - setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + maxAscent + maxDescent + scrollbarLogicalHeight())); + setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + maxAscent + maxDescent + crossAxisScrollbarExtent())); } else if (crossAxisLength().isAuto()) - setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + crossAxisExtentForChild(child) + scrollbarLogicalHeight())); + setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + crossAxisExtentForChild(child) + crossAxisScrollbarExtent())); mainAxisOffset += flowAwareMarginStartForChild(child); @@ -665,7 +698,7 @@ void RenderFlexibleBox::layoutAndPlaceChildren(FlexOrderIterator& iterator, cons mainAxisOffset += packingSpaceBetweenChildren(availableFreeSpace, totalPositiveFlexibility, style()->flexPack(), childSizes.size()); if (isColumnFlow()) - setLogicalHeight(mainAxisOffset); + setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddingEnd() + scrollbarLogicalHeight()); } if (style()->flexDirection() == FlowColumnReverse) { @@ -684,7 +717,8 @@ void RenderFlexibleBox::layoutColumnReverse(FlexOrderIterator& iterator, const W // 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. LayoutUnit mainAxisOffset = logicalHeight() - flowAwareBorderEnd() - flowAwarePaddingEnd(); - mainAxisOffset -= initialPackingOffset(availableFreeSpace, totalPositiveFlexibility, style()->flexPack()); + mainAxisOffset -= initialPackingOffset(availableFreeSpace, totalPositiveFlexibility, style()->flexPack(), childSizes.size()); + mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); size_t i = 0; @@ -732,9 +766,9 @@ void RenderFlexibleBox::alignChildren(FlexOrderIterator& iterator, LayoutUnit ma } // FIXME: Make sure this does the right thing with column flows. - switch (child->style()->flexItemAlign()) { + switch (flexAlignForChild(child)) { case AlignAuto: - // FIXME: Handle this once we add flex-align. + ASSERT_NOT_REACHED(); break; case AlignStretch: { if (!isColumnFlow() && child->style()->logicalHeight().isAuto()) { |