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 // Determine whether the new version of the intrinsic size algorithm of the flexbox | |
131 // spec would produce a different result than our above algorithm. | |
leviw_travelin_and_unemployed
2015/08/20 21:45:49
Could we maybe extract this into a function?
cbiesinger
2015/08/20 22:00:44
Done
| |
132 // The algorithm produces a different result iff the max-content flex fr action | |
133 // (as defined in the new algorithm) is not identical for each flex item . | |
134 if (isColumnFlow()) | |
135 continue; | |
136 Length flexBasis = child->styleRef().flexBasis(); | |
137 float flexGrow = child->styleRef().flexGrow(); | |
138 // A flex-basis of auto will lead to a max-content flex fraction of zero , so just like | |
139 // an inflexible item it would compute to a size of max-content, so we i gnore it here. | |
140 if (flexBasis.isAuto() || flexGrow == 0) | |
141 continue; | |
142 flexGrow = std::max(1.0f, flexGrow); | |
143 float maxContentFlexFraction = maxPreferredLogicalWidth.toFloat() / flex Grow; | |
144 if (previousMaxContentFlexFraction != -1 && maxContentFlexFraction != pr eviousMaxContentFlexFraction) | |
145 UseCounter::count(document(), UseCounter::FlexboxIntrinsicSizeAlgori thmIsDifferent); | |
146 previousMaxContentFlexFraction = maxContentFlexFraction; | |
128 } | 147 } |
129 | 148 |
130 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); | 149 maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth); |
131 | 150 |
132 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); | 151 LayoutUnit scrollbarWidth = intrinsicScrollbarLogicalWidth(); |
133 maxLogicalWidth += scrollbarWidth; | 152 maxLogicalWidth += scrollbarWidth; |
134 minLogicalWidth += scrollbarWidth; | 153 minLogicalWidth += scrollbarWidth; |
135 } | 154 } |
136 | 155 |
137 static int synthesizedBaselineFromContentBox(const LayoutBox& box, LineDirection Mode direction) | 156 static int synthesizedBaselineFromContentBox(const LayoutBox& box, LineDirection Mode direction) |
(...skipping 1308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1446 ASSERT(child); | 1465 ASSERT(child); |
1447 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; | 1466 LayoutUnit lineCrossAxisExtent = lineContexts[lineNumber].crossAxisE xtent; |
1448 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; | 1467 LayoutUnit originalOffset = lineContexts[lineNumber].crossAxisOffset - crossAxisStartEdge; |
1449 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; | 1468 LayoutUnit newOffset = contentExtent - originalOffset - lineCrossAxi sExtent; |
1450 adjustAlignmentForChild(*child, newOffset - originalOffset); | 1469 adjustAlignmentForChild(*child, newOffset - originalOffset); |
1451 } | 1470 } |
1452 } | 1471 } |
1453 } | 1472 } |
1454 | 1473 |
1455 } | 1474 } |
OLD | NEW |