OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 } |
OLD | NEW |