Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Side by Side Diff: Source/core/rendering/RenderFlexibleBox.cpp

Issue 560583003: Use more RenderBox references in RenderFlexibleBox (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@renderBoxReferences1
Patch Set: Rebase to master Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/core/rendering/RenderFlexibleBox.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 } 120 }
121 } 121 }
122 122
123 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); 123 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth);
124 124
125 LayoutUnit scrollbarWidth = instrinsicScrollbarLogicalWidth(); 125 LayoutUnit scrollbarWidth = instrinsicScrollbarLogicalWidth();
126 maxLogicalWidth += scrollbarWidth; 126 maxLogicalWidth += scrollbarWidth;
127 minLogicalWidth += scrollbarWidth; 127 minLogicalWidth += scrollbarWidth;
128 } 128 }
129 129
130 static int synthesizedBaselineFromContentBox(const RenderBox* box, LineDirection Mode direction) 130 static int synthesizedBaselineFromContentBox(const RenderBox& box, LineDirection Mode direction)
131 { 131 {
132 return direction == HorizontalLine ? box->borderTop() + box->paddingTop() + box->contentHeight() : box->borderRight() + box->paddingRight() + box->contentWi dth(); 132 return direction == HorizontalLine ? box.borderTop() + box.paddingTop() + bo x.contentHeight() : box.borderRight() + box.paddingRight() + box.contentWidth();
133 } 133 }
134 134
135 int RenderFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di rection, LinePositionMode mode) const 135 int RenderFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di rection, LinePositionMode mode) const
136 { 136 {
137 ASSERT(mode == PositionOnContainingLine); 137 ASSERT(mode == PositionOnContainingLine);
138 int baseline = firstLineBoxBaseline(); 138 int baseline = firstLineBoxBaseline();
139 if (baseline == -1) 139 if (baseline == -1)
140 baseline = synthesizedBaselineFromContentBox(this, direction); 140 baseline = synthesizedBaselineFromContentBox(*this, direction);
141 141
142 return beforeMarginInLineDirection(direction) + baseline; 142 return beforeMarginInLineDirection(direction) + baseline;
143 } 143 }
144 144
145 int RenderFlexibleBox::firstLineBoxBaseline() const 145 int RenderFlexibleBox::firstLineBoxBaseline() const
146 { 146 {
147 if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0) 147 if (isWritingModeRoot() || m_numberOfInFlowChildrenOnFirstLine <= 0)
148 return -1; 148 return -1;
149 RenderBox* baselineChild = 0; 149 RenderBox* baselineChild = 0;
150 int childNumber = 0; 150 int childNumber = 0;
151 for (RenderBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 151 for (RenderBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
152 if (child->isOutOfFlowPositioned()) 152 if (child->isOutOfFlowPositioned())
153 continue; 153 continue;
154 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(child)) { 154 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(*child)) {
155 baselineChild = child; 155 baselineChild = child;
156 break; 156 break;
157 } 157 }
158 if (!baselineChild) 158 if (!baselineChild)
159 baselineChild = child; 159 baselineChild = child;
160 160
161 ++childNumber; 161 ++childNumber;
162 if (childNumber == m_numberOfInFlowChildrenOnFirstLine) 162 if (childNumber == m_numberOfInFlowChildrenOnFirstLine)
163 break; 163 break;
164 } 164 }
165 165
166 if (!baselineChild) 166 if (!baselineChild)
167 return -1; 167 return -1;
168 168
169 if (!isColumnFlow() && hasOrthogonalFlow(*baselineChild)) 169 if (!isColumnFlow() && hasOrthogonalFlow(*baselineChild))
170 return crossAxisExtentForChild(*baselineChild) + baselineChild->logicalT op(); 170 return crossAxisExtentForChild(*baselineChild) + baselineChild->logicalT op();
171 if (isColumnFlow() && !hasOrthogonalFlow(*baselineChild)) 171 if (isColumnFlow() && !hasOrthogonalFlow(*baselineChild))
172 return mainAxisExtentForChild(*baselineChild) + baselineChild->logicalTo p(); 172 return mainAxisExtentForChild(*baselineChild) + baselineChild->logicalTo p();
173 173
174 int baseline = baselineChild->firstLineBoxBaseline(); 174 int baseline = baselineChild->firstLineBoxBaseline();
175 if (baseline == -1) { 175 if (baseline == -1) {
176 // FIXME: We should pass |direction| into firstLineBoxBaseline and stop bailing out if we're a writing mode root. 176 // FIXME: We should pass |direction| into firstLineBoxBaseline and stop bailing out if we're a writing mode root.
177 // This would also fix some cases where the flexbox is orthogonal to its container. 177 // This would also fix some cases where the flexbox is orthogonal to its container.
178 LineDirectionMode direction = isHorizontalWritingMode() ? HorizontalLine : VerticalLine; 178 LineDirectionMode direction = isHorizontalWritingMode() ? HorizontalLine : VerticalLine;
179 return synthesizedBaselineFromContentBox(baselineChild, direction) + bas elineChild->logicalTop(); 179 return synthesizedBaselineFromContentBox(*baselineChild, direction) + ba selineChild->logicalTop();
180 } 180 }
181 181
182 return baseline + baselineChild->logicalTop(); 182 return baseline + baselineChild->logicalTop();
183 } 183 }
184 184
185 int RenderFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const 185 int RenderFlexibleBox::inlineBlockBaseline(LineDirectionMode direction) const
186 { 186 {
187 int baseline = firstLineBoxBaseline(); 187 int baseline = firstLineBoxBaseline();
188 if (baseline != -1) 188 if (baseline != -1)
189 return baseline; 189 return baseline;
190 190
191 int marginAscent = direction == HorizontalLine ? marginTop() : marginRight() ; 191 int marginAscent = direction == HorizontalLine ? marginTop() : marginRight() ;
192 return synthesizedBaselineFromContentBox(this, direction) + marginAscent; 192 return synthesizedBaselineFromContentBox(*this, direction) + marginAscent;
193 } 193 }
194 194
195 static ItemPosition resolveAlignment(const RenderStyle* parentStyle, const Rende rStyle* childStyle) 195 static ItemPosition resolveAlignment(const RenderStyle* parentStyle, const Rende rStyle* childStyle)
196 { 196 {
197 ItemPosition align = childStyle->alignSelf(); 197 ItemPosition align = childStyle->alignSelf();
198 if (align == ItemPositionAuto) 198 if (align == ItemPositionAuto)
199 align = (parentStyle->alignItems() == ItemPositionAuto) ? ItemPositionSt retch : parentStyle->alignItems(); 199 align = (parentStyle->alignItems() == ItemPositionAuto) ? ItemPositionSt retch : parentStyle->alignItems();
200 return align; 200 return align;
201 } 201 }
202 202
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
529 return paddingTop(); 529 return paddingTop();
530 case LeftToRightWritingMode: 530 case LeftToRightWritingMode:
531 return paddingRight(); 531 return paddingRight();
532 case RightToLeftWritingMode: 532 case RightToLeftWritingMode:
533 return paddingLeft(); 533 return paddingLeft();
534 } 534 }
535 ASSERT_NOT_REACHED(); 535 ASSERT_NOT_REACHED();
536 return paddingTop(); 536 return paddingTop();
537 } 537 }
538 538
539 LayoutUnit RenderFlexibleBox::flowAwareMarginStartForChild(RenderBox* child) con st 539 LayoutUnit RenderFlexibleBox::flowAwareMarginStartForChild(RenderBox& child) con st
540 { 540 {
541 if (isHorizontalFlow()) 541 if (isHorizontalFlow())
542 return isLeftToRightFlow() ? child->marginLeft() : child->marginRight(); 542 return isLeftToRightFlow() ? child.marginLeft() : child.marginRight();
543 return isLeftToRightFlow() ? child->marginTop() : child->marginBottom(); 543 return isLeftToRightFlow() ? child.marginTop() : child.marginBottom();
544 } 544 }
545 545
546 LayoutUnit RenderFlexibleBox::flowAwareMarginEndForChild(RenderBox* child) const 546 LayoutUnit RenderFlexibleBox::flowAwareMarginEndForChild(RenderBox& child) const
547 { 547 {
548 if (isHorizontalFlow()) 548 if (isHorizontalFlow())
549 return isLeftToRightFlow() ? child->marginRight() : child->marginLeft(); 549 return isLeftToRightFlow() ? child.marginRight() : child.marginLeft();
550 return isLeftToRightFlow() ? child->marginBottom() : child->marginTop(); 550 return isLeftToRightFlow() ? child.marginBottom() : child.marginTop();
551 } 551 }
552 552
553 LayoutUnit RenderFlexibleBox::flowAwareMarginBeforeForChild(RenderBox* child) co nst 553 LayoutUnit RenderFlexibleBox::flowAwareMarginBeforeForChild(RenderBox& child) co nst
554 { 554 {
555 switch (transformedWritingMode()) { 555 switch (transformedWritingMode()) {
556 case TopToBottomWritingMode: 556 case TopToBottomWritingMode:
557 return child->marginTop(); 557 return child.marginTop();
558 case BottomToTopWritingMode: 558 case BottomToTopWritingMode:
559 return child->marginBottom(); 559 return child.marginBottom();
560 case LeftToRightWritingMode: 560 case LeftToRightWritingMode:
561 return child->marginLeft(); 561 return child.marginLeft();
562 case RightToLeftWritingMode: 562 case RightToLeftWritingMode:
563 return child->marginRight(); 563 return child.marginRight();
564 } 564 }
565 ASSERT_NOT_REACHED(); 565 ASSERT_NOT_REACHED();
566 return marginTop(); 566 return marginTop();
567 } 567 }
568 568
569 LayoutUnit RenderFlexibleBox::crossAxisMarginExtentForChild(RenderBox* child) co nst 569 LayoutUnit RenderFlexibleBox::crossAxisMarginExtentForChild(RenderBox& child) co nst
570 { 570 {
571 return isHorizontalFlow() ? child->marginHeight() : child->marginWidth(); 571 return isHorizontalFlow() ? child.marginHeight() : child.marginWidth();
572 } 572 }
573 573
574 LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtent() const 574 LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtent() const
575 { 575 {
576 return isHorizontalFlow() ? horizontalScrollbarHeight() : verticalScrollbarW idth(); 576 return isHorizontalFlow() ? horizontalScrollbarHeight() : verticalScrollbarW idth();
577 } 577 }
578 578
579 LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtentForChild(RenderBox* child) const 579 LayoutUnit RenderFlexibleBox::crossAxisScrollbarExtentForChild(RenderBox& child) const
580 { 580 {
581 return isHorizontalFlow() ? child->horizontalScrollbarHeight() : child->vert icalScrollbarWidth(); 581 return isHorizontalFlow() ? child.horizontalScrollbarHeight() : child.vertic alScrollbarWidth();
582 } 582 }
583 583
584 LayoutPoint RenderFlexibleBox::flowAwareLocationForChild(RenderBox* child) const 584 LayoutPoint RenderFlexibleBox::flowAwareLocationForChild(RenderBox& child) const
585 { 585 {
586 return isHorizontalFlow() ? child->location() : child->location().transposed Point(); 586 return isHorizontalFlow() ? child.location() : child.location().transposedPo int();
587 } 587 }
588 588
589 void RenderFlexibleBox::setFlowAwareLocationForChild(RenderBox* child, const Lay outPoint& location) 589 void RenderFlexibleBox::setFlowAwareLocationForChild(RenderBox& child, const Lay outPoint& location)
590 { 590 {
591 if (isHorizontalFlow()) 591 if (isHorizontalFlow())
592 child->setLocation(location); 592 child.setLocation(location);
593 else 593 else
594 child->setLocation(location.transposedPoint()); 594 child.setLocation(location.transposedPoint());
595 } 595 }
596 596
597 LayoutUnit RenderFlexibleBox::mainAxisBorderAndPaddingExtentForChild(RenderBox* child) const 597 LayoutUnit RenderFlexibleBox::mainAxisBorderAndPaddingExtentForChild(RenderBox& child) const
598 { 598 {
599 return isHorizontalFlow() ? child->borderAndPaddingWidth() : child->borderAn dPaddingHeight(); 599 return isHorizontalFlow() ? child.borderAndPaddingWidth() : child.borderAndP addingHeight();
600 } 600 }
601 601
602 static inline bool preferredMainAxisExtentDependsOnLayout(const Length& flexBasi s, bool hasInfiniteLineLength) 602 static inline bool preferredMainAxisExtentDependsOnLayout(const Length& flexBasi s, bool hasInfiniteLineLength)
603 { 603 {
604 return flexBasis.isAuto() || (flexBasis.isPercent() && hasInfiniteLineLength ); 604 return flexBasis.isAuto() || (flexBasis.isPercent() && hasInfiniteLineLength );
605 } 605 }
606 606
607 bool RenderFlexibleBox::childPreferredMainAxisContentExtentRequiresLayout(Render Box& child, bool hasInfiniteLineLength) const 607 bool RenderFlexibleBox::childPreferredMainAxisContentExtentRequiresLayout(Render Box& child, bool hasInfiniteLineLength) const
608 { 608 {
609 return preferredMainAxisExtentDependsOnLayout(flexBasisForChild(child), hasI nfiniteLineLength) && hasOrthogonalFlow(child); 609 return preferredMainAxisExtentDependsOnLayout(flexBasisForChild(child), hasI nfiniteLineLength) && hasOrthogonalFlow(child);
610 } 610 }
611 611
612 LayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForChild(RenderBox* child, bool hasInfiniteLineLength, bool relayoutChildren) 612 LayoutUnit RenderFlexibleBox::preferredMainAxisContentExtentForChild(RenderBox& child, bool hasInfiniteLineLength, bool relayoutChildren)
613 { 613 {
614 child->clearOverrideSize(); 614 child.clearOverrideSize();
615 615
616 if (child->style()->hasAspectRatio() || child->isImage() || child->isVideo() || child->isCanvas()) 616 if (child.style()->hasAspectRatio() || child.isImage() || child.isVideo() || child.isCanvas())
617 UseCounter::count(document(), UseCounter::AspectRatioFlexItem); 617 UseCounter::count(document(), UseCounter::AspectRatioFlexItem);
618 618
619 Length flexBasis = flexBasisForChild(*child); 619 Length flexBasis = flexBasisForChild(child);
620 if (preferredMainAxisExtentDependsOnLayout(flexBasis, hasInfiniteLineLength) ) { 620 if (preferredMainAxisExtentDependsOnLayout(flexBasis, hasInfiniteLineLength) ) {
621 LayoutUnit mainAxisExtent; 621 LayoutUnit mainAxisExtent;
622 if (hasOrthogonalFlow(*child)) { 622 if (hasOrthogonalFlow(child)) {
623 if (child->needsLayout() || relayoutChildren) { 623 if (child.needsLayout() || relayoutChildren) {
624 m_intrinsicSizeAlongMainAxis.remove(child); 624 m_intrinsicSizeAlongMainAxis.remove(&child);
625 child->forceChildLayout(); 625 child.forceChildLayout();
626 m_intrinsicSizeAlongMainAxis.set(child, child->logicalHeight()); 626 m_intrinsicSizeAlongMainAxis.set(&child, child.logicalHeight());
627 } 627 }
628 ASSERT(m_intrinsicSizeAlongMainAxis.contains(child)); 628 ASSERT(m_intrinsicSizeAlongMainAxis.contains(&child));
629 mainAxisExtent = m_intrinsicSizeAlongMainAxis.get(child); 629 mainAxisExtent = m_intrinsicSizeAlongMainAxis.get(&child);
630 } else { 630 } else {
631 mainAxisExtent = child->maxPreferredLogicalWidth(); 631 mainAxisExtent = child.maxPreferredLogicalWidth();
632 } 632 }
633 ASSERT(mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child) >= 0); 633 ASSERT(mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child) >= 0);
634 return mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child); 634 return mainAxisExtent - mainAxisBorderAndPaddingExtentForChild(child);
635 } 635 }
636 return std::max(LayoutUnit(0), computeMainAxisExtentForChild(*child, MainOrP referredSize, flexBasis)); 636 return std::max(LayoutUnit(0), computeMainAxisExtentForChild(child, MainOrPr eferredSize, flexBasis));
637 } 637 }
638 638
639 void RenderFlexibleBox::layoutFlexItems(bool relayoutChildren) 639 void RenderFlexibleBox::layoutFlexItems(bool relayoutChildren)
640 { 640 {
641 Vector<LineContext> lineContexts; 641 Vector<LineContext> lineContexts;
642 OrderedFlexItemList orderedChildren; 642 OrderedFlexItemList orderedChildren;
643 LayoutUnit sumFlexBaseSize; 643 LayoutUnit sumFlexBaseSize;
644 double totalFlexGrow; 644 double totalFlexGrow;
645 double totalWeightedFlexShrink; 645 double totalWeightedFlexShrink;
646 LayoutUnit sumHypotheticalMainSize; 646 LayoutUnit sumHypotheticalMainSize;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
703 } 703 }
704 } 704 }
705 if (!numberOfAutoMargins) 705 if (!numberOfAutoMargins)
706 return 0; 706 return 0;
707 707
708 LayoutUnit sizeOfAutoMargin = availableFreeSpace / numberOfAutoMargins; 708 LayoutUnit sizeOfAutoMargin = availableFreeSpace / numberOfAutoMargins;
709 availableFreeSpace = 0; 709 availableFreeSpace = 0;
710 return sizeOfAutoMargin; 710 return sizeOfAutoMargin;
711 } 711 }
712 712
713 void RenderFlexibleBox::updateAutoMarginsInMainAxis(RenderBox* child, LayoutUnit autoMarginOffset) 713 void RenderFlexibleBox::updateAutoMarginsInMainAxis(RenderBox& child, LayoutUnit autoMarginOffset)
714 { 714 {
715 ASSERT(autoMarginOffset >= 0); 715 ASSERT(autoMarginOffset >= 0);
716 716
717 if (isHorizontalFlow()) { 717 if (isHorizontalFlow()) {
718 if (child->style()->marginLeft().isAuto()) 718 if (child.style()->marginLeft().isAuto())
719 child->setMarginLeft(autoMarginOffset); 719 child.setMarginLeft(autoMarginOffset);
720 if (child->style()->marginRight().isAuto()) 720 if (child.style()->marginRight().isAuto())
721 child->setMarginRight(autoMarginOffset); 721 child.setMarginRight(autoMarginOffset);
722 } else { 722 } else {
723 if (child->style()->marginTop().isAuto()) 723 if (child.style()->marginTop().isAuto())
724 child->setMarginTop(autoMarginOffset); 724 child.setMarginTop(autoMarginOffset);
725 if (child->style()->marginBottom().isAuto()) 725 if (child.style()->marginBottom().isAuto())
726 child->setMarginBottom(autoMarginOffset); 726 child.setMarginBottom(autoMarginOffset);
727 } 727 }
728 } 728 }
729 729
730 bool RenderFlexibleBox::hasAutoMarginsInCrossAxis(RenderBox* child) const 730 bool RenderFlexibleBox::hasAutoMarginsInCrossAxis(RenderBox& child) const
731 { 731 {
732 if (isHorizontalFlow()) 732 if (isHorizontalFlow())
733 return child->style()->marginTop().isAuto() || child->style()->marginBot tom().isAuto(); 733 return child.style()->marginTop().isAuto() || child.style()->marginBotto m().isAuto();
734 return child->style()->marginLeft().isAuto() || child->style()->marginRight( ).isAuto(); 734 return child.style()->marginLeft().isAuto() || child.style()->marginRight(). isAuto();
735 } 735 }
736 736
737 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChild(LayoutUnit lineCro ssAxisExtent, RenderBox* child) 737 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChild(LayoutUnit lineCro ssAxisExtent, RenderBox& child)
738 { 738 {
739 ASSERT(!child->isOutOfFlowPositioned()); 739 ASSERT(!child.isOutOfFlowPositioned());
740 LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAx isExtentForChild(*child); 740 LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAx isExtentForChild(child);
741 return lineCrossAxisExtent - childCrossExtent; 741 return lineCrossAxisExtent - childCrossExtent;
742 } 742 }
743 743
744 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChildBeforeStretching(La youtUnit lineCrossAxisExtent, RenderBox* child) 744 LayoutUnit RenderFlexibleBox::availableAlignmentSpaceForChildBeforeStretching(La youtUnit lineCrossAxisExtent, RenderBox& child)
745 { 745 {
746 ASSERT(!child->isOutOfFlowPositioned()); 746 ASSERT(!child.isOutOfFlowPositioned());
747 LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAx isIntrinsicExtentForChild(*child); 747 LayoutUnit childCrossExtent = crossAxisMarginExtentForChild(child) + crossAx isIntrinsicExtentForChild(child);
748 return lineCrossAxisExtent - childCrossExtent; 748 return lineCrossAxisExtent - childCrossExtent;
749 } 749 }
750 750
751 bool RenderFlexibleBox::updateAutoMarginsInCrossAxis(RenderBox* child, LayoutUni t availableAlignmentSpace) 751 bool RenderFlexibleBox::updateAutoMarginsInCrossAxis(RenderBox& child, LayoutUni t availableAlignmentSpace)
752 { 752 {
753 ASSERT(!child->isOutOfFlowPositioned()); 753 ASSERT(!child.isOutOfFlowPositioned());
754 ASSERT(availableAlignmentSpace >= 0); 754 ASSERT(availableAlignmentSpace >= 0);
755 755
756 bool isHorizontal = isHorizontalFlow(); 756 bool isHorizontal = isHorizontalFlow();
757 Length topOrLeft = isHorizontal ? child->style()->marginTop() : child->style ()->marginLeft(); 757 Length topOrLeft = isHorizontal ? child.style()->marginTop() : child.style() ->marginLeft();
758 Length bottomOrRight = isHorizontal ? child->style()->marginBottom() : child ->style()->marginRight(); 758 Length bottomOrRight = isHorizontal ? child.style()->marginBottom() : child. style()->marginRight();
759 if (topOrLeft.isAuto() && bottomOrRight.isAuto()) { 759 if (topOrLeft.isAuto() && bottomOrRight.isAuto()) {
760 adjustAlignmentForChild(child, availableAlignmentSpace / 2); 760 adjustAlignmentForChild(child, availableAlignmentSpace / 2);
761 if (isHorizontal) { 761 if (isHorizontal) {
762 child->setMarginTop(availableAlignmentSpace / 2); 762 child.setMarginTop(availableAlignmentSpace / 2);
763 child->setMarginBottom(availableAlignmentSpace / 2); 763 child.setMarginBottom(availableAlignmentSpace / 2);
764 } else { 764 } else {
765 child->setMarginLeft(availableAlignmentSpace / 2); 765 child.setMarginLeft(availableAlignmentSpace / 2);
766 child->setMarginRight(availableAlignmentSpace / 2); 766 child.setMarginRight(availableAlignmentSpace / 2);
767 } 767 }
768 return true; 768 return true;
769 } 769 }
770 bool shouldAdjustTopOrLeft = true; 770 bool shouldAdjustTopOrLeft = true;
771 if (isColumnFlow() && !child->style()->isLeftToRightDirection()) { 771 if (isColumnFlow() && !child.style()->isLeftToRightDirection()) {
772 // For column flows, only make this adjustment if topOrLeft corresponds to the "before" margin, 772 // For column flows, only make this adjustment if topOrLeft corresponds to the "before" margin,
773 // so that flipForRightToLeftColumn will do the right thing. 773 // so that flipForRightToLeftColumn will do the right thing.
774 shouldAdjustTopOrLeft = false; 774 shouldAdjustTopOrLeft = false;
775 } 775 }
776 if (!isColumnFlow() && child->style()->isFlippedBlocksWritingMode()) { 776 if (!isColumnFlow() && child.style()->isFlippedBlocksWritingMode()) {
777 // If we are a flipped writing mode, we need to adjust the opposite side . This is only needed 777 // If we are a flipped writing mode, we need to adjust the opposite side . This is only needed
778 // for row flows because this only affects the block-direction axis. 778 // for row flows because this only affects the block-direction axis.
779 shouldAdjustTopOrLeft = false; 779 shouldAdjustTopOrLeft = false;
780 } 780 }
781 781
782 if (topOrLeft.isAuto()) { 782 if (topOrLeft.isAuto()) {
783 if (shouldAdjustTopOrLeft) 783 if (shouldAdjustTopOrLeft)
784 adjustAlignmentForChild(child, availableAlignmentSpace); 784 adjustAlignmentForChild(child, availableAlignmentSpace);
785 785
786 if (isHorizontal) 786 if (isHorizontal)
787 child->setMarginTop(availableAlignmentSpace); 787 child.setMarginTop(availableAlignmentSpace);
788 else 788 else
789 child->setMarginLeft(availableAlignmentSpace); 789 child.setMarginLeft(availableAlignmentSpace);
790 return true; 790 return true;
791 } 791 }
792 if (bottomOrRight.isAuto()) { 792 if (bottomOrRight.isAuto()) {
793 if (!shouldAdjustTopOrLeft) 793 if (!shouldAdjustTopOrLeft)
794 adjustAlignmentForChild(child, availableAlignmentSpace); 794 adjustAlignmentForChild(child, availableAlignmentSpace);
795 795
796 if (isHorizontal) 796 if (isHorizontal)
797 child->setMarginBottom(availableAlignmentSpace); 797 child.setMarginBottom(availableAlignmentSpace);
798 else 798 else
799 child->setMarginRight(availableAlignmentSpace); 799 child.setMarginRight(availableAlignmentSpace);
800 return true; 800 return true;
801 } 801 }
802 return false; 802 return false;
803 } 803 }
804 804
805 LayoutUnit RenderFlexibleBox::marginBoxAscentForChild(RenderBox* child) 805 LayoutUnit RenderFlexibleBox::marginBoxAscentForChild(RenderBox& child)
806 { 806 {
807 LayoutUnit ascent = child->firstLineBoxBaseline(); 807 LayoutUnit ascent = child.firstLineBoxBaseline();
808 if (ascent == -1) 808 if (ascent == -1)
809 ascent = crossAxisExtentForChild(*child); 809 ascent = crossAxisExtentForChild(child);
810 return ascent + flowAwareMarginBeforeForChild(child); 810 return ascent + flowAwareMarginBeforeForChild(child);
811 } 811 }
812 812
813 LayoutUnit RenderFlexibleBox::computeChildMarginValue(Length margin) 813 LayoutUnit RenderFlexibleBox::computeChildMarginValue(Length margin)
814 { 814 {
815 // When resolving the margins, we use the content size for resolving percent and calc (for percents in calc expressions) margins. 815 // When resolving the margins, we use the content size for resolving percent and calc (for percents in calc expressions) margins.
816 // Fortunately, percent margins are always computed with respect to the bloc k's width, even for margin-top and margin-bottom. 816 // Fortunately, percent margins are always computed with respect to the bloc k's width, even for margin-top and margin-bottom.
817 LayoutUnit availableSize = contentLogicalWidth(); 817 LayoutUnit availableSize = contentLogicalWidth();
818 return minimumValueForLength(margin, availableSize); 818 return minimumValueForLength(margin, availableSize);
819 } 819 }
(...skipping 13 matching lines...) Expand all
833 if (isHorizontalFlow()) { 833 if (isHorizontalFlow()) {
834 child->setMarginLeft(computeChildMarginValue(child->style()->marginL eft())); 834 child->setMarginLeft(computeChildMarginValue(child->style()->marginL eft()));
835 child->setMarginRight(computeChildMarginValue(child->style()->margin Right())); 835 child->setMarginRight(computeChildMarginValue(child->style()->margin Right()));
836 } else { 836 } else {
837 child->setMarginTop(computeChildMarginValue(child->style()->marginTo p())); 837 child->setMarginTop(computeChildMarginValue(child->style()->marginTo p()));
838 child->setMarginBottom(computeChildMarginValue(child->style()->margi nBottom())); 838 child->setMarginBottom(computeChildMarginValue(child->style()->margi nBottom()));
839 } 839 }
840 } 840 }
841 } 841 }
842 842
843 LayoutUnit RenderFlexibleBox::adjustChildSizeForMinAndMax(RenderBox* child, Layo utUnit childSize) 843 LayoutUnit RenderFlexibleBox::adjustChildSizeForMinAndMax(RenderBox& child, Layo utUnit childSize)
844 { 844 {
845 Length max = isHorizontalFlow() ? child->style()->maxWidth() : child->style( )->maxHeight(); 845 Length max = isHorizontalFlow() ? child.style()->maxWidth() : child.style()- >maxHeight();
846 if (max.isSpecifiedOrIntrinsic()) { 846 if (max.isSpecifiedOrIntrinsic()) {
847 LayoutUnit maxExtent = computeMainAxisExtentForChild(*child, MaxSize, ma x); 847 LayoutUnit maxExtent = computeMainAxisExtentForChild(child, MaxSize, max );
848 if (maxExtent != -1 && childSize > maxExtent) 848 if (maxExtent != -1 && childSize > maxExtent)
849 childSize = maxExtent; 849 childSize = maxExtent;
850 } 850 }
851 851
852 Length min = isHorizontalFlow() ? child->style()->minWidth() : child->style( )->minHeight(); 852 Length min = isHorizontalFlow() ? child.style()->minWidth() : child.style()- >minHeight();
853 LayoutUnit minExtent = 0; 853 LayoutUnit minExtent = 0;
854 if (min.isSpecifiedOrIntrinsic()) 854 if (min.isSpecifiedOrIntrinsic())
855 minExtent = computeMainAxisExtentForChild(*child, MinSize, min); 855 minExtent = computeMainAxisExtentForChild(child, MinSize, min);
856 return std::max(childSize, minExtent); 856 return std::max(childSize, minExtent);
857 } 857 }
858 858
859 bool RenderFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren , LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalWeightedFlexS hrink, LayoutUnit& sumHypotheticalMainSize, bool& hasInfiniteLineLength, bool re layoutChildren) 859 bool RenderFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren , LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalWeightedFlexS hrink, LayoutUnit& sumHypotheticalMainSize, bool& hasInfiniteLineLength, bool re layoutChildren)
860 { 860 {
861 orderedChildren.clear(); 861 orderedChildren.clear();
862 sumFlexBaseSize = 0; 862 sumFlexBaseSize = 0;
863 totalFlexGrow = totalWeightedFlexShrink = 0; 863 totalFlexGrow = totalWeightedFlexShrink = 0;
864 sumHypotheticalMainSize = 0; 864 sumHypotheticalMainSize = 0;
865 865
866 if (!m_orderIterator.currentChild()) 866 if (!m_orderIterator.currentChild())
867 return false; 867 return false;
868 868
869 LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max()); 869 LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max());
870 hasInfiniteLineLength = lineBreakLength == LayoutUnit::max(); 870 hasInfiniteLineLength = lineBreakLength == LayoutUnit::max();
871 871
872 bool lineHasInFlowItem = false; 872 bool lineHasInFlowItem = false;
873 873
874 for (RenderBox* child = m_orderIterator.currentChild(); child; child = m_ord erIterator.next()) { 874 for (RenderBox* child = m_orderIterator.currentChild(); child; child = m_ord erIterator.next()) {
875 if (child->isOutOfFlowPositioned()) { 875 if (child->isOutOfFlowPositioned()) {
876 orderedChildren.append(child); 876 orderedChildren.append(child);
877 continue; 877 continue;
878 } 878 }
879 879
880 LayoutUnit childMainAxisExtent = preferredMainAxisContentExtentForChild( child, hasInfiniteLineLength, relayoutChildren); 880 LayoutUnit childMainAxisExtent = preferredMainAxisContentExtentForChild( *child, hasInfiniteLineLength, relayoutChildren);
881 LayoutUnit childMainAxisMarginBorderPadding = mainAxisBorderAndPaddingEx tentForChild(child) 881 LayoutUnit childMainAxisMarginBorderPadding = mainAxisBorderAndPaddingEx tentForChild(*child)
882 + (isHorizontalFlow() ? child->marginWidth() : child->marginHeight() ); 882 + (isHorizontalFlow() ? child->marginWidth() : child->marginHeight() );
883 LayoutUnit childFlexBaseSize = childMainAxisExtent + childMainAxisMargin BorderPadding; 883 LayoutUnit childFlexBaseSize = childMainAxisExtent + childMainAxisMargin BorderPadding;
884 884
885 LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMa x(child, childMainAxisExtent); 885 LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMa x(*child, childMainAxisExtent);
886 LayoutUnit childHypotheticalMainSize = childMinMaxAppliedMainAxisExtent + childMainAxisMarginBorderPadding; 886 LayoutUnit childHypotheticalMainSize = childMinMaxAppliedMainAxisExtent + childMainAxisMarginBorderPadding;
887 887
888 if (isMultiline() && sumHypotheticalMainSize + childHypotheticalMainSize > lineBreakLength && lineHasInFlowItem) 888 if (isMultiline() && sumHypotheticalMainSize + childHypotheticalMainSize > lineBreakLength && lineHasInFlowItem)
889 break; 889 break;
890 orderedChildren.append(child); 890 orderedChildren.append(child);
891 lineHasInFlowItem = true; 891 lineHasInFlowItem = true;
892 sumFlexBaseSize += childFlexBaseSize; 892 sumFlexBaseSize += childFlexBaseSize;
893 totalFlexGrow += child->style()->flexGrow(); 893 totalFlexGrow += child->style()->flexGrow();
894 totalWeightedFlexShrink += child->style()->flexShrink() * childMainAxisE xtent; 894 totalWeightedFlexShrink += child->style()->flexShrink() * childMainAxisE xtent;
895 sumHypotheticalMainSize += childHypotheticalMainSize; 895 sumHypotheticalMainSize += childHypotheticalMainSize;
896 } 896 }
897 return true; 897 return true;
898 } 898 }
899 899
900 void RenderFlexibleBox::freezeViolations(const Vector<Violation>& violations, La youtUnit& availableFreeSpace, double& totalFlexGrow, double& totalWeightedFlexSh rink, InflexibleFlexItemSize& inflexibleItems, bool hasInfiniteLineLength) 900 void RenderFlexibleBox::freezeViolations(const Vector<Violation>& violations, La youtUnit& availableFreeSpace, double& totalFlexGrow, double& totalWeightedFlexSh rink, InflexibleFlexItemSize& inflexibleItems, bool hasInfiniteLineLength)
901 { 901 {
902 for (size_t i = 0; i < violations.size(); ++i) { 902 for (size_t i = 0; i < violations.size(); ++i) {
903 RenderBox* child = violations[i].child; 903 RenderBox* child = violations[i].child;
904 LayoutUnit childSize = violations[i].childSize; 904 LayoutUnit childSize = violations[i].childSize;
905 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(c hild, hasInfiniteLineLength); 905 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChild(* child, hasInfiniteLineLength);
906 availableFreeSpace -= childSize - preferredChildSize; 906 availableFreeSpace -= childSize - preferredChildSize;
907 totalFlexGrow -= child->style()->flexGrow(); 907 totalFlexGrow -= child->style()->flexGrow();
908 totalWeightedFlexShrink -= child->style()->flexShrink() * preferredChild Size; 908 totalWeightedFlexShrink -= child->style()->flexShrink() * preferredChild Size;
909 inflexibleItems.set(child, childSize); 909 inflexibleItems.set(child, childSize);
910 } 910 }
911 } 911 }
912 912
913 // Returns true if we successfully ran the algorithm and sized the flex items. 913 // Returns true if we successfully ran the algorithm and sized the flex items.
914 bool RenderFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedF lexItemList& children, LayoutUnit& availableFreeSpace, double& totalFlexGrow, do uble& totalWeightedFlexShrink, InflexibleFlexItemSize& inflexibleItems, Vector<L ayoutUnit, 16>& childSizes, bool hasInfiniteLineLength) 914 bool RenderFlexibleBox::resolveFlexibleLengths(FlexSign flexSign, const OrderedF lexItemList& children, LayoutUnit& availableFreeSpace, double& totalFlexGrow, do uble& totalWeightedFlexShrink, InflexibleFlexItemSize& inflexibleItems, Vector<L ayoutUnit, 16>& childSizes, bool hasInfiniteLineLength)
915 { 915 {
916 childSizes.resize(0); 916 childSizes.resize(0);
917 LayoutUnit totalViolation = 0; 917 LayoutUnit totalViolation = 0;
918 LayoutUnit usedFreeSpace = 0; 918 LayoutUnit usedFreeSpace = 0;
919 Vector<Violation> minViolations; 919 Vector<Violation> minViolations;
920 Vector<Violation> maxViolations; 920 Vector<Violation> maxViolations;
921 for (size_t i = 0; i < children.size(); ++i) { 921 for (size_t i = 0; i < children.size(); ++i) {
922 RenderBox* child = children[i]; 922 RenderBox* child = children[i];
923 if (child->isOutOfFlowPositioned()) { 923 if (child->isOutOfFlowPositioned()) {
924 childSizes.append(0); 924 childSizes.append(0);
925 continue; 925 continue;
926 } 926 }
927 927
928 if (inflexibleItems.contains(child)) 928 if (inflexibleItems.contains(child))
929 childSizes.append(inflexibleItems.get(child)); 929 childSizes.append(inflexibleItems.get(child));
930 else { 930 else {
931 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChi ld(child, hasInfiniteLineLength); 931 LayoutUnit preferredChildSize = preferredMainAxisContentExtentForChi ld(*child, hasInfiniteLineLength);
932 LayoutUnit childSize = preferredChildSize; 932 LayoutUnit childSize = preferredChildSize;
933 double extraSpace = 0; 933 double extraSpace = 0;
934 if (availableFreeSpace > 0 && totalFlexGrow > 0 && flexSign == Posit iveFlexibility && std::isfinite(totalFlexGrow)) 934 if (availableFreeSpace > 0 && totalFlexGrow > 0 && flexSign == Posit iveFlexibility && std::isfinite(totalFlexGrow))
935 extraSpace = availableFreeSpace * child->style()->flexGrow() / t otalFlexGrow; 935 extraSpace = availableFreeSpace * child->style()->flexGrow() / t otalFlexGrow;
936 else if (availableFreeSpace < 0 && totalWeightedFlexShrink > 0 && fl exSign == NegativeFlexibility && std::isfinite(totalWeightedFlexShrink)) 936 else if (availableFreeSpace < 0 && totalWeightedFlexShrink > 0 && fl exSign == NegativeFlexibility && std::isfinite(totalWeightedFlexShrink))
937 extraSpace = availableFreeSpace * child->style()->flexShrink() * preferredChildSize / totalWeightedFlexShrink; 937 extraSpace = availableFreeSpace * child->style()->flexShrink() * preferredChildSize / totalWeightedFlexShrink;
938 if (std::isfinite(extraSpace)) 938 if (std::isfinite(extraSpace))
939 childSize += LayoutUnit::fromFloatRound(extraSpace); 939 childSize += LayoutUnit::fromFloatRound(extraSpace);
940 940
941 LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(child, ch ildSize); 941 LayoutUnit adjustedChildSize = adjustChildSizeForMinAndMax(*child, c hildSize);
942 childSizes.append(adjustedChildSize); 942 childSizes.append(adjustedChildSize);
943 usedFreeSpace += adjustedChildSize - preferredChildSize; 943 usedFreeSpace += adjustedChildSize - preferredChildSize;
944 944
945 LayoutUnit violation = adjustedChildSize - childSize; 945 LayoutUnit violation = adjustedChildSize - childSize;
946 if (violation > 0) 946 if (violation > 0)
947 minViolations.append(Violation(child, adjustedChildSize)); 947 minViolations.append(Violation(child, adjustedChildSize));
948 else if (violation < 0) 948 else if (violation < 0)
949 maxViolations.append(Violation(child, adjustedChildSize)); 949 maxViolations.append(Violation(child, adjustedChildSize));
950 totalViolation += violation; 950 totalViolation += violation;
951 } 951 }
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 } 986 }
987 987
988 void RenderFlexibleBox::setLogicalOverrideSize(RenderBox& child, LayoutUnit chil dPreferredSize) 988 void RenderFlexibleBox::setLogicalOverrideSize(RenderBox& child, LayoutUnit chil dPreferredSize)
989 { 989 {
990 if (hasOrthogonalFlow(child)) 990 if (hasOrthogonalFlow(child))
991 child.setOverrideLogicalContentHeight(childPreferredSize - child.borderA ndPaddingLogicalHeight()); 991 child.setOverrideLogicalContentHeight(childPreferredSize - child.borderA ndPaddingLogicalHeight());
992 else 992 else
993 child.setOverrideLogicalContentWidth(childPreferredSize - child.borderAn dPaddingLogicalWidth()); 993 child.setOverrideLogicalContentWidth(childPreferredSize - child.borderAn dPaddingLogicalWidth());
994 } 994 }
995 995
996 void RenderFlexibleBox::prepareChildForPositionedLayout(RenderBox* child, Layout Unit mainAxisOffset, LayoutUnit crossAxisOffset, PositionedLayoutMode layoutMode ) 996 void RenderFlexibleBox::prepareChildForPositionedLayout(RenderBox& child, Layout Unit mainAxisOffset, LayoutUnit crossAxisOffset, PositionedLayoutMode layoutMode )
997 { 997 {
998 ASSERT(child->isOutOfFlowPositioned()); 998 ASSERT(child.isOutOfFlowPositioned());
999 child->containingBlock()->insertPositionedObject(child); 999 child.containingBlock()->insertPositionedObject(&child);
1000 RenderLayer* childLayer = child->layer(); 1000 RenderLayer* childLayer = child.layer();
1001 LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffse t; 1001 LayoutUnit inlinePosition = isColumnFlow() ? crossAxisOffset : mainAxisOffse t;
1002 if (layoutMode == FlipForRowReverse && style()->flexDirection() == FlowRowRe verse) 1002 if (layoutMode == FlipForRowReverse && style()->flexDirection() == FlowRowRe verse)
1003 inlinePosition = mainAxisExtent() - mainAxisOffset; 1003 inlinePosition = mainAxisExtent() - mainAxisOffset;
1004 childLayer->setStaticInlinePosition(inlinePosition); 1004 childLayer->setStaticInlinePosition(inlinePosition);
1005 1005
1006 LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxis Offset; 1006 LayoutUnit staticBlockPosition = isColumnFlow() ? mainAxisOffset : crossAxis Offset;
1007 if (childLayer->staticBlockPosition() != staticBlockPosition) { 1007 if (childLayer->staticBlockPosition() != staticBlockPosition) {
1008 childLayer->setStaticBlockPosition(staticBlockPosition); 1008 childLayer->setStaticBlockPosition(staticBlockPosition);
1009 if (child->style()->hasStaticBlockPosition(style()->isHorizontalWritingM ode())) 1009 if (child.style()->hasStaticBlockPosition(style()->isHorizontalWritingMo de()))
1010 child->setChildNeedsLayout(MarkOnlyThis); 1010 child.setChildNeedsLayout(MarkOnlyThis);
1011 } 1011 }
1012 } 1012 }
1013 1013
1014 ItemPosition RenderFlexibleBox::alignmentForChild(RenderBox& child) const 1014 ItemPosition RenderFlexibleBox::alignmentForChild(RenderBox& child) const
1015 { 1015 {
1016 ItemPosition align = resolveAlignment(style(), child.style()); 1016 ItemPosition align = resolveAlignment(style(), child.style());
1017 1017
1018 if (align == ItemPositionBaseline && hasOrthogonalFlow(child)) 1018 if (align == ItemPositionBaseline && hasOrthogonalFlow(child))
1019 align = ItemPositionFlexStart; 1019 align = ItemPositionFlexStart;
1020 1020
(...skipping 11 matching lines...) Expand all
1032 { 1032 {
1033 size_t count = 0; 1033 size_t count = 0;
1034 for (size_t i = 0; i < children.size(); ++i) { 1034 for (size_t i = 0; i < children.size(); ++i) {
1035 RenderBox* child = children[i]; 1035 RenderBox* child = children[i];
1036 if (!child->isOutOfFlowPositioned()) 1036 if (!child->isOutOfFlowPositioned())
1037 ++count; 1037 ++count;
1038 } 1038 }
1039 return count; 1039 return count;
1040 } 1040 }
1041 1041
1042 void RenderFlexibleBox::resetAutoMarginsAndLogicalTopInCrossAxis(RenderBox* chil d) 1042 void RenderFlexibleBox::resetAutoMarginsAndLogicalTopInCrossAxis(RenderBox& chil d)
1043 { 1043 {
1044 if (hasAutoMarginsInCrossAxis(child)) { 1044 if (hasAutoMarginsInCrossAxis(child)) {
1045 child->updateLogicalHeight(); 1045 child.updateLogicalHeight();
1046 if (isHorizontalFlow()) { 1046 if (isHorizontalFlow()) {
1047 if (child->style()->marginTop().isAuto()) 1047 if (child.style()->marginTop().isAuto())
1048 child->setMarginTop(0); 1048 child.setMarginTop(0);
1049 if (child->style()->marginBottom().isAuto()) 1049 if (child.style()->marginBottom().isAuto())
1050 child->setMarginBottom(0); 1050 child.setMarginBottom(0);
1051 } else { 1051 } else {
1052 if (child->style()->marginLeft().isAuto()) 1052 if (child.style()->marginLeft().isAuto())
1053 child->setMarginLeft(0); 1053 child.setMarginLeft(0);
1054 if (child->style()->marginRight().isAuto()) 1054 if (child.style()->marginRight().isAuto())
1055 child->setMarginRight(0); 1055 child.setMarginRight(0);
1056 } 1056 }
1057 } 1057 }
1058 } 1058 }
1059 1059
1060 bool RenderFlexibleBox::needToStretchChildLogicalHeight(RenderBox& child) const 1060 bool RenderFlexibleBox::needToStretchChildLogicalHeight(RenderBox& child) const
1061 { 1061 {
1062 if (alignmentForChild(child) != ItemPositionStretch) 1062 if (alignmentForChild(child) != ItemPositionStretch)
1063 return false; 1063 return false;
1064 1064
1065 return isHorizontalFlow() && child.style()->height().isAuto(); 1065 return isHorizontalFlow() && child.style()->height().isAuto();
(...skipping 12 matching lines...) Expand all
1078 1078
1079 LayoutUnit totalMainExtent = mainAxisExtent(); 1079 LayoutUnit totalMainExtent = mainAxisExtent();
1080 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when align-items: baseline . 1080 LayoutUnit maxAscent = 0, maxDescent = 0; // Used when align-items: baseline .
1081 LayoutUnit maxChildCrossAxisExtent = 0; 1081 LayoutUnit maxChildCrossAxisExtent = 0;
1082 size_t seenInFlowPositionedChildren = 0; 1082 size_t seenInFlowPositionedChildren = 0;
1083 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow(); 1083 bool shouldFlipMainAxis = !isColumnFlow() && !isLeftToRightFlow();
1084 for (size_t i = 0; i < children.size(); ++i) { 1084 for (size_t i = 0; i < children.size(); ++i) {
1085 RenderBox* child = children[i]; 1085 RenderBox* child = children[i];
1086 1086
1087 if (child->isOutOfFlowPositioned()) { 1087 if (child->isOutOfFlowPositioned()) {
1088 prepareChildForPositionedLayout(child, mainAxisOffset, crossAxisOffs et, FlipForRowReverse); 1088 prepareChildForPositionedLayout(*child, mainAxisOffset, crossAxisOff set, FlipForRowReverse);
1089 continue; 1089 continue;
1090 } 1090 }
1091 1091
1092 // FIXME Investigate if this can be removed based on other flags. crbug. com/370010 1092 // FIXME Investigate if this can be removed based on other flags. crbug. com/370010
1093 child->setMayNeedPaintInvalidation(true); 1093 child->setMayNeedPaintInvalidation(true);
1094 1094
1095 LayoutUnit childPreferredSize = childSizes[i] + mainAxisBorderAndPadding ExtentForChild(child); 1095 LayoutUnit childPreferredSize = childSizes[i] + mainAxisBorderAndPadding ExtentForChild(*child);
1096 setLogicalOverrideSize(*child, childPreferredSize); 1096 setLogicalOverrideSize(*child, childPreferredSize);
1097 if (childPreferredSize != mainAxisExtentForChild(*child)) { 1097 if (childPreferredSize != mainAxisExtentForChild(*child)) {
1098 child->setChildNeedsLayout(MarkOnlyThis); 1098 child->setChildNeedsLayout(MarkOnlyThis);
1099 } else { 1099 } else {
1100 // To avoid double applying margin changes in updateAutoMarginsInCro ssAxis, we reset the margins here. 1100 // To avoid double applying margin changes in updateAutoMarginsInCro ssAxis, we reset the margins here.
1101 resetAutoMarginsAndLogicalTopInCrossAxis(child); 1101 resetAutoMarginsAndLogicalTopInCrossAxis(*child);
1102 } 1102 }
1103 // We may have already forced relayout for orthogonal flowing children i n preferredMainAxisContentExtentForChild. 1103 // We may have already forced relayout for orthogonal flowing children i n preferredMainAxisContentExtentForChild.
1104 bool forceChildRelayout = relayoutChildren && !childPreferredMainAxisCon tentExtentRequiresLayout(*child, hasInfiniteLineLength); 1104 bool forceChildRelayout = relayoutChildren && !childPreferredMainAxisCon tentExtentRequiresLayout(*child, hasInfiniteLineLength);
1105 updateBlockChildDirtyBitsBeforeLayout(forceChildRelayout, child); 1105 updateBlockChildDirtyBitsBeforeLayout(forceChildRelayout, child);
1106 child->layoutIfNeeded(); 1106 child->layoutIfNeeded();
1107 1107
1108 updateAutoMarginsInMainAxis(child, autoMarginOffset); 1108 updateAutoMarginsInMainAxis(*child, autoMarginOffset);
1109 1109
1110 LayoutUnit childCrossAxisMarginBoxExtent; 1110 LayoutUnit childCrossAxisMarginBoxExtent;
1111 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(child)) { 1111 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMargins InCrossAxis(*child)) {
1112 LayoutUnit ascent = marginBoxAscentForChild(child); 1112 LayoutUnit ascent = marginBoxAscentForChild(*child);
1113 LayoutUnit descent = (crossAxisMarginExtentForChild(child) + crossAx isExtentForChild(*child)) - ascent; 1113 LayoutUnit descent = (crossAxisMarginExtentForChild(*child) + crossA xisExtentForChild(*child)) - ascent;
1114 1114
1115 maxAscent = std::max(maxAscent, ascent); 1115 maxAscent = std::max(maxAscent, ascent);
1116 maxDescent = std::max(maxDescent, descent); 1116 maxDescent = std::max(maxDescent, descent);
1117 1117
1118 childCrossAxisMarginBoxExtent = maxAscent + maxDescent; 1118 childCrossAxisMarginBoxExtent = maxAscent + maxDescent;
1119 } else { 1119 } else {
1120 childCrossAxisMarginBoxExtent = crossAxisIntrinsicExtentForChild(*ch ild) + crossAxisMarginExtentForChild(child) + crossAxisScrollbarExtentForChild(c hild); 1120 childCrossAxisMarginBoxExtent = crossAxisIntrinsicExtentForChild(*ch ild) + crossAxisMarginExtentForChild(*child) + crossAxisScrollbarExtentForChild( *child);
1121 } 1121 }
1122 if (!isColumnFlow()) 1122 if (!isColumnFlow())
1123 setLogicalHeight(std::max(logicalHeight(), crossAxisOffset + flowAwa reBorderAfter() + flowAwarePaddingAfter() + childCrossAxisMarginBoxExtent + cros sAxisScrollbarExtent())); 1123 setLogicalHeight(std::max(logicalHeight(), crossAxisOffset + flowAwa reBorderAfter() + flowAwarePaddingAfter() + childCrossAxisMarginBoxExtent + cros sAxisScrollbarExtent()));
1124 maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAx isMarginBoxExtent); 1124 maxChildCrossAxisExtent = std::max(maxChildCrossAxisExtent, childCrossAx isMarginBoxExtent);
1125 1125
1126 mainAxisOffset += flowAwareMarginStartForChild(child); 1126 mainAxisOffset += flowAwareMarginStartForChild(*child);
1127 1127
1128 LayoutUnit childMainExtent = mainAxisExtentForChild(*child); 1128 LayoutUnit childMainExtent = mainAxisExtentForChild(*child);
1129 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left. 1129 // In an RTL column situation, this will apply the margin-right/margin-e nd on the left.
1130 // This will be fixed later in flipForRightToLeftColumn. 1130 // This will be fixed later in flipForRightToLeftColumn.
1131 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset, 1131 LayoutPoint childLocation(shouldFlipMainAxis ? totalMainExtent - mainAxi sOffset - childMainExtent : mainAxisOffset,
1132 crossAxisOffset + flowAwareMarginBeforeForChild(child)); 1132 crossAxisOffset + flowAwareMarginBeforeForChild(*child));
1133 1133
1134 // FIXME: Supporting layout deltas. 1134 // FIXME: Supporting layout deltas.
1135 setFlowAwareLocationForChild(child, childLocation); 1135 setFlowAwareLocationForChild(*child, childLocation);
1136 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(child); 1136 mainAxisOffset += childMainExtent + flowAwareMarginEndForChild(*child);
1137 1137
1138 ++seenInFlowPositionedChildren; 1138 ++seenInFlowPositionedChildren;
1139 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1139 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1140 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent); 1140 mainAxisOffset += justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent);
1141 } 1141 }
1142 1142
1143 if (isColumnFlow()) 1143 if (isColumnFlow())
1144 setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddin gEnd() + scrollbarLogicalHeight()); 1144 setLogicalHeight(mainAxisOffset + flowAwareBorderEnd() + flowAwarePaddin gEnd() + scrollbarLogicalHeight());
1145 1145
1146 if (style()->flexDirection() == FlowColumnReverse) { 1146 if (style()->flexDirection() == FlowColumnReverse) {
(...skipping 20 matching lines...) Expand all
1167 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight(); 1167 mainAxisOffset -= isHorizontalFlow() ? verticalScrollbarWidth() : horizontal ScrollbarHeight();
1168 1168
1169 size_t seenInFlowPositionedChildren = 0; 1169 size_t seenInFlowPositionedChildren = 0;
1170 for (size_t i = 0; i < children.size(); ++i) { 1170 for (size_t i = 0; i < children.size(); ++i) {
1171 RenderBox* child = children[i]; 1171 RenderBox* child = children[i];
1172 1172
1173 if (child->isOutOfFlowPositioned()) { 1173 if (child->isOutOfFlowPositioned()) {
1174 child->layer()->setStaticBlockPosition(mainAxisOffset); 1174 child->layer()->setStaticBlockPosition(mainAxisOffset);
1175 continue; 1175 continue;
1176 } 1176 }
1177 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(child); 1177 mainAxisOffset -= mainAxisExtentForChild(*child) + flowAwareMarginEndFor Child(*child);
1178 1178
1179 setFlowAwareLocationForChild(child, LayoutPoint(mainAxisOffset, crossAxi sOffset + flowAwareMarginBeforeForChild(child))); 1179 setFlowAwareLocationForChild(*child, LayoutPoint(mainAxisOffset, crossAx isOffset + flowAwareMarginBeforeForChild(*child)));
1180 1180
1181 mainAxisOffset -= flowAwareMarginStartForChild(child); 1181 mainAxisOffset -= flowAwareMarginStartForChild(*child);
1182 1182
1183 ++seenInFlowPositionedChildren; 1183 ++seenInFlowPositionedChildren;
1184 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent) 1184 if (seenInFlowPositionedChildren < numberOfChildrenForJustifyContent)
1185 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent); 1185 mainAxisOffset -= justifyContentSpaceBetweenChildren(availableFreeSp ace, style()->justifyContent(), numberOfChildrenForJustifyContent);
1186 } 1186 }
1187 } 1187 }
1188 1188
1189 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, EAlig nContent alignContent, unsigned numberOfLines) 1189 static LayoutUnit initialAlignContentOffset(LayoutUnit availableFreeSpace, EAlig nContent alignContent, unsigned numberOfLines)
1190 { 1190 {
1191 if (numberOfLines <= 1) 1191 if (numberOfLines <= 1)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 1229
1230 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent(); 1230 LayoutUnit availableCrossAxisSpace = crossAxisContentExtent();
1231 for (size_t i = 0; i < lineContexts.size(); ++i) 1231 for (size_t i = 0; i < lineContexts.size(); ++i)
1232 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent; 1232 availableCrossAxisSpace -= lineContexts[i].crossAxisExtent;
1233 1233
1234 RenderBox* child = m_orderIterator.first(); 1234 RenderBox* child = m_orderIterator.first();
1235 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, s tyle()->alignContent(), lineContexts.size()); 1235 LayoutUnit lineOffset = initialAlignContentOffset(availableCrossAxisSpace, s tyle()->alignContent(), lineContexts.size());
1236 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) { 1236 for (unsigned lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber ) {
1237 lineContexts[lineNumber].crossAxisOffset += lineOffset; 1237 lineContexts[lineNumber].crossAxisOffset += lineOffset;
1238 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) 1238 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next())
1239 adjustAlignmentForChild(child, lineOffset); 1239 adjustAlignmentForChild(*child, lineOffset);
1240 1240
1241 if (style()->alignContent() == AlignContentStretch && availableCrossAxis Space > 0) 1241 if (style()->alignContent() == AlignContentStretch && availableCrossAxis Space > 0)
1242 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size()); 1242 lineContexts[lineNumber].crossAxisExtent += availableCrossAxisSpace / static_cast<unsigned>(lineContexts.size());
1243 1243
1244 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, style()->alignContent(), lineContexts.size()); 1244 lineOffset += alignContentSpaceBetweenChildren(availableCrossAxisSpace, style()->alignContent(), lineContexts.size());
1245 } 1245 }
1246 } 1246 }
1247 1247
1248 void RenderFlexibleBox::adjustAlignmentForChild(RenderBox* child, LayoutUnit del ta) 1248 void RenderFlexibleBox::adjustAlignmentForChild(RenderBox& child, LayoutUnit del ta)
1249 { 1249 {
1250 if (child->isOutOfFlowPositioned()) { 1250 if (child.isOutOfFlowPositioned()) {
1251 LayoutUnit staticInlinePosition = child->layer()->staticInlinePosition() ; 1251 LayoutUnit staticInlinePosition = child.layer()->staticInlinePosition();
1252 LayoutUnit staticBlockPosition = child->layer()->staticBlockPosition(); 1252 LayoutUnit staticBlockPosition = child.layer()->staticBlockPosition();
1253 LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlin ePosition; 1253 LayoutUnit mainAxis = isColumnFlow() ? staticBlockPosition : staticInlin ePosition;
1254 LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlo ckPosition; 1254 LayoutUnit crossAxis = isColumnFlow() ? staticInlinePosition : staticBlo ckPosition;
1255 crossAxis += delta; 1255 crossAxis += delta;
1256 prepareChildForPositionedLayout(child, mainAxis, crossAxis, NoFlipForRow Reverse); 1256 prepareChildForPositionedLayout(child, mainAxis, crossAxis, NoFlipForRow Reverse);
1257 return; 1257 return;
1258 } 1258 }
1259 1259
1260 setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + Layou tSize(0, delta)); 1260 setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + Layou tSize(0, delta));
1261 } 1261 }
1262 1262
1263 void RenderFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts) 1263 void RenderFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts)
1264 { 1264 {
1265 // Keep track of the space between the baseline edge and the after edge of t he box for each line. 1265 // Keep track of the space between the baseline edge and the after edge of t he box for each line.
1266 Vector<LayoutUnit> minMarginAfterBaselines; 1266 Vector<LayoutUnit> minMarginAfterBaselines;
1267 1267
1268 RenderBox* child = m_orderIterator.first(); 1268 RenderBox* child = m_orderIterator.first();
1269 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 1269 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
1270 LayoutUnit minMarginAfterBaseline = LayoutUnit::max(); 1270 LayoutUnit minMarginAfterBaseline = LayoutUnit::max();
1271 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExten t; 1271 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExten t;
1272 LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent; 1272 LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent;
1273 1273
1274 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) { 1274 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) {
1275 ASSERT(child); 1275 ASSERT(child);
1276 if (child->isOutOfFlowPositioned()) { 1276 if (child->isOutOfFlowPositioned()) {
1277 if (style()->flexWrap() == FlexWrapReverse) 1277 if (style()->flexWrap() == FlexWrapReverse)
1278 adjustAlignmentForChild(child, lineCrossAxisExtent); 1278 adjustAlignmentForChild(*child, lineCrossAxisExtent);
1279 continue; 1279 continue;
1280 } 1280 }
1281 1281
1282 if (updateAutoMarginsInCrossAxis(child, std::max(LayoutUnit(0), avai lableAlignmentSpaceForChild(lineCrossAxisExtent, child)))) 1282 if (updateAutoMarginsInCrossAxis(*child, std::max(LayoutUnit(0), ava ilableAlignmentSpaceForChild(lineCrossAxisExtent, *child))))
1283 continue; 1283 continue;
1284 1284
1285 switch (alignmentForChild(*child)) { 1285 switch (alignmentForChild(*child)) {
1286 case ItemPositionAuto: 1286 case ItemPositionAuto:
1287 ASSERT_NOT_REACHED(); 1287 ASSERT_NOT_REACHED();
1288 break; 1288 break;
1289 case ItemPositionStretch: { 1289 case ItemPositionStretch: {
1290 applyStretchAlignmentToChild(child, lineCrossAxisExtent); 1290 applyStretchAlignmentToChild(*child, lineCrossAxisExtent);
1291 // Since wrap-reverse flips cross start and cross end, strech ch ildren should be aligned with the cross end. 1291 // Since wrap-reverse flips cross start and cross end, strech ch ildren should be aligned with the cross end.
1292 if (style()->flexWrap() == FlexWrapReverse) 1292 if (style()->flexWrap() == FlexWrapReverse)
1293 adjustAlignmentForChild(child, availableAlignmentSpaceForChi ld(lineCrossAxisExtent, child)); 1293 adjustAlignmentForChild(*child, availableAlignmentSpaceForCh ild(lineCrossAxisExtent, *child));
1294 break; 1294 break;
1295 } 1295 }
1296 case ItemPositionFlexStart: 1296 case ItemPositionFlexStart:
1297 break; 1297 break;
1298 case ItemPositionFlexEnd: 1298 case ItemPositionFlexEnd:
1299 adjustAlignmentForChild(child, availableAlignmentSpaceForChild(l ineCrossAxisExtent, child)); 1299 adjustAlignmentForChild(*child, availableAlignmentSpaceForChild( lineCrossAxisExtent, *child));
1300 break; 1300 break;
1301 case ItemPositionCenter: 1301 case ItemPositionCenter:
1302 adjustAlignmentForChild(child, availableAlignmentSpaceForChild(l ineCrossAxisExtent, child) / 2); 1302 adjustAlignmentForChild(*child, availableAlignmentSpaceForChild( lineCrossAxisExtent, *child) / 2);
1303 break; 1303 break;
1304 case ItemPositionBaseline: { 1304 case ItemPositionBaseline: {
1305 // FIXME: If we get here in columns, we want the use the descent , except we currently can't get the ascent/descent of orthogonal children. 1305 // FIXME: If we get here in columns, we want the use the descent , except we currently can't get the ascent/descent of orthogonal children.
1306 // https://bugs.webkit.org/show_bug.cgi?id=98076 1306 // https://bugs.webkit.org/show_bug.cgi?id=98076
1307 LayoutUnit ascent = marginBoxAscentForChild(child); 1307 LayoutUnit ascent = marginBoxAscentForChild(*child);
1308 LayoutUnit startOffset = maxAscent - ascent; 1308 LayoutUnit startOffset = maxAscent - ascent;
1309 adjustAlignmentForChild(child, startOffset); 1309 adjustAlignmentForChild(*child, startOffset);
1310 1310
1311 if (style()->flexWrap() == FlexWrapReverse) 1311 if (style()->flexWrap() == FlexWrapReverse)
1312 minMarginAfterBaseline = std::min(minMarginAfterBaseline, av ailableAlignmentSpaceForChild(lineCrossAxisExtent, child) - startOffset); 1312 minMarginAfterBaseline = std::min(minMarginAfterBaseline, av ailableAlignmentSpaceForChild(lineCrossAxisExtent, *child) - startOffset);
1313 break; 1313 break;
1314 } 1314 }
1315 case ItemPositionLastBaseline: 1315 case ItemPositionLastBaseline:
1316 case ItemPositionSelfStart: 1316 case ItemPositionSelfStart:
1317 case ItemPositionSelfEnd: 1317 case ItemPositionSelfEnd:
1318 case ItemPositionStart: 1318 case ItemPositionStart:
1319 case ItemPositionEnd: 1319 case ItemPositionEnd:
1320 case ItemPositionLeft: 1320 case ItemPositionLeft:
1321 case ItemPositionRight: 1321 case ItemPositionRight:
1322 // FIXME: File a bug about implementing that. The extended gramm ar 1322 // FIXME: File a bug about implementing that. The extended gramm ar
1323 // is not enabled by default so we shouldn't hit this codepath. 1323 // is not enabled by default so we shouldn't hit this codepath.
1324 ASSERT_NOT_REACHED(); 1324 ASSERT_NOT_REACHED();
1325 break; 1325 break;
1326 } 1326 }
1327 } 1327 }
1328 minMarginAfterBaselines.append(minMarginAfterBaseline); 1328 minMarginAfterBaselines.append(minMarginAfterBaseline);
1329 } 1329 }
1330 1330
1331 if (style()->flexWrap() != FlexWrapReverse) 1331 if (style()->flexWrap() != FlexWrapReverse)
1332 return; 1332 return;
1333 1333
1334 // wrap-reverse flips the cross axis start and end. For baseline alignment, this means we 1334 // wrap-reverse flips the cross axis start and end. For baseline alignment, this means we
1335 // need to align the after edge of baseline elements with the after edge of the flex line. 1335 // need to align the after edge of baseline elements with the after edge of the flex line.
1336 child = m_orderIterator.first(); 1336 child = m_orderIterator.first();
1337 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 1337 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
1338 LayoutUnit minMarginAfterBaseline = minMarginAfterBaselines[lineNumber]; 1338 LayoutUnit minMarginAfterBaseline = minMarginAfterBaselines[lineNumber];
1339 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) { 1339 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) {
1340 ASSERT(child); 1340 ASSERT(child);
1341 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMar ginsInCrossAxis(child) && minMarginAfterBaseline) 1341 if (alignmentForChild(*child) == ItemPositionBaseline && !hasAutoMar ginsInCrossAxis(*child) && minMarginAfterBaseline)
1342 adjustAlignmentForChild(child, minMarginAfterBaseline); 1342 adjustAlignmentForChild(*child, minMarginAfterBaseline);
1343 } 1343 }
1344 } 1344 }
1345 } 1345 }
1346 1346
1347 void RenderFlexibleBox::applyStretchAlignmentToChild(RenderBox* child, LayoutUni t lineCrossAxisExtent) 1347 void RenderFlexibleBox::applyStretchAlignmentToChild(RenderBox& child, LayoutUni t lineCrossAxisExtent)
1348 { 1348 {
1349 if (!isColumnFlow() && child->style()->logicalHeight().isAuto()) { 1349 if (!isColumnFlow() && child.style()->logicalHeight().isAuto()) {
1350 // FIXME: If the child has orthogonal flow, then it already has an overr ide height set, so use it. 1350 // FIXME: If the child has orthogonal flow, then it already has an overr ide height set, so use it.
1351 if (!hasOrthogonalFlow(*child)) { 1351 if (!hasOrthogonalFlow(child)) {
1352 LayoutUnit heightBeforeStretching = needToStretchChildLogicalHeight( *child) ? constrainedChildIntrinsicContentLogicalHeight(*child) : child->logical Height(); 1352 LayoutUnit heightBeforeStretching = needToStretchChildLogicalHeight( child) ? constrainedChildIntrinsicContentLogicalHeight(child) : child.logicalHei ght();
1353 LayoutUnit stretchedLogicalHeight = heightBeforeStretching + availab leAlignmentSpaceForChildBeforeStretching(lineCrossAxisExtent, child); 1353 LayoutUnit stretchedLogicalHeight = heightBeforeStretching + availab leAlignmentSpaceForChildBeforeStretching(lineCrossAxisExtent, child);
1354 ASSERT(!child->needsLayout()); 1354 ASSERT(!child.needsLayout());
1355 LayoutUnit desiredLogicalHeight = child->constrainLogicalHeightByMin Max(stretchedLogicalHeight, heightBeforeStretching - child->borderAndPaddingLogi calHeight()); 1355 LayoutUnit desiredLogicalHeight = child.constrainLogicalHeightByMinM ax(stretchedLogicalHeight, heightBeforeStretching - child.borderAndPaddingLogica lHeight());
1356 1356
1357 // FIXME: Can avoid laying out here in some cases. See https://webki t.org/b/87905. 1357 // FIXME: Can avoid laying out here in some cases. See https://webki t.org/b/87905.
1358 if (desiredLogicalHeight != child->logicalHeight()) { 1358 if (desiredLogicalHeight != child.logicalHeight()) {
1359 child->setOverrideLogicalContentHeight(desiredLogicalHeight - ch ild->borderAndPaddingLogicalHeight()); 1359 child.setOverrideLogicalContentHeight(desiredLogicalHeight - chi ld.borderAndPaddingLogicalHeight());
1360 child->setLogicalHeight(0); 1360 child.setLogicalHeight(0);
1361 child->forceChildLayout(); 1361 child.forceChildLayout();
1362 } 1362 }
1363 } 1363 }
1364 } else if (isColumnFlow() && child->style()->logicalWidth().isAuto()) { 1364 } else if (isColumnFlow() && child.style()->logicalWidth().isAuto()) {
1365 // FIXME: If the child doesn't have orthogonal flow, then it already has an override width set, so use it. 1365 // FIXME: If the child doesn't have orthogonal flow, then it already has an override width set, so use it.
1366 if (hasOrthogonalFlow(*child)) { 1366 if (hasOrthogonalFlow(child)) {
1367 LayoutUnit childWidth = std::max<LayoutUnit>(0, lineCrossAxisExtent - crossAxisMarginExtentForChild(child)); 1367 LayoutUnit childWidth = std::max<LayoutUnit>(0, lineCrossAxisExtent - crossAxisMarginExtentForChild(child));
1368 childWidth = child->constrainLogicalWidthByMinMax(childWidth, childW idth, this); 1368 childWidth = child.constrainLogicalWidthByMinMax(childWidth, childWi dth, this);
1369 1369
1370 if (childWidth != child->logicalWidth()) { 1370 if (childWidth != child.logicalWidth()) {
1371 child->setOverrideLogicalContentWidth(childWidth - child->border AndPaddingLogicalWidth()); 1371 child.setOverrideLogicalContentWidth(childWidth - child.borderAn dPaddingLogicalWidth());
1372 child->forceChildLayout(); 1372 child.forceChildLayout();
1373 } 1373 }
1374 } 1374 }
1375 } 1375 }
1376 } 1376 }
1377 1377
1378 void RenderFlexibleBox::flipForRightToLeftColumn() 1378 void RenderFlexibleBox::flipForRightToLeftColumn()
1379 { 1379 {
1380 if (style()->isLeftToRightDirection() || !isColumnFlow()) 1380 if (style()->isLeftToRightDirection() || !isColumnFlow())
1381 return; 1381 return;
1382 1382
1383 LayoutUnit crossExtent = crossAxisExtent(); 1383 LayoutUnit crossExtent = crossAxisExtent();
1384 for (RenderBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) { 1384 for (RenderBox* child = m_orderIterator.first(); child; child = m_orderItera tor.next()) {
1385 if (child->isOutOfFlowPositioned()) 1385 if (child->isOutOfFlowPositioned())
1386 continue; 1386 continue;
1387 LayoutPoint location = flowAwareLocationForChild(child); 1387 LayoutPoint location = flowAwareLocationForChild(*child);
1388 // For vertical flows, setFlowAwareLocationForChild will transpose x and y, 1388 // For vertical flows, setFlowAwareLocationForChild will transpose x and y,
1389 // so using the y axis for a column cross axis extent is correct. 1389 // so using the y axis for a column cross axis extent is correct.
1390 location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y ()); 1390 location.setY(crossExtent - crossAxisExtentForChild(*child) - location.y ());
1391 setFlowAwareLocationForChild(child, location); 1391 setFlowAwareLocationForChild(*child, location);
1392 } 1392 }
1393 } 1393 }
1394 1394
1395 void RenderFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContex ts, LayoutUnit crossAxisStartEdge) 1395 void RenderFlexibleBox::flipForWrapReverse(const Vector<LineContext>& lineContex ts, LayoutUnit crossAxisStartEdge)
1396 { 1396 {
1397 LayoutUnit contentExtent = crossAxisContentExtent(); 1397 LayoutUnit contentExtent = crossAxisContentExtent();
1398 RenderBox* child = m_orderIterator.first(); 1398 RenderBox* child = m_orderIterator.first();
1399 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) { 1399 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
1400 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) { 1400 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb erOfChildren; ++childNumber, child = m_orderIterator.next()) {
1401 ASSERT(child); 1401 ASSERT(child);
1402 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; 1402 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent;
1403 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; 1403 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge;
1404 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; 1404 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent;
1405 adjustAlignmentForChild(child, newOffset - originalOffset); 1405 adjustAlignmentForChild(*child, newOffset - originalOffset);
1406 } 1406 }
1407 } 1407 }
1408 } 1408 }
1409 1409
1410 } 1410 }
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderFlexibleBox.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698