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

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

Issue 2037783002: Percent height content should respect the fixed height of its containing cell (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@24826-2
Patch Set: Updated Created 4 years, 6 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
« no previous file with comments | « third_party/WebKit/LayoutTests/platform/linux/fast/html/details-writing-mode-expected.txt ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 2735 matching lines...) Expand 10 before | Expand all | Expand 10 after
2746 LayoutUnit stretchedFlexHeight(-1); 2746 LayoutUnit stretchedFlexHeight(-1);
2747 if (cb->isFlexItem()) 2747 if (cb->isFlexItem())
2748 stretchedFlexHeight = toLayoutFlexibleBox(cb->parent())->childLogicalHei ghtForPercentageResolution(*cb); 2748 stretchedFlexHeight = toLayoutFlexibleBox(cb->parent())->childLogicalHei ghtForPercentageResolution(*cb);
2749 2749
2750 if (isHorizontalWritingMode() != cb->isHorizontalWritingMode()) { 2750 if (isHorizontalWritingMode() != cb->isHorizontalWritingMode()) {
2751 availableHeight = containingBlockChild->containingBlockLogicalWidthForCo ntent(); 2751 availableHeight = containingBlockChild->containingBlockLogicalWidthForCo ntent();
2752 } else if (stretchedFlexHeight != LayoutUnit(-1)) { 2752 } else if (stretchedFlexHeight != LayoutUnit(-1)) {
2753 availableHeight = stretchedFlexHeight; 2753 availableHeight = stretchedFlexHeight;
2754 } else if (hasOverrideContainingBlockLogicalHeight()) { 2754 } else if (hasOverrideContainingBlockLogicalHeight()) {
2755 availableHeight = overrideContainingBlockContentLogicalHeight(); 2755 availableHeight = overrideContainingBlockContentLogicalHeight();
2756 } else if (cbstyle.logicalHeight().isFixed()) {
2757 LayoutUnit contentBoxHeight = cb->adjustContentBoxLogicalHeightForBoxSiz ing(cbstyle.logicalHeight().value());
2758 availableHeight = cb->constrainContentBoxLogicalHeightByMinMax(
2759 contentBoxHeight - cb->scrollbarLogicalHeight(), LayoutUnit(-1)).cla mpNegativeToZero();
2760 if (cb->isTableCell()) {
2761 includeBorderPadding = true;
2762 // We're sizing content to the height from the cell's style so don't involve the intrinsic padding used to align the content.
2763 availableHeight -= cb->computedCSSPaddingBefore() + cb->computedCSSP addingAfter() + cb->borderBefore() + cb->borderAfter();
2764 }
2756 } else if (cb->isTableCell()) { 2765 } else if (cb->isTableCell()) {
2757 if (!skippedAutoHeightContainingBlock) { 2766 if (!skippedAutoHeightContainingBlock) {
2758 // Table cells violate what the CSS spec says to do with heights. Ba sically we 2767 // Table cells violate what the CSS spec says to do with heights. Ba sically we
2759 // don't care if the cell specified a height or not. We just always make ourselves 2768 // don't care if the cell specified a height or not. We just always make ourselves
2760 // be a percentage of the cell's current content height. 2769 // be a percentage of the cell's current content height.
2761 if (!cb->hasOverrideLogicalContentHeight()) { 2770 if (!cb->hasOverrideLogicalContentHeight()) {
2762 // Normally we would let the cell size intrinsically, but scroll ing overflow has to be 2771 // Normally we would let the cell size intrinsically, but scroll ing overflow has to be
2763 // treated differently, since WinIE lets scrolled overflow regio ns shrink as needed. 2772 // treated differently, since WinIE lets scrolled overflow regio ns shrink as needed.
2764 // While we can't get all cases right, we can at least detect wh en the cell has a specified 2773 // While we can't get all cases right, we can at least detect wh en the cell has a specified
2765 // height or when the table has a specified height. In these cas es we want to initially have 2774 // height or when the table has a specified height. In these cas es we want to initially have
2766 // no size and allow the flexing of the table or the cell to its specified height to cause us 2775 // no size and allow the flexing of the table or the cell to its specified height to cause us
2767 // to grow to fill the space. This could end up being wrong in s ome cases, but it is 2776 // to grow to fill the space. This could end up being wrong in s ome cases, but it is
2768 // preferable to the alternative (sizing intrinsically and makin g the row end up too big). 2777 // preferable to the alternative (sizing intrinsically and makin g the row end up too big).
2769 LayoutTableCell* cell = toLayoutTableCell(cb); 2778 LayoutTableCell* cell = toLayoutTableCell(cb);
2770 if (scrollsOverflowY() && (!cell->style()->logicalHeight().isAut o() || !cell->table()->style()->logicalHeight().isAuto())) 2779 if (scrollsOverflowY() && (!cell->style()->logicalHeight().isAut o() || !cell->table()->style()->logicalHeight().isAuto()))
2771 return LayoutUnit(); 2780 return LayoutUnit();
2772 return LayoutUnit(-1); 2781 return LayoutUnit(-1);
2773 } 2782 }
2774 availableHeight = cb->overrideLogicalContentHeight(); 2783 availableHeight = cb->overrideLogicalContentHeight();
2775 includeBorderPadding = true; 2784 includeBorderPadding = true;
2776 } 2785 }
2777 } else if (cbstyle.logicalHeight().isFixed()) {
2778 LayoutUnit contentBoxHeight = cb->adjustContentBoxLogicalHeightForBoxSiz ing(LayoutUnit(cbstyle.logicalHeight().value()));
2779 availableHeight = std::max(LayoutUnit(), cb->constrainContentBoxLogicalH eightByMinMax(contentBoxHeight - cb->scrollbarLogicalHeight(), LayoutUnit(-1)));
2780 } else if (cbstyle.logicalHeight().hasPercent() && !isOutOfFlowPositionedWit hSpecifiedHeight) { 2786 } else if (cbstyle.logicalHeight().hasPercent() && !isOutOfFlowPositionedWit hSpecifiedHeight) {
2781 // We need to recur and compute the percentage height for our containing block. 2787 // We need to recur and compute the percentage height for our containing block.
2782 LayoutUnit heightWithScrollbar = cb->computePercentageLogicalHeight(cbst yle.logicalHeight()); 2788 LayoutUnit heightWithScrollbar = cb->computePercentageLogicalHeight(cbst yle.logicalHeight());
2783 if (heightWithScrollbar != -1) { 2789 if (heightWithScrollbar != -1) {
2784 LayoutUnit contentBoxHeightWithScrollbar = cb->adjustContentBoxLogic alHeightForBoxSizing(heightWithScrollbar); 2790 LayoutUnit contentBoxHeightWithScrollbar = cb->adjustContentBoxLogic alHeightForBoxSizing(heightWithScrollbar);
2785 // We need to adjust for min/max height because this method does not 2791 // We need to adjust for min/max height because this method does not
2786 // handle the min/max of the current block, its caller does. So the 2792 // handle the min/max of the current block, its caller does. So the
2787 // return value from the recursive call will not have been adjusted 2793 // return value from the recursive call will not have been adjusted
2788 // yet. 2794 // yet.
2789 LayoutUnit contentBoxHeight = cb->constrainContentBoxLogicalHeightBy MinMax(contentBoxHeightWithScrollbar - cb->scrollbarLogicalHeight(), LayoutUnit( -1)); 2795 LayoutUnit contentBoxHeight = cb->constrainContentBoxLogicalHeightBy MinMax(contentBoxHeightWithScrollbar - cb->scrollbarLogicalHeight(), LayoutUnit( -1));
(...skipping 12 matching lines...) Expand all
2802 if (availableHeight == -1) 2808 if (availableHeight == -1)
2803 return availableHeight; 2809 return availableHeight;
2804 2810
2805 availableHeight -= rootMarginBorderPaddingHeight; 2811 availableHeight -= rootMarginBorderPaddingHeight;
2806 2812
2807 if (isTable() && isOutOfFlowPositioned()) 2813 if (isTable() && isOutOfFlowPositioned())
2808 availableHeight += cb->paddingLogicalHeight(); 2814 availableHeight += cb->paddingLogicalHeight();
2809 2815
2810 LayoutUnit result = valueForLength(height, availableHeight); 2816 LayoutUnit result = valueForLength(height, availableHeight);
2811 if (includeBorderPadding) { 2817 if (includeBorderPadding) {
2812 // FIXME: Table cells should default to box-sizing: border-box so we can avoid this hack. 2818 // TODO(rhogan) crbug.com/467378: Doing this for content inside tables c ells is wrong, it should fill
2813 // It is necessary to use the border-box to match WinIE's broken 2819 // whatever height the cell makes available.
2814 // box model. This is essential for sizing inside
2815 // table cells using percentage heights.
2816 result -= borderAndPaddingLogicalHeight(); 2820 result -= borderAndPaddingLogicalHeight();
2817 return std::max(LayoutUnit(), result); 2821 return std::max(LayoutUnit(), result);
2818 } 2822 }
2819 return result; 2823 return result;
2820 } 2824 }
2821 2825
2822 LayoutUnit LayoutBox::computeReplacedLogicalWidth(ShouldComputePreferred shouldC omputePreferred) const 2826 LayoutUnit LayoutBox::computeReplacedLogicalWidth(ShouldComputePreferred shouldC omputePreferred) const
2823 { 2827 {
2824 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedLogic alWidthUsing(MainOrPreferredSize, style()->logicalWidth()), shouldComputePreferr ed); 2828 return computeReplacedLogicalWidthRespectingMinMaxWidth(computeReplacedLogic alWidthUsing(MainOrPreferredSize, style()->logicalWidth()), shouldComputePreferr ed);
2825 } 2829 }
(...skipping 2111 matching lines...) Expand 10 before | Expand all | Expand 10 after
4937 m_rareData->m_snapAreas->remove(&snapArea); 4941 m_rareData->m_snapAreas->remove(&snapArea);
4938 } 4942 }
4939 } 4943 }
4940 4944
4941 SnapAreaSet* LayoutBox::snapAreas() const 4945 SnapAreaSet* LayoutBox::snapAreas() const
4942 { 4946 {
4943 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr; 4947 return m_rareData ? m_rareData->m_snapAreas.get() : nullptr;
4944 } 4948 }
4945 4949
4946 } // namespace blink 4950 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/LayoutTests/platform/linux/fast/html/details-writing-mode-expected.txt ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698