| Index: third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| index 58d0d21a23198ca623331f6759b9381ba4e83fc0..7acf1f5e21211253a3a50897436657401aafcaf5 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
|
| @@ -120,9 +120,10 @@ LayoutFlexibleBox* LayoutFlexibleBox::createAnonymous(Document* document) {
|
| void LayoutFlexibleBox::computeIntrinsicLogicalWidths(
|
| LayoutUnit& minLogicalWidth,
|
| LayoutUnit& maxLogicalWidth) const {
|
| - // FIXME: We're ignoring flex-basis here and we shouldn't. We can't start honoring it though until
|
| - // the flex shorthand stops setting it to 0.
|
| - // See https://bugs.webkit.org/show_bug.cgi?id=116117 and http://crbug.com/240765.
|
| + // FIXME: We're ignoring flex-basis here and we shouldn't. We can't start
|
| + // honoring it though until the flex shorthand stops setting it to 0. See
|
| + // https://bugs.webkit.org/show_bug.cgi?id=116117 and
|
| + // https://crbug.com/240765.
|
| float previousMaxContentFlexFraction = -1;
|
| for (LayoutBox* child = firstChildBox(); child;
|
| child = child->nextSiblingBox()) {
|
| @@ -142,7 +143,8 @@ void LayoutFlexibleBox::computeIntrinsicLogicalWidths(
|
| if (!isColumnFlow()) {
|
| maxLogicalWidth += maxPreferredLogicalWidth;
|
| if (isMultiline()) {
|
| - // For multiline, the min preferred width is if you put a break between each item.
|
| + // For multiline, the min preferred width is if you put a break between
|
| + // each item.
|
| minLogicalWidth = std::max(minLogicalWidth, minPreferredLogicalWidth);
|
| } else {
|
| minLogicalWidth += minPreferredLogicalWidth;
|
| @@ -158,8 +160,8 @@ void LayoutFlexibleBox::computeIntrinsicLogicalWidths(
|
|
|
| maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth);
|
|
|
| - // Due to negative margins, it is possible that we calculated a negative intrinsic width. Make sure that we
|
| - // never return a negative width.
|
| + // Due to negative margins, it is possible that we calculated a negative
|
| + // intrinsic width. Make sure that we never return a negative width.
|
| minLogicalWidth = std::max(LayoutUnit(), minLogicalWidth);
|
| maxLogicalWidth = std::max(LayoutUnit(), maxLogicalWidth);
|
|
|
| @@ -172,16 +174,18 @@ float LayoutFlexibleBox::countIntrinsicSizeForAlgorithmChange(
|
| LayoutUnit maxPreferredLogicalWidth,
|
| LayoutBox* child,
|
| float previousMaxContentFlexFraction) const {
|
| - // Determine whether the new version of the intrinsic size algorithm of the flexbox
|
| - // spec would produce a different result than our above algorithm.
|
| - // The algorithm produces a different result iff the max-content flex fraction
|
| - // (as defined in the new algorithm) is not identical for each flex item.
|
| + // Determine whether the new version of the intrinsic size algorithm of the
|
| + // flexbox spec would produce a different result than our above algorithm.
|
| + // The algorithm produces a different result iff the max-content flex
|
| + // fraction (as defined in the new algorithm) is not identical for each flex
|
| + // item.
|
| if (isColumnFlow())
|
| return previousMaxContentFlexFraction;
|
| Length flexBasis = child->styleRef().flexBasis();
|
| float flexGrow = child->styleRef().flexGrow();
|
| - // A flex-basis of auto will lead to a max-content flex fraction of zero, so just like
|
| - // an inflexible item it would compute to a size of max-content, so we ignore it here.
|
| + // A flex-basis of auto will lead to a max-content flex fraction of zero, so
|
| + // just like an inflexible item it would compute to a size of max-content, so
|
| + // we ignore it here.
|
| if (flexBasis.isAuto() || flexGrow == 0)
|
| return previousMaxContentFlexFraction;
|
| flexGrow = std::max(1.0f, flexGrow);
|
| @@ -218,9 +222,9 @@ int LayoutFlexibleBox::baselinePosition(FontBaseline,
|
| }
|
|
|
| static const StyleContentAlignmentData& contentAlignmentNormalBehavior() {
|
| - // The justify-content property applies along the main axis, but since flexing
|
| - // in the main axis is controlled by flex, stretch behaves as flex-start (ignoring
|
| - // the specified fallback alignment, if any).
|
| + // The justify-content property applies along the main axis, but since
|
| + // flexing in the main axis is controlled by flex, stretch behaves as
|
| + // flex-start (ignoring the specified fallback alignment, if any).
|
| // https://drafts.csswg.org/css-align/#distribution-flex
|
| static const StyleContentAlignmentData normalBehavior = {
|
| ContentPositionNormal, ContentDistributionStretch};
|
| @@ -263,8 +267,9 @@ int LayoutFlexibleBox::firstLineBoxBaseline() const {
|
|
|
| int baseline = baselineChild->firstLineBoxBaseline();
|
| if (baseline == -1) {
|
| - // FIXME: We should pass |direction| into firstLineBoxBaseline and stop bailing out if we're a writing mode root.
|
| - // This would also fix some cases where the flexbox is orthogonal to its container.
|
| + // FIXME: We should pass |direction| into firstLineBoxBaseline and stop
|
| + // bailing out if we're a writing mode root. This would also fix some
|
| + // cases where the flexbox is orthogonal to its container.
|
| LineDirectionMode direction =
|
| isHorizontalWritingMode() ? HorizontalLine : VerticalLine;
|
| return (synthesizedBaselineFromContentBox(*baselineChild, direction) +
|
| @@ -347,16 +352,19 @@ void LayoutFlexibleBox::removeChild(LayoutObject* child) {
|
| m_intrinsicSizeAlongMainAxis.remove(child);
|
| }
|
|
|
| -// TODO (lajava): Is this function still needed ? Every time the flex container's align-items value changes we
|
| -// propagate the diff to its children (see ComputedStyle::stylePropagationDiff).
|
| +// TODO (lajava): Is this function still needed ? Every time the flex
|
| +// container's align-items value changes we propagate the diff to its children
|
| +// (see ComputedStyle::stylePropagationDiff).
|
| void LayoutFlexibleBox::styleDidChange(StyleDifference diff,
|
| const ComputedStyle* oldStyle) {
|
| LayoutBlock::styleDidChange(diff, oldStyle);
|
|
|
| if (oldStyle && oldStyle->alignItemsPosition() == ItemPositionStretch &&
|
| diff.needsFullLayout()) {
|
| - // Flex items that were previously stretching need to be relayed out so we can compute new available cross axis space.
|
| - // This is only necessary for stretching since other alignment values don't change the size of the box.
|
| + // Flex items that were previously stretching need to be relayed out so we
|
| + // can compute new available cross axis space. This is only necessary for
|
| + // stretching since other alignment values don't change the size of the
|
| + // box.
|
| for (LayoutBox* child = firstChildBox(); child;
|
| child = child->nextSiblingBox()) {
|
| ItemPosition previousAlignment =
|
| @@ -411,20 +419,21 @@ void LayoutFlexibleBox::layoutBlock(bool relayoutChildren) {
|
|
|
| layoutPositionedObjects(relayoutChildren || isDocumentElement());
|
|
|
| - // FIXME: css3/flexbox/repaint-rtl-column.html seems to issue paint invalidations for more overflow than it needs to.
|
| + // FIXME: css3/flexbox/repaint-rtl-column.html seems to issue paint
|
| + // invalidations for more overflow than it needs to.
|
| computeOverflow(clientLogicalBottomAfterRepositioning());
|
| }
|
|
|
| updateLayerTransformAfterLayout();
|
|
|
| - // Update our scroll information if we're overflow:auto/scroll/hidden now that we know if
|
| - // we overflow or not.
|
| + // Update our scroll information if we're overflow:auto/scroll/hidden now
|
| + // that we know if we overflow or not.
|
| updateAfterLayout();
|
|
|
| clearNeedsLayout();
|
|
|
| - // We have to reset this, because changes to our ancestors' style
|
| - // can affect this value.
|
| + // We have to reset this, because changes to our ancestors' style can affect
|
| + // this value.
|
| m_hasDefiniteHeight = SizeDefiniteness::Unknown;
|
| }
|
|
|
| @@ -445,7 +454,8 @@ void LayoutFlexibleBox::repositionLogicalHeightDependentFlexItems(
|
| if (style()->flexWrap() == FlexWrapReverse)
|
| flipForWrapReverse(lineContexts, crossAxisStartEdge);
|
|
|
| - // direction:rtl + flex-direction:column means the cross-axis direction is flipped.
|
| + // direction:rtl + flex-direction:column means the cross-axis direction is
|
| + // flipped.
|
| flipForRightToLeftColumn();
|
| }
|
|
|
| @@ -534,8 +544,8 @@ LayoutUnit LayoutFlexibleBox::childIntrinsicLogicalWidth(
|
| const LayoutBox& child) const {
|
| // This should only be called if the logical width is the cross size
|
| DCHECK(hasOrthogonalFlow(child));
|
| - // If our height is auto, make sure that our returned height is unaffected by earlier layouts by
|
| - // returning the max preferred logical width
|
| + // If our height is auto, make sure that our returned height is unaffected by
|
| + // earlier layouts by returning the max preferred logical width
|
| if (!crossAxisLengthIsDefinite(child, child.styleRef().logicalWidth()))
|
| return child.maxPreferredLogicalWidth();
|
|
|
| @@ -594,22 +604,26 @@ LayoutUnit LayoutFlexibleBox::computeMainAxisExtentForChild(
|
| SizeType sizeType,
|
| const Length& size) {
|
| // If we have a horizontal flow, that means the main size is the width.
|
| - // That's the logical width for horizontal writing modes, and the logical height in vertical writing modes.
|
| - // For a vertical flow, main size is the height, so it's the inverse.
|
| - // So we need the logical width if we have a horizontal flow and horizontal writing mode, or vertical flow and vertical writing mode.
|
| - // Otherwise we need the logical height.
|
| + // That's the logical width for horizontal writing modes, and the logical
|
| + // height in vertical writing modes. For a vertical flow, main size is the
|
| + // height, so it's the inverse. So we need the logical width if we have a
|
| + // horizontal flow and horizontal writing mode, or vertical flow and vertical
|
| + // writing mode. Otherwise we need the logical height.
|
| if (isHorizontalFlow() != child.styleRef().isHorizontalWritingMode()) {
|
| - // We don't have to check for "auto" here - computeContentLogicalHeight will just return -1 for that case anyway.
|
| - // It's safe to access scrollbarLogicalHeight here because computeNextFlexLine will have already
|
| - // forced layout on the child.
|
| - // We previously layed out the child if necessary (see computeNextFlexLine and the call to childHasIntrinsicMainAxisSize)
|
| - // so we can be sure that the two height calls here will return up-to-date data.
|
| + // We don't have to check for "auto" here - computeContentLogicalHeight
|
| + // will just return -1 for that case anyway. It's safe to access
|
| + // scrollbarLogicalHeight here because computeNextFlexLine will have
|
| + // already forced layout on the child. We previously layed out the child
|
| + // if necessary (see computeNextFlexLine and the call to
|
| + // childHasIntrinsicMainAxisSize) so we can be sure that the two height
|
| + // calls here will return up-to-date data.
|
| return child.computeContentLogicalHeight(
|
| sizeType, size, child.intrinsicContentLogicalHeight()) +
|
| child.scrollbarLogicalHeight();
|
| }
|
| - // computeLogicalWidth always re-computes the intrinsic widths. However, when our logical width is auto,
|
| - // we can just use our cached value. So let's do that here. (Compare code in LayoutBlock::computePreferredLogicalWidths)
|
| + // computeLogicalWidth always re-computes the intrinsic widths. However, when
|
| + // our logical width is auto, we can just use our cached value. So let's do
|
| + // that here. (Compare code in LayoutBlock::computePreferredLogicalWidths)
|
| LayoutUnit borderAndPadding = child.borderAndPaddingLogicalWidth();
|
| if (child.styleRef().logicalWidth().isAuto() && !hasAspectRatio(child)) {
|
| if (size.type() == MinContent)
|
| @@ -876,8 +890,8 @@ bool LayoutFlexibleBox::crossAxisLengthIsDefinite(const LayoutBox& child,
|
| definite ? SizeDefiniteness::Definite : SizeDefiniteness::Indefinite;
|
| return definite;
|
| }
|
| - // TODO(cbiesinger): Eventually we should support other types of sizes here. Requires updating
|
| - // computeMainSizeFromAspectRatioUsing.
|
| + // TODO(cbiesinger): Eventually we should support other types of sizes here.
|
| + // Requires updating computeMainSizeFromAspectRatioUsing.
|
| return length.isFixed();
|
| }
|
|
|
| @@ -896,9 +910,11 @@ void LayoutFlexibleBox::cacheChildMainSize(const LayoutBox& child) {
|
| if (hasOrthogonalFlow(child)) {
|
| mainSize = child.logicalHeight();
|
| } else {
|
| - // The max preferred logical width includes the intrinsic scrollbar logical width, which is only set for
|
| - // overflow: scroll. To handle overflow: auto, we have to take scrollbarLogicalWidth() into account, and then
|
| - // subtract the intrinsic width again so as to not double-count overflow: scroll scrollbars.
|
| + // The max preferred logical width includes the intrinsic scrollbar logical
|
| + // width, which is only set for overflow: scroll. To handle overflow: auto,
|
| + // we have to take scrollbarLogicalWidth() into account, and then subtract
|
| + // the intrinsic width again so as to not double-count overflow: scroll
|
| + // scrollbars.
|
| mainSize = child.maxPreferredLogicalWidth() +
|
| child.scrollbarLogicalWidth() - child.scrollbarLogicalWidth();
|
| }
|
| @@ -942,10 +958,11 @@ LayoutUnit LayoutFlexibleBox::computeInnerFlexBaseSizeForChild(
|
| }
|
| mainAxisExtent = m_intrinsicSizeAlongMainAxis.get(&child);
|
| } else {
|
| - // We don't need to add scrollbarLogicalWidth here. For overflow: scroll, the preferred width
|
| - // already includes the scrollbar size (via scrollbarLogicalWidth()). For overflow: auto,
|
| - // childFlexBaseSizeRequiresLayout returns true and we handle that via the other branch
|
| - // of this if.
|
| + // We don't need to add scrollbarLogicalWidth here. For overflow: scroll,
|
| + // the preferred width already includes the scrollbar size (via
|
| + // scrollbarLogicalWidth()). For overflow: auto,
|
| + // childFlexBaseSizeRequiresLayout returns true and we handle that via the
|
| + // other branch of this if.
|
| mainAxisExtent = child.maxPreferredLogicalWidth();
|
| }
|
| DCHECK_GE(mainAxisExtent - mainAxisBorderAndPadding, LayoutUnit())
|
| @@ -966,9 +983,9 @@ void LayoutFlexibleBox::layoutFlexItems(bool relayoutChildren,
|
| PaintLayerScrollableArea::PreventRelayoutScope preventRelayoutScope(
|
| layoutScope);
|
|
|
| - // Fieldsets need to find their legend and position it inside the border of the object.
|
| - // The legend then gets skipped during normal layout.
|
| - // It doesn't get included in the normal layout process but is instead skipped.
|
| + // Fieldsets need to find their legend and position it inside the border of
|
| + // the object. The legend then gets skipped during normal layout. It
|
| + // doesn't get included in the normal layout process but is instead skipped.
|
| LayoutObject* childToExclude =
|
| layoutSpecialExcludedChild(relayoutChildren, layoutScope);
|
|
|
| @@ -982,8 +999,9 @@ void LayoutFlexibleBox::layoutFlexItems(bool relayoutChildren,
|
| LayoutUnit containerMainInnerSize =
|
| mainAxisContentExtent(sumHypotheticalMainSize);
|
| // availableFreeSpace is the initial amount of free space in this flexbox.
|
| - // remainingFreeSpace starts out at the same value but as we place and lay out
|
| - // flex items we subtract from it. Note that both values can be negative.
|
| + // remainingFreeSpace starts out at the same value but as we place and lay
|
| + // out flex items we subtract from it. Note that both values can be
|
| + // negative.
|
| LayoutUnit remainingFreeSpace = containerMainInnerSize - sumFlexBaseSize;
|
| FlexSign flexSign = (sumHypotheticalMainSize < containerMainInnerSize)
|
| ? PositiveFlexibility
|
| @@ -991,7 +1009,8 @@ void LayoutFlexibleBox::layoutFlexItems(bool relayoutChildren,
|
| freezeInflexibleItems(flexSign, orderedChildren, remainingFreeSpace,
|
| totalFlexGrow, totalFlexShrink,
|
| totalWeightedFlexShrink);
|
| - // The initial free space gets calculated after freezing inflexible items. https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 3
|
| + // The initial free space gets calculated after freezing inflexible items.
|
| + // https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 3
|
| const LayoutUnit initialFreeSpace = remainingFreeSpace;
|
| while (!resolveFlexibleLengths(flexSign, orderedChildren, initialFreeSpace,
|
| remainingFreeSpace, totalFlexGrow,
|
| @@ -1000,8 +1019,8 @@ void LayoutFlexibleBox::layoutFlexItems(bool relayoutChildren,
|
| DCHECK_GE(totalWeightedFlexShrink, 0);
|
| }
|
|
|
| - // Recalculate the remaining free space. The adjustment for flex factors between 0..1 means we can't just
|
| - // use remainingFreeSpace here.
|
| + // Recalculate the remaining free space. The adjustment for flex factors
|
| + // between 0..1 means we can't just use remainingFreeSpace here.
|
| remainingFreeSpace = containerMainInnerSize;
|
| for (size_t i = 0; i < orderedChildren.size(); ++i) {
|
| FlexItem& flexItem = orderedChildren[i];
|
| @@ -1130,13 +1149,15 @@ bool LayoutFlexibleBox::updateAutoMarginsInCrossAxis(
|
| }
|
| bool shouldAdjustTopOrLeft = true;
|
| if (isColumnFlow() && !child.style()->isLeftToRightDirection()) {
|
| - // For column flows, only make this adjustment if topOrLeft corresponds to the "before" margin,
|
| - // so that flipForRightToLeftColumn will do the right thing.
|
| + // For column flows, only make this adjustment if topOrLeft corresponds to
|
| + // the "before" margin, so that flipForRightToLeftColumn will do the right
|
| + // thing.
|
| shouldAdjustTopOrLeft = false;
|
| }
|
| if (!isColumnFlow() && child.style()->isFlippedBlocksWritingMode()) {
|
| - // If we are a flipped writing mode, we need to adjust the opposite side. This is only needed
|
| - // for row flows because this only affects the block-direction axis.
|
| + // If we are a flipped writing mode, we need to adjust the opposite side.
|
| + // This is only needed for row flows because this only affects the
|
| + // block-direction axis.
|
| shouldAdjustTopOrLeft = false;
|
| }
|
|
|
| @@ -1172,8 +1193,10 @@ LayoutUnit LayoutFlexibleBox::marginBoxAscentForChild(const LayoutBox& child) {
|
| }
|
|
|
| LayoutUnit LayoutFlexibleBox::computeChildMarginValue(Length margin) {
|
| - // When resolving the margins, we use the content size for resolving percent and calc (for percents in calc expressions) margins.
|
| - // Fortunately, percent margins are always computed with respect to the block's width, even for margin-top and margin-bottom.
|
| + // When resolving the margins, we use the content size for resolving percent
|
| + // and calc (for percents in calc expressions) margins. Fortunately, percent
|
| + // margins are always computed with respect to the block's width, even for
|
| + // margin-top and margin-bottom.
|
| LayoutUnit availableSize = contentLogicalWidth();
|
| return minimumValueForLength(margin, availableSize);
|
| }
|
| @@ -1189,7 +1212,8 @@ void LayoutFlexibleBox::prepareOrderIteratorAndMargins() {
|
| continue;
|
|
|
| // Before running the flex algorithm, 'auto' has a margin of 0.
|
| - // Also, if we're not auto sizing, we don't do a layout that computes the start/end margins.
|
| + // Also, if we're not auto sizing, we don't do a layout that computes the
|
| + // start/end margins.
|
| if (isHorizontalFlow()) {
|
| child->setMarginLeft(
|
| computeChildMarginValue(child->style()->marginLeft()));
|
| @@ -1222,15 +1246,16 @@ LayoutUnit LayoutFlexibleBox::adjustChildSizeForMinAndMax(
|
| LayoutUnit minExtent;
|
| if (min.isSpecifiedOrIntrinsic()) {
|
| minExtent = computeMainAxisExtentForChild(child, MinSize, min);
|
| - // computeMainAxisExtentForChild can return -1 when the child has a percentage
|
| - // min size, but we have an indefinite size in that axis.
|
| + // computeMainAxisExtentForChild can return -1 when the child has a
|
| + // percentage min size, but we have an indefinite size in that axis.
|
| minExtent = std::max(LayoutUnit(), minExtent);
|
| } else if (min.isAuto() && !child.styleRef().containsSize() &&
|
| mainAxisOverflowForChild(child) == OverflowVisible &&
|
| !(isColumnFlow() && child.isFlexibleBox())) {
|
| - // TODO(cbiesinger): For now, we do not handle min-height: auto for nested column flexboxes. We need
|
| - // to implement https://drafts.csswg.org/css-flexbox/#intrinsic-sizes before that produces
|
| - // reasonable results. Tracking bug: https://crbug.com/581553
|
| + // TODO(cbiesinger): For now, we do not handle min-height: auto for nested
|
| + // column flexboxes. We need to implement
|
| + // https://drafts.csswg.org/css-flexbox/#intrinsic-sizes before that
|
| + // produces reasonable results. Tracking bug: https://crbug.com/581553
|
| // css-flexbox section 4.5
|
| LayoutUnit contentSize =
|
| computeMainAxisExtentForChild(child, MinSize, Length(MinContent));
|
| @@ -1279,10 +1304,12 @@ LayoutUnit LayoutFlexibleBox::crossSizeForPercentageResolution(
|
| if (!hasOrthogonalFlow(child) && child.hasOverrideLogicalContentHeight())
|
| return child.overrideLogicalContentHeight();
|
|
|
| - // We don't currently implement the optimization from https://drafts.csswg.org/css-flexbox/#definite-sizes
|
| - // case 1. While that could speed up a specialized case, it requires determining if we have a definite
|
| - // size, which itself is not cheap. We can consider implementing it at a later time.
|
| - // (The correctness is ensured by redoing layout in applyStretchAlignmentToChild)
|
| + // We don't currently implement the optimization from
|
| + // https://drafts.csswg.org/css-flexbox/#definite-sizes case 1. While that
|
| + // could speed up a specialized case, it requires determining if we have a
|
| + // definite size, which itself is not cheap. We can consider implementing it
|
| + // at a later time. (The correctness is ensured by redoing layout in
|
| + // applyStretchAlignmentToChild)
|
| return LayoutUnit(-1);
|
| }
|
|
|
| @@ -1296,9 +1323,9 @@ LayoutUnit LayoutFlexibleBox::mainSizeForPercentageResolution(
|
| if (!mainAxisLengthIsDefinite(child, flexBasis))
|
| return LayoutUnit(-1);
|
| if (!flexBasis.isPercentOrCalc()) {
|
| - // If flex basis had a percentage, our size is guaranteed to be definite or the flex item's
|
| - // size could not be definite.
|
| - // Otherwise, we make up a percentage to check whether we have a definite size.
|
| + // If flex basis had a percentage, our size is guaranteed to be definite or
|
| + // the flex item's size could not be definite. Otherwise, we make up a
|
| + // percentage to check whether we have a definite size.
|
| if (!mainAxisLengthIsDefinite(child, Length(0, Percent)))
|
| return LayoutUnit(-1);
|
| }
|
| @@ -1381,7 +1408,8 @@ bool LayoutFlexibleBox::computeNextFlexLine(
|
| for (LayoutBox* child = m_orderIterator.currentChild(); child;
|
| child = m_orderIterator.next()) {
|
| if (childToExclude == child)
|
| - continue; // Skip this child, since it will be positioned by the specialized subclass (fieldsets runs).
|
| + continue; // Skip this child, since it will be positioned by the
|
| + // specialized subclass (fieldsets runs).
|
|
|
| if (child->isOutOfFlowPositioned()) {
|
| orderedChildren.append(FlexItem(child));
|
| @@ -1391,9 +1419,11 @@ bool LayoutFlexibleBox::computeNextFlexLine(
|
| ChildLayoutType layoutType =
|
| relayoutChildren ? ForceLayout : LayoutIfNeeded;
|
|
|
| - // If this condition is true, then computeMainAxisExtentForChild will call child.intrinsicContentLogicalHeight()
|
| - // and child.scrollbarLogicalHeight(), so if the child has intrinsic min/max/preferred size,
|
| - // run layout on it now to make sure its logical height and scroll bars are up to date.
|
| + // If this condition is true, then computeMainAxisExtentForChild will call
|
| + // child.intrinsicContentLogicalHeight() and
|
| + // child.scrollbarLogicalHeight(), so if the child has intrinsic
|
| + // min/max/preferred size, run layout on it now to make sure its logical
|
| + // height and scroll bars are up to date.
|
| if (childHasIntrinsicMainAxisSize(*child) && child->needsLayout()) {
|
| child->clearOverrideSize();
|
| child->forceChildLayout();
|
| @@ -1433,9 +1463,11 @@ void LayoutFlexibleBox::freezeViolations(Vector<FlexItem*>& violations,
|
| totalFlexShrink -= child->style()->flexShrink();
|
| totalWeightedFlexShrink -=
|
| child->style()->flexShrink() * violations[i]->flexBaseContentSize;
|
| - // totalWeightedFlexShrink can be negative when we exceed the precision of a double when we initially
|
| - // calcuate totalWeightedFlexShrink. We then subtract each child's weighted flex shrink with full precision,
|
| - // now leading to a negative result. See css3/flexbox/large-flex-shrink-assert.html
|
| + // totalWeightedFlexShrink can be negative when we exceed the precision of
|
| + // a double when we initially calcuate totalWeightedFlexShrink. We then
|
| + // subtract each child's weighted flex shrink with full precision, now
|
| + // leading to a negative result. See
|
| + // css3/flexbox/large-flex-shrink-assert.html
|
| totalWeightedFlexShrink = std::max(totalWeightedFlexShrink, 0.0);
|
| violations[i]->frozen = true;
|
| }
|
| @@ -1448,7 +1480,8 @@ void LayoutFlexibleBox::freezeInflexibleItems(FlexSign flexSign,
|
| double& totalFlexShrink,
|
| double& totalWeightedFlexShrink) {
|
| // Per https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths step 2,
|
| - // we freeze all items with a flex factor of 0 as well as this with a min/max size violation.
|
| + // we freeze all items with a flex factor of 0 as well as those with a min/max
|
| + // size violation.
|
| Vector<FlexItem*> newInflexibleItems;
|
| for (size_t i = 0; i < children.size(); ++i) {
|
| FlexItem& flexItem = children[i];
|
| @@ -1585,11 +1618,12 @@ static LayoutUnit alignmentOffset(LayoutUnit availableFreeSpace,
|
| NOTREACHED();
|
| break;
|
| case ItemPositionStretch:
|
| - // Actual stretching must be handled by the caller.
|
| - // Since wrap-reverse flips cross start and cross end, stretch children should be aligned with the cross end.
|
| - // This matters because applyStretchAlignment doesn't always stretch or stretch fully (explicit cross size given,
|
| - // or stretching constrained by max-height/max-width).
|
| - // For flex-start and flex-end this is handled by alignmentForChild().
|
| + // Actual stretching must be handled by the caller. Since wrap-reverse
|
| + // flips cross start and cross end, stretch children should be aligned
|
| + // with the cross end. This matters because applyStretchAlignment
|
| + // doesn't always stretch or stretch fully (explicit cross size given, or
|
| + // stretching constrained by max-height/max-width). For flex-start and
|
| + // flex-end this is handled by alignmentForChild().
|
| if (isWrapReverse)
|
| return availableFreeSpace;
|
| break;
|
| @@ -1600,7 +1634,8 @@ static LayoutUnit alignmentOffset(LayoutUnit availableFreeSpace,
|
| case ItemPositionCenter:
|
| return availableFreeSpace / 2;
|
| case ItemPositionBaseline:
|
| - // 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.
|
| + // 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.
|
| // https://bugs.webkit.org/show_bug.cgi?id=98076
|
| return maxAscent - ascent;
|
| case ItemPositionLastBaseline:
|
| @@ -1768,9 +1803,10 @@ void LayoutFlexibleBox::resetAutoMarginsAndLogicalTopInCrossAxis(
|
|
|
| bool LayoutFlexibleBox::needToStretchChildLogicalHeight(
|
| const LayoutBox& child) const {
|
| - // This function is a little bit magical. It relies on the fact that blocks intrinsically
|
| - // "stretch" themselves in their inline axis, i.e. a <div> has an implicit width: 100%.
|
| - // So the child will automatically stretch if our cross axis is the child's inline axis. That's the case if:
|
| + // This function is a little bit magical. It relies on the fact that blocks
|
| + // intrinsically "stretch" themselves in their inline axis, i.e. a <div> has
|
| + // an implicit width: 100%. So the child will automatically stretch if our
|
| + // cross axis is the child's inline axis. That's the case if:
|
| // - We are horizontal and the child is in vertical writing mode
|
| // - We are vertical and the child is in horizontal writing mode
|
| // Otherwise, we need to stretch if the cross axis size is auto.
|
| @@ -1867,17 +1903,20 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(
|
| mainAxisContentExtentForChildIncludingScrollbar(*child)) {
|
| child->setChildNeedsLayout(MarkOnlyThis);
|
| } else {
|
| - // To avoid double applying margin changes in updateAutoMarginsInCrossAxis, we reset the margins here.
|
| + // To avoid double applying margin changes in
|
| + // updateAutoMarginsInCrossAxis, we reset the margins here.
|
| resetAutoMarginsAndLogicalTopInCrossAxis(*child);
|
| }
|
| - // We may have already forced relayout for orthogonal flowing children in computeInnerFlexBaseSizeForChild.
|
| + // We may have already forced relayout for orthogonal flowing children in
|
| + // computeInnerFlexBaseSizeForChild.
|
| bool forceChildRelayout =
|
| relayoutChildren && !m_relaidOutChildren.contains(child);
|
| if (child->isLayoutBlock() &&
|
| toLayoutBlock(*child).hasPercentHeightDescendants()) {
|
| - // Have to force another relayout even though the child is sized correctly, because
|
| - // its descendants are not sized correctly yet. Our previous layout of the child was
|
| - // done without an override height set. So, redo it here.
|
| + // Have to force another relayout even though the child is sized
|
| + // correctly, because its descendants are not sized correctly yet. Our
|
| + // previous layout of the child was done without an override height set.
|
| + // So, redo it here.
|
| forceChildRelayout = true;
|
| }
|
| updateBlockChildDirtyBitsBeforeLayout(forceChildRelayout, *child);
|
| @@ -1918,8 +1957,8 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(
|
| mainAxisOffset += flowAwareMarginStartForChild(*child);
|
|
|
| LayoutUnit childMainExtent = mainAxisExtentForChild(*child);
|
| - // In an RTL column situation, this will apply the margin-right/margin-end on the left.
|
| - // This will be fixed later in flipForRightToLeftColumn.
|
| + // In an RTL column situation, this will apply the margin-right/margin-end
|
| + // on the left. This will be fixed later in flipForRightToLeftColumn.
|
| LayoutPoint childLocation(
|
| shouldFlipMainAxis ? totalMainExtent - mainAxisOffset - childMainExtent
|
| : mainAxisOffset,
|
| @@ -1939,8 +1978,9 @@ void LayoutFlexibleBox::layoutAndPlaceChildren(
|
| flowAwarePaddingEnd() + scrollbarLogicalHeight()));
|
|
|
| if (style()->flexDirection() == FlowColumnReverse) {
|
| - // We have to do an extra pass for column-reverse to reposition the flex items since the start depends
|
| - // on the height of the flexbox, which we only know after we've positioned all the flex items.
|
| + // We have to do an extra pass for column-reverse to reposition the flex
|
| + // items since the start depends on the height of the flexbox, which we
|
| + // only know after we've positioned all the flex items.
|
| updateLogicalHeight();
|
| layoutColumnReverse(children, crossAxisOffset, availableFreeSpace);
|
| }
|
| @@ -1961,9 +2001,9 @@ void LayoutFlexibleBox::layoutColumnReverse(const OrderedFlexItemList& children,
|
| styleRef().resolvedJustifyContentDistribution(
|
| contentAlignmentNormalBehavior());
|
|
|
| - // This is similar to the logic in layoutAndPlaceChildren, except we place the children
|
| - // starting from the end of the flexbox. We also don't need to layout anything since we're
|
| - // just moving the children to a new position.
|
| + // This is similar to the logic in layoutAndPlaceChildren, except we place
|
| + // the children starting from the end of the flexbox. We also don't need to
|
| + // layout anything since we're just moving the children to a new position.
|
| size_t numberOfChildrenForJustifyContent =
|
| numberOfInFlowPositionedChildren(children);
|
| LayoutUnit mainAxisOffset =
|
| @@ -2039,9 +2079,10 @@ void LayoutFlexibleBox::alignFlexLines(Vector<LineContext>& lineContexts) {
|
| styleRef().resolvedAlignContentDistribution(
|
| contentAlignmentNormalBehavior());
|
|
|
| - // If we have a single line flexbox or a multiline line flexbox with only one flex line,
|
| - // the line height is all the available space.
|
| - // For flex-direction: row, this means we need to use the height, so we do this after calling updateLogicalHeight.
|
| + // If we have a single line flexbox or a multiline line flexbox with only one
|
| + // flex line, the line height is all the available space. For
|
| + // flex-direction: row, this means we need to use the height, so we do this
|
| + // after calling updateLogicalHeight.
|
| if (lineContexts.size() == 1) {
|
| lineContexts[0].crossAxisExtent = crossAxisContentExtent();
|
| return;
|
| @@ -2086,7 +2127,8 @@ void LayoutFlexibleBox::adjustAlignmentForChild(LayoutBox& child,
|
|
|
| void LayoutFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts,
|
| LayoutObject* childToExclude) {
|
| - // Keep track of the space between the baseline edge and the after edge of the box for each line.
|
| + // Keep track of the space between the baseline edge and the after edge of
|
| + // the box for each line.
|
| Vector<LayoutUnit> minMarginAfterBaselines;
|
|
|
| LayoutBox* child = m_orderIterator.first();
|
| @@ -2134,8 +2176,9 @@ void LayoutFlexibleBox::alignChildren(const Vector<LineContext>& lineContexts,
|
| if (style()->flexWrap() != FlexWrapReverse)
|
| return;
|
|
|
| - // wrap-reverse flips the cross axis start and end. For baseline alignment, this means we
|
| - // need to align the after edge of baseline elements with the after edge of the flex line.
|
| + // wrap-reverse flips the cross axis start and end. For baseline alignment,
|
| + // this means we need to align the after edge of baseline elements with the
|
| + // after edge of the flex line.
|
| child = m_orderIterator.first();
|
| for (size_t lineNumber = 0; lineNumber < lineContexts.size(); ++lineNumber) {
|
| LayoutUnit minMarginAfterBaseline = minMarginAfterBaselines[lineNumber];
|
| @@ -2165,14 +2208,16 @@ void LayoutFlexibleBox::applyStretchAlignmentToChild(
|
| stretchedLogicalHeight,
|
| heightBeforeStretching - child.borderAndPaddingLogicalHeight());
|
|
|
| - // FIXME: Can avoid laying out here in some cases. See https://webkit.org/b/87905.
|
| + // FIXME: Can avoid laying out here in some cases. See
|
| + // https://webkit.org/b/87905.
|
| bool childNeedsRelayout = desiredLogicalHeight != child.logicalHeight();
|
| if (child.isLayoutBlock() &&
|
| toLayoutBlock(child).hasPercentHeightDescendants() &&
|
| m_relaidOutChildren.contains(&child)) {
|
| - // Have to force another relayout even though the child is sized correctly, because
|
| - // its descendants are not sized correctly yet. Our previous layout of the child was
|
| - // done without an override height set. So, redo it here.
|
| + // Have to force another relayout even though the child is sized
|
| + // correctly, because its descendants are not sized correctly yet. Our
|
| + // previous layout of the child was done without an override height set.
|
| + // So, redo it here.
|
| childNeedsRelayout = true;
|
| }
|
| if (childNeedsRelayout || !child.hasOverrideLogicalContentHeight())
|
| @@ -2180,9 +2225,11 @@ void LayoutFlexibleBox::applyStretchAlignmentToChild(
|
| desiredLogicalHeight - child.borderAndPaddingLogicalHeight());
|
| if (childNeedsRelayout) {
|
| child.setLogicalHeight(LayoutUnit());
|
| - // We cache the child's intrinsic content logical height to avoid it being reset to the stretched height.
|
| - // FIXME: This is fragile. LayoutBoxes should be smart enough to determine their intrinsic content logical
|
| - // height correctly even when there's an overrideHeight.
|
| + // We cache the child's intrinsic content logical height to avoid it being
|
| + // reset to the stretched height.
|
| + // FIXME: This is fragile. LayoutBoxes should be smart enough to
|
| + // determine their intrinsic content logical height correctly even when
|
| + // there's an overrideHeight.
|
| LayoutUnit childIntrinsicContentLogicalHeight =
|
| child.intrinsicContentLogicalHeight();
|
| child.forceChildLayout();
|
|
|