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 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
87 LayoutFlexibleBox* layoutObject = new LayoutFlexibleBox(nullptr); | 87 LayoutFlexibleBox* layoutObject = new LayoutFlexibleBox(nullptr); |
88 layoutObject->setDocumentForAnonymous(document); | 88 layoutObject->setDocumentForAnonymous(document); |
89 return layoutObject; | 89 return layoutObject; |
90 } | 90 } |
91 | 91 |
92 void LayoutFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidt
h, LayoutUnit& maxLogicalWidth) const | 92 void LayoutFlexibleBox::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidt
h, LayoutUnit& maxLogicalWidth) const |
93 { | 93 { |
94 // FIXME: We're ignoring flex-basis here and we shouldn't. We can't start ho
noring it though until | 94 // FIXME: We're ignoring flex-basis here and we shouldn't. We can't start ho
noring it though until |
95 // the flex shorthand stops setting it to 0. | 95 // the flex shorthand stops setting it to 0. |
96 // See https://bugs.webkit.org/show_bug.cgi?id=116117 and http://crbug.com/2
40765. | 96 // See https://bugs.webkit.org/show_bug.cgi?id=116117 and http://crbug.com/2
40765. |
| 97 float previousMaxContentFlexFraction = -1; |
97 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { | 98 for (LayoutBox* child = firstChildBox(); child; child = child->nextSiblingBo
x()) { |
98 if (child->isOutOfFlowPositioned()) | 99 if (child->isOutOfFlowPositioned()) |
99 continue; | 100 continue; |
100 | 101 |
101 LayoutUnit margin = marginIntrinsicLogicalWidthForChild(*child); | 102 LayoutUnit margin = marginIntrinsicLogicalWidthForChild(*child); |
102 | 103 |
103 LayoutUnit minPreferredLogicalWidth; | 104 LayoutUnit minPreferredLogicalWidth; |
104 LayoutUnit maxPreferredLogicalWidth; | 105 LayoutUnit maxPreferredLogicalWidth; |
105 bool hasOrthogonalWritingMode = child->isHorizontalWritingMode() != isHo
rizontalWritingMode(); | 106 bool hasOrthogonalWritingMode = child->isHorizontalWritingMode() != isHo
rizontalWritingMode(); |
106 if (hasOrthogonalWritingMode) { | 107 if (hasOrthogonalWritingMode) { |
(...skipping 11 matching lines...) Expand all Loading... |
118 if (isMultiline()) { | 119 if (isMultiline()) { |
119 // For multiline, the min preferred width is if you put a break
between each item. | 120 // For multiline, the min preferred width is if you put a break
between each item. |
120 minLogicalWidth = std::max(minLogicalWidth, minPreferredLogicalW
idth); | 121 minLogicalWidth = std::max(minLogicalWidth, minPreferredLogicalW
idth); |
121 } else { | 122 } else { |
122 minLogicalWidth += minPreferredLogicalWidth; | 123 minLogicalWidth += minPreferredLogicalWidth; |
123 } | 124 } |
124 } else { | 125 } else { |
125 minLogicalWidth = std::max(minPreferredLogicalWidth, minLogicalWidth
); | 126 minLogicalWidth = std::max(minPreferredLogicalWidth, minLogicalWidth
); |
126 maxLogicalWidth = std::max(maxPreferredLogicalWidth, maxLogicalWidth
); | 127 maxLogicalWidth = std::max(maxPreferredLogicalWidth, maxLogicalWidth
); |
127 } | 128 } |
| 129 |
| 130 previousMaxContentFlexFraction = countIntrinsicSizeForAlgorithmChange(ma
xPreferredLogicalWidth, child, previousMaxContentFlexFraction); |
128 } | 131 } |
129 | 132 |
130 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); | 133 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); |
131 | 134 |
132 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); | 135 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); |
133 maxLogicalWidth += scrollbarWidth; | 136 maxLogicalWidth += scrollbarWidth; |
134 minLogicalWidth += scrollbarWidth; | 137 minLogicalWidth += scrollbarWidth; |
135 } | 138 } |
136 | 139 |
| 140 float LayoutFlexibleBox::countIntrinsicSizeForAlgorithmChange(LayoutUnit maxPref
erredLogicalWidth, LayoutBox* child, float previousMaxContentFlexFraction) const |
| 141 { |
| 142 // Determine whether the new version of the intrinsic size algorithm of the
flexbox |
| 143 // spec would produce a different result than our above algorithm. |
| 144 // The algorithm produces a different result iff the max-content flex fracti
on |
| 145 // (as defined in the new algorithm) is not identical for each flex item. |
| 146 if (isColumnFlow()) |
| 147 return previousMaxContentFlexFraction; |
| 148 Length flexBasis = child->styleRef().flexBasis(); |
| 149 float flexGrow = child->styleRef().flexGrow(); |
| 150 // A flex-basis of auto will lead to a max-content flex fraction of zero, so
just like |
| 151 // an inflexible item it would compute to a size of max-content, so we ignor
e it here. |
| 152 if (flexBasis.isAuto() || flexGrow == 0) |
| 153 return previousMaxContentFlexFraction; |
| 154 flexGrow = std::max(1.0f, flexGrow); |
| 155 float maxContentFlexFraction = maxPreferredLogicalWidth.toFloat() / flexGrow
; |
| 156 if (previousMaxContentFlexFraction != -1 && maxContentFlexFraction != previo
usMaxContentFlexFraction) |
| 157 UseCounter::count(document(), UseCounter::FlexboxIntrinsicSizeAlgorithmI
sDifferent); |
| 158 return maxContentFlexFraction; |
| 159 } |
| 160 |
137 static int synthesizedBaselineFromContentBox(const LayoutBox& box, LineDirection
Mode direction) | 161 static int synthesizedBaselineFromContentBox(const LayoutBox& box, LineDirection
Mode direction) |
138 { | 162 { |
139 if (direction == HorizontalLine) { | 163 if (direction == HorizontalLine) { |
140 return box.size().height() - box.borderBottom() - box.paddingBottom() -
box.verticalScrollbarWidth(); | 164 return box.size().height() - box.borderBottom() - box.paddingBottom() -
box.verticalScrollbarWidth(); |
141 } | 165 } |
142 return box.size().width() - box.borderLeft() - box.paddingLeft() - box.horiz
ontalScrollbarHeight(); | 166 return box.size().width() - box.borderLeft() - box.paddingLeft() - box.horiz
ontalScrollbarHeight(); |
143 } | 167 } |
144 | 168 |
145 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di
rection, LinePositionMode mode) const | 169 int LayoutFlexibleBox::baselinePosition(FontBaseline, bool, LineDirectionMode di
rection, LinePositionMode mode) const |
146 { | 170 { |
(...skipping 1299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1446 ASSERT(child); | 1470 ASSERT(child); |
1447 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; | 1471 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE
xtent; |
1448 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; | 1472 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset
- crossAxisStartEdge; |
1449 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; | 1473 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi
sExtent; |
1450 adjustAlignmentForChild(*child, newOffset - originalOffset); | 1474 adjustAlignmentForChild(*child, newOffset - originalOffset); |
1451 } | 1475 } |
1452 } | 1476 } |
1453 } | 1477 } |
1454 | 1478 |
1455 } | 1479 } |
OLD | NEW |