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

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

Issue 2535173006: Percent height border-box content should get correct height in percent height cells (Closed)
Patch Set: bug 669867 Created 4 years 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. 6 * Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc.
7 * All rights reserved. 7 * All rights reserved.
8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved. 8 * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 3167 matching lines...) Expand 10 before | Expand all | Expand 10 after
3178 containingBlockChild->containingBlockLogicalWidthForContent(); 3178 containingBlockChild->containingBlockLogicalWidthForContent();
3179 } else if (hasOverrideContainingBlockLogicalHeight()) { 3179 } else if (hasOverrideContainingBlockLogicalHeight()) {
3180 availableHeight = overrideContainingBlockContentLogicalHeight(); 3180 availableHeight = overrideContainingBlockContentLogicalHeight();
3181 } else if (cb->isTableCell()) { 3181 } else if (cb->isTableCell()) {
3182 if (!skippedAutoHeightContainingBlock) { 3182 if (!skippedAutoHeightContainingBlock) {
3183 // Table cells violate what the CSS spec says to do with heights. 3183 // Table cells violate what the CSS spec says to do with heights.
3184 // Basically we don't care if the cell specified a height or not. We just 3184 // Basically we don't care if the cell specified a height or not. We just
3185 // always make ourselves be a percentage of the cell's current content 3185 // always make ourselves be a percentage of the cell's current content
3186 // height. 3186 // height.
3187 if (!cb->hasOverrideLogicalContentHeight()) { 3187 if (!cb->hasOverrideLogicalContentHeight()) {
3188 // Normally we would let the cell size intrinsically, but scrolling 3188 // https://drafts.csswg.org/css-tables-3/#row-layout:
3189 // overflow has to be treated differently, since WinIE lets scrolled 3189 // For the purpose of calculating [the minimum height of a row],
3190 // overflow regions shrink as needed. 3190 // descendants of table cells whose height depends on percentages
3191 // While we can't get all cases right, we can at least detect when the 3191 // of their parent cell's height are considered to have an auto
3192 // cell has a specified height or when the table has a specified height. 3192 // height if they have overflow set to visible or hidden or if
3193 // In these cases we want to initially have no size and allow the 3193 // they are replaced elements, and a 0px height if they have not.
3194 // flexing of the table or the cell to its specified height to cause us
3195 // to grow to fill the space. This could end up being wrong in some
3196 // cases, but it is preferable to the alternative (sizing intrinsically
3197 // and making the row end up too big).
3198 LayoutTableCell* cell = toLayoutTableCell(cb); 3194 LayoutTableCell* cell = toLayoutTableCell(cb);
3199 if (style()->overflowY() != EOverflow::Visible && 3195 if (style()->overflowY() != EOverflow::Visible &&
3200 style()->overflowY() != EOverflow::Hidden && 3196 style()->overflowY() != EOverflow::Hidden &&
3197 !shouldBeConsideredAsReplaced() &&
3201 (!cell->style()->logicalHeight().isAuto() || 3198 (!cell->style()->logicalHeight().isAuto() ||
3202 !cell->table()->style()->logicalHeight().isAuto())) 3199 !cell->table()->style()->logicalHeight().isAuto()))
3203 return LayoutUnit(); 3200 return LayoutUnit();
3204 return LayoutUnit(-1); 3201 return LayoutUnit(-1);
3205 } 3202 }
3206 availableHeight = cb->overrideLogicalContentHeight(); 3203 availableHeight = cb->overrideLogicalContentHeight();
3207 } 3204 }
3208 } else { 3205 } else {
3209 availableHeight = cb->availableLogicalHeightForPercentageComputation(); 3206 availableHeight = cb->availableLogicalHeightForPercentageComputation();
3210 } 3207 }
3211 3208
3212 if (availableHeight == -1) 3209 if (availableHeight == -1)
3213 return availableHeight; 3210 return availableHeight;
3214 3211
3215 availableHeight -= rootMarginBorderPaddingHeight; 3212 availableHeight -= rootMarginBorderPaddingHeight;
3216 3213
3217 if (isTable() && isOutOfFlowPositioned()) 3214 if (isTable() && isOutOfFlowPositioned())
3218 availableHeight += cb->paddingLogicalHeight(); 3215 availableHeight += cb->paddingLogicalHeight();
3219 3216
3220 LayoutUnit result = valueForLength(height, availableHeight); 3217 LayoutUnit result = valueForLength(height, availableHeight);
3221 bool includeBorderPadding = 3218 // |overrideLogicalContentHeight| is the maximum height made available by the
3219 // cell to its percent height children when we decide they can determine the
3220 // height of the cell. If the percent height child is box-sizing:content-box
3221 // then we must subtract the border and padding from the cell's
3222 // |availableHeight| (given by |overrideLogicalContentHeight|) to arrive
3223 // at the child's computed height.
3224 bool subtractBorderAndPadding =
3222 isTable() || (cb->isTableCell() && !skippedAutoHeightContainingBlock && 3225 isTable() || (cb->isTableCell() && !skippedAutoHeightContainingBlock &&
3223 cb->hasOverrideLogicalContentHeight()); 3226 cb->hasOverrideLogicalContentHeight() &&
3224 3227 style()->boxSizing() == BoxSizingContentBox);
3225 if (includeBorderPadding) { 3228 if (subtractBorderAndPadding) {
3226 // FIXME: Table cells should default to box-sizing: border-box so we can
3227 // avoid this hack.
3228 // It is necessary to use the border-box to match WinIE's broken
3229 // box model. This is essential for sizing inside
3230 // table cells using percentage heights.
3231 result -= borderAndPaddingLogicalHeight(); 3229 result -= borderAndPaddingLogicalHeight();
3232 return std::max(LayoutUnit(), result); 3230 return std::max(LayoutUnit(), result);
3233 } 3231 }
3234 return result; 3232 return result;
3235 } 3233 }
3236 3234
3237 LayoutUnit LayoutBox::computeReplacedLogicalWidth( 3235 LayoutUnit LayoutBox::computeReplacedLogicalWidth(
3238 ShouldComputePreferred shouldComputePreferred) const { 3236 ShouldComputePreferred shouldComputePreferred) const {
3239 return computeReplacedLogicalWidthRespectingMinMaxWidth( 3237 return computeReplacedLogicalWidthRespectingMinMaxWidth(
3240 computeReplacedLogicalWidthUsing(MainOrPreferredSize, 3238 computeReplacedLogicalWidthUsing(MainOrPreferredSize,
(...skipping 1424 matching lines...) Expand 10 before | Expand all | Expand 10 after
4665 // Floating objects don't shrink. Objects that don't avoid floats don't 4663 // Floating objects don't shrink. Objects that don't avoid floats don't
4666 // shrink. 4664 // shrink.
4667 if (isInline() || !avoidsFloats() || isFloating()) 4665 if (isInline() || !avoidsFloats() || isFloating())
4668 return false; 4666 return false;
4669 4667
4670 // Only auto width objects can possibly shrink to avoid floats. 4668 // Only auto width objects can possibly shrink to avoid floats.
4671 return style()->width().isAuto(); 4669 return style()->width().isAuto();
4672 } 4670 }
4673 4671
4674 DISABLE_CFI_PERF 4672 DISABLE_CFI_PERF
4675 static bool shouldBeConsideredAsReplaced(Node* node) { 4673 bool LayoutBox::shouldBeConsideredAsReplaced() const {
4676 // Checkboxes and radioboxes are not isAtomicInlineLevel() nor do they have 4674 // Checkboxes and radioboxes are not isAtomicInlineLevel() nor do they have
4677 // their own layoutObject in which to override avoidFloats(). 4675 // their own layoutObject in which to override avoidFloats().
4676 if (isAtomicInlineLevel())
4677 return true;
4678 Node* node = this->node();
4678 return node && node->isElementNode() && 4679 return node && node->isElementNode() &&
4679 (toElement(node)->isFormControlElement() || 4680 (toElement(node)->isFormControlElement() ||
4680 isHTMLImageElement(toElement(node))); 4681 isHTMLImageElement(toElement(node)));
4681 } 4682 }
4682 4683
4683 DISABLE_CFI_PERF 4684 DISABLE_CFI_PERF
4684 bool LayoutBox::avoidsFloats() const { 4685 bool LayoutBox::avoidsFloats() const {
4685 return isAtomicInlineLevel() || shouldBeConsideredAsReplaced(node()) || 4686 return shouldBeConsideredAsReplaced() || hasOverflowClip() || isHR() ||
4686 hasOverflowClip() || isHR() || isLegend() || isWritingModeRoot() || 4687 isLegend() || isWritingModeRoot() || isFlexItemIncludingDeprecated() ||
4687 isFlexItemIncludingDeprecated() || style()->containsPaint() || 4688 style()->containsPaint() || style()->containsLayout();
4688 style()->containsLayout();
4689 } 4689 }
4690 4690
4691 bool LayoutBox::hasNonCompositedScrollbars() const { 4691 bool LayoutBox::hasNonCompositedScrollbars() const {
4692 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea()) { 4692 if (PaintLayerScrollableArea* scrollableArea = this->getScrollableArea()) {
4693 if (scrollableArea->hasHorizontalScrollbar() && 4693 if (scrollableArea->hasHorizontalScrollbar() &&
4694 !scrollableArea->layerForHorizontalScrollbar()) 4694 !scrollableArea->layerForHorizontalScrollbar())
4695 return true; 4695 return true;
4696 if (scrollableArea->hasVerticalScrollbar() && 4696 if (scrollableArea->hasVerticalScrollbar() &&
4697 !scrollableArea->layerForVerticalScrollbar()) 4697 !scrollableArea->layerForVerticalScrollbar())
4698 return true; 4698 return true;
(...skipping 961 matching lines...) Expand 10 before | Expand all | Expand 10 after
5660 block->adjustChildDebugRect(rect); 5660 block->adjustChildDebugRect(rect);
5661 5661
5662 return rect; 5662 return rect;
5663 } 5663 }
5664 5664
5665 bool LayoutBox::shouldClipOverflow() const { 5665 bool LayoutBox::shouldClipOverflow() const {
5666 return hasOverflowClip() || styleRef().containsPaint() || hasControlClip(); 5666 return hasOverflowClip() || styleRef().containsPaint() || hasControlClip();
5667 } 5667 }
5668 5668
5669 } // namespace blink 5669 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBox.h ('k') | third_party/WebKit/Source/core/layout/LayoutTableSection.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698