Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(310)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 1742973002: [css-flexbox] Correctly resolve percentages in children of stretched flex items (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tests fixed Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com) 4 * (C) 2005 Allan Sandfeld Jensen (kde@carewolf.com)
5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com) 5 * (C) 2005, 2006 Samuel Weinig (sam.weinig@gmail.com)
6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserv ed.
7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 7 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
8 * 8 *
9 * This library is free software; you can redistribute it and/or 9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Library General Public 10 * modify it under the terms of the GNU Library General Public
(...skipping 2081 matching lines...) Expand 10 before | Expand all | Expand 10 after
2092 2092
2093 // Width calculations 2093 // Width calculations
2094 if (treatAsReplaced) { 2094 if (treatAsReplaced) {
2095 computedValues.m_extent = LayoutUnit(logicalWidthLength.value()) + borde rAndPaddingLogicalWidth(); 2095 computedValues.m_extent = LayoutUnit(logicalWidthLength.value()) + borde rAndPaddingLogicalWidth();
2096 } else if (parent()->isLayoutGrid() && style()->logicalWidth().isAuto() && s tyle()->logicalMinWidth().isAuto() && style()->overflowX() == OVISIBLE && contai nerLogicalWidth < minPreferredLogicalWidth()) { 2096 } else if (parent()->isLayoutGrid() && style()->logicalWidth().isAuto() && s tyle()->logicalMinWidth().isAuto() && style()->overflowX() == OVISIBLE && contai nerLogicalWidth < minPreferredLogicalWidth()) {
2097 // TODO (lajava) Move this logic to the LayoutGrid class. 2097 // TODO (lajava) Move this logic to the LayoutGrid class.
2098 // Implied minimum size of Grid items. 2098 // Implied minimum size of Grid items.
2099 computedValues.m_extent = constrainLogicalWidthByMinMax(minPreferredLogi calWidth(), containerLogicalWidth, cb); 2099 computedValues.m_extent = constrainLogicalWidthByMinMax(minPreferredLogi calWidth(), containerLogicalWidth, cb);
2100 } else { 2100 } else {
2101 LayoutUnit containerWidthInInlineDirection = containerLogicalWidth; 2101 LayoutUnit containerWidthInInlineDirection = containerLogicalWidth;
2102 if (hasPerpendicularContainingBlock) 2102 if (hasPerpendicularContainingBlock) {
2103 containerWidthInInlineDirection = perpendicularContainingBlockLogica lHeight(); 2103 containerWidthInInlineDirection = perpendicularContainingBlockLogica lHeight();
2104 } else if (styleToUse.logicalWidth().hasPercent() && !isOutOfFlowPositio ned() && cb->isFlexItem()) {
leviw_travelin_and_unemployed 2016/03/01 01:58:51 Nit, I may have put the isFlexItem() part first.
cbiesinger 2016/03/01 20:36:10 Done.
2105 LayoutUnit stretchedWidth = toLayoutFlexibleBox(cb->parent())->child LogicalHeightForPercentageResolution(*cb);
leviw_travelin_and_unemployed 2016/03/01 01:58:51 Link to spec about why width = height?
cbiesinger 2016/03/01 20:36:10 That was a typo :( I added a test that hits this
2106 if (stretchedWidth != LayoutUnit(-1))
2107 containerWidthInInlineDirection = stretchedWidth;
2108 }
2104 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize , styleToUse.logicalWidth(), containerWidthInInlineDirection, cb); 2109 LayoutUnit preferredWidth = computeLogicalWidthUsing(MainOrPreferredSize , styleToUse.logicalWidth(), containerWidthInInlineDirection, cb);
2105 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth, containerWidthInInlineDirection, cb); 2110 computedValues.m_extent = constrainLogicalWidthByMinMax(preferredWidth, containerWidthInInlineDirection, cb);
2106 } 2111 }
2107 2112
2108 // Margin calculations. 2113 // Margin calculations.
2109 computeMarginsForDirection(InlineDirection, cb, containerLogicalWidth, compu tedValues.m_extent, computedValues.m_margins.m_start, 2114 computeMarginsForDirection(InlineDirection, cb, containerLogicalWidth, compu tedValues.m_extent, computedValues.m_margins.m_start,
2110 computedValues.m_margins.m_end, style()->marginStart(), style()->marginE nd()); 2115 computedValues.m_margins.m_end, style()->marginStart(), style()->marginE nd());
2111 2116
2112 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp utedValues.m_margins.m_end) 2117 if (!hasPerpendicularContainingBlock && containerLogicalWidth && containerLo gicalWidth != (computedValues.m_extent + computedValues.m_margins.m_start + comp utedValues.m_margins.m_end)
2113 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated () && !cb->isLayoutGrid()) { 2118 && !isFloating() && !isInline() && !cb->isFlexibleBoxIncludingDeprecated () && !cb->isLayoutGrid()) {
(...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after
2593 cb->addPercentHeightDescendant(const_cast<LayoutBox*>(this)); 2598 cb->addPercentHeightDescendant(const_cast<LayoutBox*>(this));
2594 2599
2595 const ComputedStyle& cbstyle = cb->styleRef(); 2600 const ComputedStyle& cbstyle = cb->styleRef();
2596 2601
2597 // A positioned element that specified both top/bottom or that specifies hei ght should be treated as though it has a height 2602 // A positioned element that specified both top/bottom or that specifies hei ght should be treated as though it has a height
2598 // explicitly specified that can be used for any percentage computations. 2603 // explicitly specified that can be used for any percentage computations.
2599 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned() && (!cbstyle.logicalHeight().isAuto() || (!cbstyle.logicalTop().isAuto() && !cbs tyle.logicalBottom().isAuto())); 2604 bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned() && (!cbstyle.logicalHeight().isAuto() || (!cbstyle.logicalTop().isAuto() && !cbs tyle.logicalBottom().isAuto()));
2600 2605
2601 bool includeBorderPadding = isTable(); 2606 bool includeBorderPadding = isTable();
2602 2607
2608 LayoutUnit stretchedFlexHeight(-1);
2609 if (cb->isFlexItem())
2610 stretchedFlexHeight = toLayoutFlexibleBox(cb->parent())->childLogicalHei ghtForPercentageResolution(*cb);
2611
2603 if (isHorizontalWritingMode() != cb->isHorizontalWritingMode()) { 2612 if (isHorizontalWritingMode() != cb->isHorizontalWritingMode()) {
2604 availableHeight = containingBlockChild->containingBlockLogicalWidthForCo ntent(); 2613 availableHeight = containingBlockChild->containingBlockLogicalWidthForCo ntent();
2614 } else if (stretchedFlexHeight != LayoutUnit(-1)) {
2615 availableHeight = stretchedFlexHeight;
2605 } else if (hasOverrideContainingBlockLogicalHeight()) { 2616 } else if (hasOverrideContainingBlockLogicalHeight()) {
2606 availableHeight = overrideContainingBlockContentLogicalHeight(); 2617 availableHeight = overrideContainingBlockContentLogicalHeight();
2607 } else if (cb->isTableCell()) { 2618 } else if (cb->isTableCell()) {
2608 if (!skippedAutoHeightContainingBlock) { 2619 if (!skippedAutoHeightContainingBlock) {
2609 // The second clause in this conditional (after the ||) is to suppor t this line from the 2620 // The second clause in this conditional (after the ||) is to suppor t this line from the
2610 // definition of height in CSS 2.2: 2621 // definition of height in CSS 2.2:
2611 // "If the height of the containing block is not specified explicitl y (i.e., it depends on 2622 // "If the height of the containing block is not specified explicitl y (i.e., it depends on
2612 // content height), and this element is not absolutely positioned, t he used height is 2623 // content height), and this element is not absolutely positioned, t he used height is
2613 // calculated as if 'auto' was specified." 2624 // calculated as if 'auto' was specified."
2614 // But FF doesn't apply this logic (1) in quirks mode or (2) when "t his element" is a table. 2625 // But FF doesn't apply this logic (1) in quirks mode or (2) when "t his element" is a table.
(...skipping 2067 matching lines...) Expand 10 before | Expand all | Expand 10 after
4682 } 4693 }
4683 4694
4684 void LayoutBox::IntrinsicSizingInfo::transpose() 4695 void LayoutBox::IntrinsicSizingInfo::transpose()
4685 { 4696 {
4686 size = size.transposedSize(); 4697 size = size.transposedSize();
4687 aspectRatio = aspectRatio.transposedSize(); 4698 aspectRatio = aspectRatio.transposedSize();
4688 std::swap(hasWidth, hasHeight); 4699 std::swap(hasWidth, hasHeight);
4689 } 4700 }
4690 4701
4691 } // namespace blink 4702 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698