Changeset 109799 in webkit
- Timestamp:
- Mar 5, 2012 1:59:10 PM (12 years ago)
- Location:
- trunk
- Files:
-
- 4 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r109797 r109799 1 2012-03-05 Tony Chang <tony@chromium.org> 2 3 Implement flex-wrap: wrap 4 https://bugs.webkit.org/show_bug.cgi?id=79930 5 6 Reviewed by David Hyatt. 7 8 * css3/flexbox/multiline-align-expected.txt: Added. 9 * css3/flexbox/multiline-align.html: Added. 10 * css3/flexbox/multiline-expected.txt: Added. 11 * css3/flexbox/multiline.html: Added. 12 1 13 2012-03-05 Stephen White <senorblanco@chromium.org> 2 14 -
trunk/Source/WebCore/ChangeLog
r109798 r109799 1 2012-03-05 Tony Chang <tony@chromium.org> 2 3 Implement flex-wrap: wrap 4 https://bugs.webkit.org/show_bug.cgi?id=79930 5 6 Reviewed by David Hyatt. 7 8 Tests: css3/flexbox/multiline-align.html 9 css3/flexbox/multiline.html 10 11 * rendering/RenderBox.cpp: 12 (WebCore::RenderBox::sizesToIntrinsicLogicalWidth): Don't apply column+stretch optimization to multiline. 13 * rendering/RenderFlexibleBox.cpp: 14 (WebCore::RenderFlexibleBox::FlexOrderIterator::FlexOrderIterator): 15 (WebCore::RenderFlexibleBox::FlexOrderIterator::currentChild): Expose the current child so we can pause 16 in the middle of iteration and resume later. 17 (RenderFlexibleBox::FlexOrderIterator): 18 (WebCore::RenderFlexibleBox::isMultiline): 19 (WebCore): 20 (WebCore::RenderFlexibleBox::layoutFlexItems): Loop per line. 21 (WebCore::RenderFlexibleBox::availableAlignmentSpaceForChild): Use the line space, not the whole container space. 22 (WebCore::RenderFlexibleBox::computeFlexOrder): Return true for each line. 23 (WebCore::RenderFlexibleBox::layoutAndPlaceChildren): Use the line offset. Also compute the line height as we go. 24 (WebCore::RenderFlexibleBox::layoutColumnReverse): Use the line offset. 25 (WebCore::RenderFlexibleBox::alignChildren): Align based on the line height. For multiline + column, we have to relayout 26 since the width may change (same as the row case above). We'll have to do something smarter when we implement flex-line-pack. 27 * rendering/RenderFlexibleBox.h: 28 (RenderFlexibleBox): 29 1 30 2012-03-05 Ben Vanik <benvanik@google.com> 2 31 -
trunk/Source/WebCore/rendering/RenderBox.cpp
r109785 r109799 1842 1842 // stretched size to avoid an extra layout when applying alignment. 1843 1843 if (parent()->isFlexibleBox()) { 1844 if (!parent()->style()->isColumnFlexDirection()) 1844 // For multiline columns, we need to apply the flex-line-pack first, so we can't stretch now. 1845 if (!parent()->style()->isColumnFlexDirection() || parent()->style()->flexWrap() != FlexWrapNone) 1845 1846 return true; 1846 1847 EFlexAlign itemAlign = style()->flexItemAlign(); -
trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp
r109785 r109799 57 57 copyToVector(flexOrderValues, m_orderValues); 58 58 std::sort(m_orderValues.begin(), m_orderValues.end()); 59 } 59 first(); 60 } 61 62 RenderBox* currentChild() { return m_currentChild; } 60 63 61 64 RenderBox* first() … … 280 283 } 281 284 285 bool RenderFlexibleBox::isMultiline() const 286 { 287 return style()->flexWrap() != FlexWrapNone; 288 } 289 282 290 Length RenderFlexibleBox::mainAxisLengthForChild(RenderBox* child) const 283 291 { … … 510 518 float totalNegativeFlexibility; 511 519 FlexOrderIterator flexIterator(this, flexOrderValues); 512 computeFlexOrder(flexIterator, orderedChildren, preferredMainAxisExtent, totalPositiveFlexibility, totalNegativeFlexibility); 513 514 LayoutUnit availableFreeSpace = mainAxisContentExtent() - preferredMainAxisExtent; 515 InflexibleFlexItemSize inflexibleItems; 516 WTF::Vector<LayoutUnit> childSizes; 517 while (!runFreeSpaceAllocationAlgorithm(orderedChildren, availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) { 518 ASSERT(totalPositiveFlexibility >= 0 && totalNegativeFlexibility >= 0); 519 ASSERT(inflexibleItems.size() > 0); 520 } 521 522 layoutAndPlaceChildren(orderedChildren, childSizes, availableFreeSpace); 520 521 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore(); 522 LayoutUnit mainAxisFlexibleSpace = mainAxisContentExtent(); 523 while (computeNextFlexLine(flexIterator, orderedChildren, preferredMainAxisExtent, totalPositiveFlexibility, totalNegativeFlexibility)) { 524 LayoutUnit availableFreeSpace = mainAxisFlexibleSpace - preferredMainAxisExtent; 525 InflexibleFlexItemSize inflexibleItems; 526 WTF::Vector<LayoutUnit> childSizes; 527 while (!runFreeSpaceAllocationAlgorithm(orderedChildren, availableFreeSpace, totalPositiveFlexibility, totalNegativeFlexibility, inflexibleItems, childSizes)) { 528 ASSERT(totalPositiveFlexibility >= 0 && totalNegativeFlexibility >= 0); 529 ASSERT(inflexibleItems.size() > 0); 530 } 531 532 layoutAndPlaceChildren(crossAxisOffset, orderedChildren, childSizes, availableFreeSpace); 533 } 523 534 524 535 // direction:rtl + flex-direction:column means the cross-axis direction is flipped. … … 536 547 } 537 548 538 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChild(RenderBox* child) 539 { 540 LayoutUnit crossContentExtent = crossAxisContentExtent(); 549 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChild(LayoutUnit lineCrossAxisExtent, RenderBox* child) 550 { 541 551 LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAxisExtentForChild(child); 542 return crossContentExtent - childCrossExtent;552 return lineCrossAxisExtent - childCrossExtent; 543 553 } 544 554 … … 580 590 } 581 591 582 void RenderFlexibleBox::computeFlexOrder(FlexOrderIterator& iterator, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility)592 bool RenderFlexibleBox::computeNextFlexLine(FlexOrderIterator& iterator, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility) 583 593 { 584 594 orderedChildren.clear(); 585 595 preferredMainAxisExtent = 0; 586 596 totalPositiveFlexibility = totalNegativeFlexibility = 0; 587 for (RenderBox* child = iterator.first(); child; child = iterator.next()) { 588 orderedChildren.append(child); 589 if (child->isPositioned()) 597 598 if (!iterator.currentChild()) 599 return false; 600 601 for (RenderBox* child = iterator.currentChild(); child; child = iterator.next()) { 602 if (child->isPositioned()) { 603 orderedChildren.append(child); 590 604 continue; 605 } 591 606 592 607 LayoutUnit childMainAxisExtent = mainAxisBorderAndPaddingExtentForChild(child) + preferredMainAxisContentExtentForChild(child); … … 596 611 childMainAxisExtent += child->marginTop() + child->marginBottom(); 597 612 598 // FIXME: When implementing multiline, we would return here if adding 599 // the child's main axis extent would cause us to overflow. 613 if (isMultiline() && preferredMainAxisExtent + childMainAxisExtent > mainAxisContentExtent() && orderedChildren.size() > 0) 614 break; 615 orderedChildren.append(child); 600 616 preferredMainAxisExtent += childMainAxisExtent; 601 617 totalPositiveFlexibility += positiveFlexForChild(child); 602 618 totalNegativeFlexibility += negativeFlexForChild(child); 603 619 } 620 return true; 604 621 } 605 622 … … 715 732 } 716 733 717 void RenderFlexibleBox::layoutAndPlaceChildren( const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace)734 void RenderFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace) 718 735 { 719 736 LayoutUnit mainAxisOffset = flowAwareBorderStart() + flowAwarePaddingStart(); … … 722 739 mainAxisOffset += isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); 723 740 724 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore();725 741 LayoutUnit totalMainExtent = mainAxisExtent(); 726 742 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when flex-align: baseline. 743 LayoutUnit maxChildCrossAxisExtent = 0; 727 744 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 728 745 for (size_t i = 0; i < children.size(); ++i) { … … 750 767 childCrossAxisExtent = crossAxisExtentForChild(child); 751 768 if (crossAxisLength().isAuto()) 752 setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + childCrossAxisExtent + crossAxisScrollbarExtent())); 769 setCrossAxisExtent(std::max(crossAxisExtent(), crossAxisOffset - flowAwareBorderBefore() - flowAwarePaddingBefore() + crossAxisBorderAndPaddingExtent() + crossAxisMarginExtentForChild(child) + childCrossAxisExtent + crossAxisScrollbarExtent())); 770 maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAxisExtent + crossAxisMarginExtentForChild(child)); 753 771 754 772 mainAxisOffset += flowAwareMarginStartForChild(child); … … 772 790 // on the height of the flexbox, which we only know after we've positioned all the flex items. 773 791 computeLogicalHeight(); 774 layoutColumnReverse(children, childSizes, availableFreeSpace); 775 } 776 777 alignChildren(children, maxAscent); 778 } 779 780 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace) 792 layoutColumnReverse(children, childSizes, crossAxisOffset, availableFreeSpace); 793 } 794 795 LayoutUnit lineCrossAxisExtent = isMultiline() ? maxChildCrossAxisExtent : crossAxisContentExtent(); 796 alignChildren(children, lineCrossAxisExtent, maxAscent); 797 798 crossAxisOffset += lineCrossAxisExtent; 799 } 800 801 void RenderFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace) 781 802 { 782 803 // This is similar to the logic in layoutAndPlaceChildren, except we place the children … … 787 808 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontalScrollbarHeight(); 788 809 789 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefore();790 810 for (size_t i = 0; i < children.size(); ++i) { 791 811 RenderBox* child = children[i]; … … 820 840 } 821 841 822 void RenderFlexibleBox::alignChildren(const OrderedFlexItemList& children, LayoutUnit maxAscent)842 void RenderFlexibleBox::alignChildren(const OrderedFlexItemList& children, LayoutUnit lineCrossAxisExtent, LayoutUnit maxAscent) 823 843 { 824 844 for (size_t i = 0; i < children.size(); ++i) { … … 831 851 if (!isColumnFlow() && child->style()->logicalHeight().isAuto()) { 832 852 LayoutUnit logicalHeightBefore = child->logicalHeight(); 833 LayoutUnit stretchedLogicalHeight = child->logicalHeight() + RenderFlexibleBox::availableAlignmentSpaceForChild(child);853 LayoutUnit stretchedLogicalHeight = child->logicalHeight() + availableAlignmentSpaceForChild(lineCrossAxisExtent, child); 834 854 child->setLogicalHeight(stretchedLogicalHeight); 835 855 child->computeLogicalHeight(); … … 841 861 child->layoutIfNeeded(); 842 862 } 863 } else if (isColumnFlow() && child->style()->logicalWidth().isAuto() && isMultiline()) { 864 // FIXME: Handle min-width and max-width. 865 LayoutUnit childWidth = lineCrossAxisExtent - crossAxisMarginExtentForChild(child); 866 child->setOverrideWidth(std::max(0, childWidth)); 867 child->setChildNeedsLayout(true); 868 child->layoutIfNeeded(); 843 869 } 844 870 break; … … 847 873 break; 848 874 case AlignEnd: 849 adjustAlignmentForChild(child, RenderFlexibleBox::availableAlignmentSpaceForChild(child));875 adjustAlignmentForChild(child, availableAlignmentSpaceForChild(lineCrossAxisExtent, child)); 850 876 break; 851 877 case AlignCenter: 852 adjustAlignmentForChild(child, RenderFlexibleBox::availableAlignmentSpaceForChild(child) / 2);878 adjustAlignmentForChild(child, availableAlignmentSpaceForChild(lineCrossAxisExtent, child) / 2); 853 879 break; 854 880 case AlignBaseline: { -
trunk/Source/WebCore/rendering/RenderFlexibleBox.h
r108876 r109799 60 60 bool isColumnFlow() const; 61 61 bool isLeftToRightFlow() const; 62 bool isMultiline() const; 62 63 Length crossAxisLength() const; 63 64 Length mainAxisLengthForChild(RenderBox* child) const; … … 96 97 float negativeFlexForChild(RenderBox* child) const; 97 98 98 LayoutUnit availableAlignmentSpaceForChild( RenderBox*);99 LayoutUnit availableAlignmentSpaceForChild(LayoutUnit lineCrossAxisExtent, RenderBox*); 99 100 LayoutUnit marginBoxAscent(RenderBox*); 100 101 101 102 void computeMainAxisPreferredSizes(bool relayoutChildren, FlexOrderHashSet&); 102 void computeFlexOrder(FlexOrderIterator&, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility);103 bool computeNextFlexLine(FlexOrderIterator&, OrderedFlexItemList& orderedChildren, LayoutUnit& preferredMainAxisExtent, float& totalPositiveFlexibility, float& totalNegativeFlexibility); 103 104 bool runFreeSpaceAllocationAlgorithm(const OrderedFlexItemList&, LayoutUnit& availableFreeSpace, float& totalPositiveFlexibility, float& totalNegativeFlexibility, InflexibleFlexItemSize&, WTF::Vector<LayoutUnit>& childSizes); 104 105 void setLogicalOverrideSize(RenderBox* child, LayoutUnit childPreferredSize); 105 106 void prepareChildForPositionedLayout(RenderBox* child, LayoutUnit mainAxisOffset, LayoutUnit crossAxisOffset); 106 void layoutAndPlaceChildren( const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace);107 void layoutColumnReverse(const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace);108 void alignChildren(const OrderedFlexItemList&, LayoutUnit maxAscent);107 void layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit availableFreeSpace); 108 void layoutColumnReverse(const OrderedFlexItemList&, const WTF::Vector<LayoutUnit>& childSizes, LayoutUnit crossAxisOffset, LayoutUnit availableFreeSpace); 109 void alignChildren(const OrderedFlexItemList&, LayoutUnit lineCrossAxisExtent, LayoutUnit maxAscent); 109 110 void flipForRightToLeftColumn(FlexOrderIterator&); 110 111 };
Note: See TracChangeset
for help on using the changeset viewer.