| 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 390 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 // We have to reset this, because changes to our ancestors' style | 401 // We have to reset this, because changes to our ancestors' style |
| 402 // can affect this value. | 402 // can affect this value. |
| 403 m_hasDefiniteHeight = SizeDefiniteness::Unknown; | 403 m_hasDefiniteHeight = SizeDefiniteness::Unknown; |
| 404 } | 404 } |
| 405 | 405 |
| 406 void LayoutFlexibleBox::paintChildren(const PaintInfo& paintInfo, const LayoutPo
int& paintOffset) const | 406 void LayoutFlexibleBox::paintChildren(const PaintInfo& paintInfo, const LayoutPo
int& paintOffset) const |
| 407 { | 407 { |
| 408 BlockPainter::paintChildrenOfFlexibleBox(*this, paintInfo, paintOffset); | 408 BlockPainter::paintChildrenOfFlexibleBox(*this, paintInfo, paintOffset); |
| 409 } | 409 } |
| 410 | 410 |
| 411 void LayoutFlexibleBox::repositionLogicalHeightDependentFlexItems(Vector<LineCon
text>& lineContexts) | 411 void LayoutFlexibleBox::repositionLogicalHeightDependentFlexItems(Vector<LineCon
text>& lineContexts, LayoutObject* childToExclude) |
| 412 { | 412 { |
| 413 LayoutUnit crossAxisStartEdge = lineContexts.isEmpty() ? LayoutUnit() : line
Contexts[0].crossAxisOffset; | 413 LayoutUnit crossAxisStartEdge = lineContexts.isEmpty() ? LayoutUnit() : line
Contexts[0].crossAxisOffset; |
| 414 alignFlexLines(lineContexts); | 414 alignFlexLines(lineContexts); |
| 415 | 415 |
| 416 alignChildren(lineContexts); | 416 alignChildren(lineContexts, childToExclude); |
| 417 | 417 |
| 418 if (style()->flexWrap() == FlexWrapReverse) | 418 if (style()->flexWrap() == FlexWrapReverse) |
| 419 flipForWrapReverse(lineContexts, crossAxisStartEdge); | 419 flipForWrapReverse(lineContexts, crossAxisStartEdge); |
| 420 | 420 |
| 421 // direction:rtl + flex-direction:column means the cross-axis direction is f
lipped. | 421 // direction:rtl + flex-direction:column means the cross-axis direction is f
lipped. |
| 422 flipForRightToLeftColumn(); | 422 flipForRightToLeftColumn(); |
| 423 } | 423 } |
| 424 | 424 |
| 425 LayoutUnit LayoutFlexibleBox::clientLogicalBottomAfterRepositioning() | 425 LayoutUnit LayoutFlexibleBox::clientLogicalBottomAfterRepositioning() |
| 426 { | 426 { |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 885 Vector<LineContext> lineContexts; | 885 Vector<LineContext> lineContexts; |
| 886 OrderedFlexItemList orderedChildren; | 886 OrderedFlexItemList orderedChildren; |
| 887 LayoutUnit sumFlexBaseSize; | 887 LayoutUnit sumFlexBaseSize; |
| 888 double totalFlexGrow; | 888 double totalFlexGrow; |
| 889 double totalFlexShrink; | 889 double totalFlexShrink; |
| 890 double totalWeightedFlexShrink; | 890 double totalWeightedFlexShrink; |
| 891 LayoutUnit sumHypotheticalMainSize; | 891 LayoutUnit sumHypotheticalMainSize; |
| 892 | 892 |
| 893 PaintLayerScrollableArea::PreventRelayoutScope preventRelayoutScope(layoutSc
ope); | 893 PaintLayerScrollableArea::PreventRelayoutScope preventRelayoutScope(layoutSc
ope); |
| 894 | 894 |
| 895 // Fieldsets need to find their legend and position it inside the border of
the object. |
| 896 // The legend then gets skipped during normal layout. |
| 897 // It doesn't get included in the normal layout process but is instead skipp
ed. |
| 898 LayoutObject* childToExclude = layoutSpecialExcludedChild(relayoutChildren,
layoutScope); |
| 899 |
| 895 m_orderIterator.first(); | 900 m_orderIterator.first(); |
| 896 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefor
e(); | 901 LayoutUnit crossAxisOffset = flowAwareBorderBefore() + flowAwarePaddingBefor
e(); |
| 897 while (computeNextFlexLine(orderedChildren, sumFlexBaseSize, totalFlexGrow,
totalFlexShrink, totalWeightedFlexShrink, sumHypotheticalMainSize, relayoutChild
ren)) { | 902 while (computeNextFlexLine(orderedChildren, sumFlexBaseSize, totalFlexGrow,
totalFlexShrink, totalWeightedFlexShrink, sumHypotheticalMainSize, relayoutChild
ren, childToExclude)) { |
| 898 LayoutUnit containerMainInnerSize = mainAxisContentExtent(sumHypothetica
lMainSize); | 903 LayoutUnit containerMainInnerSize = mainAxisContentExtent(sumHypothetica
lMainSize); |
| 899 // availableFreeSpace is the initial amount of free space in this flexbo
x. | 904 // availableFreeSpace is the initial amount of free space in this flexbo
x. |
| 900 // remainingFreeSpace starts out at the same value but as we place and l
ay out | 905 // remainingFreeSpace starts out at the same value but as we place and l
ay out |
| 901 // flex items we subtract from it. Note that both values can be negative
. | 906 // flex items we subtract from it. Note that both values can be negative
. |
| 902 LayoutUnit remainingFreeSpace = containerMainInnerSize - sumFlexBaseSize
; | 907 LayoutUnit remainingFreeSpace = containerMainInnerSize - sumFlexBaseSize
; |
| 903 FlexSign flexSign = (sumHypotheticalMainSize < containerMainInnerSize) ?
PositiveFlexibility : NegativeFlexibility; | 908 FlexSign flexSign = (sumHypotheticalMainSize < containerMainInnerSize) ?
PositiveFlexibility : NegativeFlexibility; |
| 904 freezeInflexibleItems(flexSign, orderedChildren, remainingFreeSpace, tot
alFlexGrow, totalFlexShrink, totalWeightedFlexShrink); | 909 freezeInflexibleItems(flexSign, orderedChildren, remainingFreeSpace, tot
alFlexGrow, totalFlexShrink, totalWeightedFlexShrink); |
| 905 // The initial free space gets calculated after freezing inflexible item
s. https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 3 | 910 // The initial free space gets calculated after freezing inflexible item
s. https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 3 |
| 906 const LayoutUnit initialFreeSpace = remainingFreeSpace; | 911 const LayoutUnit initialFreeSpace = remainingFreeSpace; |
| 907 while (!resolveFlexibleLengths(flexSign, orderedChildren, initialFreeSpa
ce, remainingFreeSpace, totalFlexGrow, totalFlexShrink, totalWeightedFlexShrink)
) { | 912 while (!resolveFlexibleLengths(flexSign, orderedChildren, initialFreeSpa
ce, remainingFreeSpace, totalFlexGrow, totalFlexShrink, totalWeightedFlexShrink)
) { |
| (...skipping 17 matching lines...) Expand all Loading... |
| 925 // Even if computeNextFlexLine returns true, the flexbox might not have | 930 // Even if computeNextFlexLine returns true, the flexbox might not have |
| 926 // a line because all our children might be out of flow positioned. | 931 // a line because all our children might be out of flow positioned. |
| 927 // Instead of just checking if we have a line, make sure the flexbox | 932 // Instead of just checking if we have a line, make sure the flexbox |
| 928 // has at least a line's worth of height to cover this case. | 933 // has at least a line's worth of height to cover this case. |
| 929 LayoutUnit minHeight = minimumLogicalHeightForEmptyLine(); | 934 LayoutUnit minHeight = minimumLogicalHeightForEmptyLine(); |
| 930 if (size().height() < minHeight) | 935 if (size().height() < minHeight) |
| 931 setLogicalHeight(minHeight); | 936 setLogicalHeight(minHeight); |
| 932 } | 937 } |
| 933 | 938 |
| 934 updateLogicalHeight(); | 939 updateLogicalHeight(); |
| 935 repositionLogicalHeightDependentFlexItems(lineContexts); | 940 repositionLogicalHeightDependentFlexItems(lineContexts, childToExclude); |
| 936 } | 941 } |
| 937 | 942 |
| 938 LayoutUnit LayoutFlexibleBox::autoMarginOffsetInMainAxis(const OrderedFlexItemLi
st& children, LayoutUnit& availableFreeSpace) | 943 LayoutUnit LayoutFlexibleBox::autoMarginOffsetInMainAxis(const OrderedFlexItemLi
st& children, LayoutUnit& availableFreeSpace) |
| 939 { | 944 { |
| 940 if (availableFreeSpace <= LayoutUnit()) | 945 if (availableFreeSpace <= LayoutUnit()) |
| 941 return LayoutUnit(); | 946 return LayoutUnit(); |
| 942 | 947 |
| 943 int numberOfAutoMargins = 0; | 948 int numberOfAutoMargins = 0; |
| 944 bool isHorizontal = isHorizontalFlow(); | 949 bool isHorizontal = isHorizontalFlow(); |
| 945 for (size_t i = 0; i < children.size(); ++i) { | 950 for (size_t i = 0; i < children.size(); ++i) { |
| (...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1214 | 1219 |
| 1215 LayoutFlexibleBox::FlexItem LayoutFlexibleBox::constructFlexItem(LayoutBox& chil
d, ChildLayoutType layoutType) | 1220 LayoutFlexibleBox::FlexItem LayoutFlexibleBox::constructFlexItem(LayoutBox& chil
d, ChildLayoutType layoutType) |
| 1216 { | 1221 { |
| 1217 LayoutUnit borderAndPadding = isHorizontalFlow() ? child.borderAndPaddingWid
th() : child.borderAndPaddingHeight(); | 1222 LayoutUnit borderAndPadding = isHorizontalFlow() ? child.borderAndPaddingWid
th() : child.borderAndPaddingHeight(); |
| 1218 LayoutUnit childInnerFlexBaseSize = computeInnerFlexBaseSizeForChild(child,
borderAndPadding, layoutType); | 1223 LayoutUnit childInnerFlexBaseSize = computeInnerFlexBaseSizeForChild(child,
borderAndPadding, layoutType); |
| 1219 LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(ch
ild, childInnerFlexBaseSize); | 1224 LayoutUnit childMinMaxAppliedMainAxisExtent = adjustChildSizeForMinAndMax(ch
ild, childInnerFlexBaseSize); |
| 1220 LayoutUnit margin = isHorizontalFlow() ? child.marginWidth() : child.marginH
eight(); | 1225 LayoutUnit margin = isHorizontalFlow() ? child.marginWidth() : child.marginH
eight(); |
| 1221 return FlexItem(&child, childInnerFlexBaseSize, childMinMaxAppliedMainAxisEx
tent, borderAndPadding, margin); | 1226 return FlexItem(&child, childInnerFlexBaseSize, childMinMaxAppliedMainAxisEx
tent, borderAndPadding, margin); |
| 1222 } | 1227 } |
| 1223 | 1228 |
| 1224 bool LayoutFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren
, LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalFlexShrink, d
ouble& totalWeightedFlexShrink, LayoutUnit& sumHypotheticalMainSize, bool relayo
utChildren) | 1229 bool LayoutFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren
, LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalFlexShrink, d
ouble& totalWeightedFlexShrink, LayoutUnit& sumHypotheticalMainSize, bool relayo
utChildren, LayoutObject* childToExclude) |
| 1225 { | 1230 { |
| 1226 orderedChildren.clear(); | 1231 orderedChildren.clear(); |
| 1227 sumFlexBaseSize = LayoutUnit(); | 1232 sumFlexBaseSize = LayoutUnit(); |
| 1228 totalFlexGrow = totalFlexShrink = totalWeightedFlexShrink = 0; | 1233 totalFlexGrow = totalFlexShrink = totalWeightedFlexShrink = 0; |
| 1229 sumHypotheticalMainSize = LayoutUnit(); | 1234 sumHypotheticalMainSize = LayoutUnit(); |
| 1230 | 1235 |
| 1231 if (!m_orderIterator.currentChild()) | 1236 if (!m_orderIterator.currentChild()) |
| 1232 return false; | 1237 return false; |
| 1233 | 1238 |
| 1234 LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max()); | 1239 LayoutUnit lineBreakLength = mainAxisContentExtent(LayoutUnit::max()); |
| 1235 | 1240 |
| 1236 bool lineHasInFlowItem = false; | 1241 bool lineHasInFlowItem = false; |
| 1237 | 1242 |
| 1238 for (LayoutBox* child = m_orderIterator.currentChild(); child; child = m_ord
erIterator.next()) { | 1243 for (LayoutBox* child = m_orderIterator.currentChild(); child; child = m_ord
erIterator.next()) { |
| 1244 |
| 1245 if (childToExclude == child) |
| 1246 continue; // Skip this child, since it will be positioned by the spe
cialized subclass (fieldsets runs). |
| 1247 |
| 1239 if (child->isOutOfFlowPositioned()) { | 1248 if (child->isOutOfFlowPositioned()) { |
| 1240 orderedChildren.append(FlexItem(child)); | 1249 orderedChildren.append(FlexItem(child)); |
| 1241 continue; | 1250 continue; |
| 1242 } | 1251 } |
| 1243 | 1252 |
| 1244 ChildLayoutType layoutType = relayoutChildren ? ForceLayout : LayoutIfNe
eded; | 1253 ChildLayoutType layoutType = relayoutChildren ? ForceLayout : LayoutIfNe
eded; |
| 1245 | 1254 |
| 1246 // If this condition is true, then computeMainAxisExtentForChild will ca
ll child.intrinsicContentLogicalHeight() | 1255 // If this condition is true, then computeMainAxisExtentForChild will ca
ll child.intrinsicContentLogicalHeight() |
| 1247 // and child.scrollbarLogicalHeight(), so if the child has intrinsic min
/max/preferred size, | 1256 // and child.scrollbarLogicalHeight(), so if the child has intrinsic min
/max/preferred size, |
| 1248 // run layout on it now to make sure its logical height and scroll bars
are up to date. | 1257 // run layout on it now to make sure its logical height and scroll bars
are up to date. |
| (...skipping 550 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1799 } | 1808 } |
| 1800 | 1809 |
| 1801 void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit del
ta) | 1810 void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child, LayoutUnit del
ta) |
| 1802 { | 1811 { |
| 1803 if (child.isOutOfFlowPositioned()) | 1812 if (child.isOutOfFlowPositioned()) |
| 1804 return; | 1813 return; |
| 1805 | 1814 |
| 1806 setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + Layou
tSize(LayoutUnit(), delta)); | 1815 setFlowAwareLocationForChild(child, flowAwareLocationForChild(child) + Layou
tSize(LayoutUnit(), delta)); |
| 1807 } | 1816 } |
| 1808 | 1817 |
| 1809 void LayoutFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts) | 1818 void LayoutFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts, L
ayoutObject* childToExclude) |
| 1810 { | 1819 { |
| 1811 // Keep track of the space between the baseline edge and the after edge of t
he box for each line. | 1820 // Keep track of the space between the baseline edge and the after edge of t
he box for each line. |
| 1812 Vector<LayoutUnit> minMarginAfterBaselines; | 1821 Vector<LayoutUnit> minMarginAfterBaselines; |
| 1813 | 1822 |
| 1814 LayoutBox* child = m_orderIterator.first(); | 1823 LayoutBox* child = m_orderIterator.first(); |
| 1815 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber)
{ | 1824 for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber)
{ |
| 1816 LayoutUnit minMarginAfterBaseline = LayoutUnit::max(); | 1825 LayoutUnit minMarginAfterBaseline = LayoutUnit::max(); |
| 1817 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExten
t; | 1826 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisExten
t; |
| 1818 LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent; | 1827 LayoutUnit maxAscent = lineContexts[lineNumber].maxAscent; |
| 1819 | 1828 |
| 1820 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb
erOfChildren; ++childNumber, child = m_orderIterator.next()) { | 1829 for (size_t childNumber = 0; childNumber < lineContexts[lineNumber].numb
erOfChildren; ++childNumber, child = m_orderIterator.next()) { |
| 1821 DCHECK(child); | 1830 DCHECK(child); |
| 1831 if (child == childToExclude) |
| 1832 continue; |
| 1822 if (child->isOutOfFlowPositioned()) { | 1833 if (child->isOutOfFlowPositioned()) { |
| 1823 if (style()->flexWrap() == FlexWrapReverse) | 1834 if (style()->flexWrap() == FlexWrapReverse) |
| 1824 adjustAlignmentForChild(*child, lineCrossAxisExtent); | 1835 adjustAlignmentForChild(*child, lineCrossAxisExtent); |
| 1825 continue; | 1836 continue; |
| 1826 } | 1837 } |
| 1827 | 1838 |
| 1828 if (updateAutoMarginsInCrossAxis(*child, std::max(LayoutUnit(), avai
lableAlignmentSpaceForChild(lineCrossAxisExtent, *child)))) | 1839 if (updateAutoMarginsInCrossAxis(*child, std::max(LayoutUnit(), avai
lableAlignmentSpaceForChild(lineCrossAxisExtent, *child)))) |
| 1829 continue; | 1840 continue; |
| 1830 | 1841 |
| 1831 ItemPosition position = alignmentForChild(*child); | 1842 ItemPosition position = alignmentForChild(*child); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1922 DCHECK(child); | 1933 DCHECK(child); |
| 1923 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; | 1934 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; |
| 1924 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; | 1935 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; |
| 1925 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; | 1936 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; |
| 1926 adjustAlignmentForChild(*child, newOffset - originalOffset); | 1937 adjustAlignmentForChild(*child, newOffset - originalOffset); |
| 1927 } | 1938 } |
| 1928 } | 1939 } |
| 1929 } | 1940 } |
| 1930 | 1941 |
| 1931 } // namespace blink | 1942 } // namespace blink |
| OLD | NEW |