Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 Loading... | |
| 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); |
| 3195 bool treatAsReplaced = node() && node()->isElementNode() && | |
|
eae
2016/12/12 19:55:19
Could you add a comment (or update the one above)
| |
| 3196 (toElement(node())->isFormControlElement() || | |
| 3197 isHTMLImageElement(toElement(node()))); | |
| 3198 bool isReplaced = isAtomicInlineLevel() || treatAsReplaced; | |
| 3199 if (style()->overflowY() != OverflowVisible && | 3199 if (style()->overflowY() != OverflowVisible && |
| 3200 style()->overflowY() != OverflowHidden && | 3200 style()->overflowY() != OverflowHidden && !isReplaced && |
| 3201 (!cell->style()->logicalHeight().isAuto() || | 3201 (!cell->style()->logicalHeight().isAuto() || |
| 3202 !cell->table()->style()->logicalHeight().isAuto())) | 3202 !cell->table()->style()->logicalHeight().isAuto())) |
| 3203 return LayoutUnit(); | 3203 return LayoutUnit(); |
| 3204 return LayoutUnit(-1); | 3204 return LayoutUnit(-1); |
| 3205 } | 3205 } |
| 3206 availableHeight = cb->overrideLogicalContentHeight(); | 3206 availableHeight = cb->overrideLogicalContentHeight(); |
| 3207 } | 3207 } |
| 3208 } else { | 3208 } else { |
| 3209 availableHeight = cb->availableLogicalHeightForPercentageComputation(); | 3209 availableHeight = cb->availableLogicalHeightForPercentageComputation(); |
| 3210 } | 3210 } |
| 3211 | 3211 |
| 3212 if (availableHeight == -1) | 3212 if (availableHeight == -1) |
| 3213 return availableHeight; | 3213 return availableHeight; |
| 3214 | 3214 |
| 3215 availableHeight -= rootMarginBorderPaddingHeight; | 3215 availableHeight -= rootMarginBorderPaddingHeight; |
| 3216 | 3216 |
| 3217 if (isTable() && isOutOfFlowPositioned()) | 3217 if (isTable() && isOutOfFlowPositioned()) |
| 3218 availableHeight += cb->paddingLogicalHeight(); | 3218 availableHeight += cb->paddingLogicalHeight(); |
| 3219 | 3219 |
| 3220 LayoutUnit result = valueForLength(height, availableHeight); | 3220 LayoutUnit result = valueForLength(height, availableHeight); |
| 3221 bool includeBorderPadding = | 3221 // |overrideLogicalContentHeight| is the maximum height made available by the |
| 3222 // cell to its percent height children when we decide they can determine the | |
| 3223 // height of the cell. If the percent height child is box-sizing:content-box | |
| 3224 // then we must subtract the border and padding from the cell's | |
| 3225 // |availableHeight| (given by |overrideLogicalContentHeight|) to arrive | |
| 3226 // at the child's computed height. | |
| 3227 bool subtractBorderAndPadding = | |
| 3222 isTable() || (cb->isTableCell() && !skippedAutoHeightContainingBlock && | 3228 isTable() || (cb->isTableCell() && !skippedAutoHeightContainingBlock && |
| 3223 cb->hasOverrideLogicalContentHeight()); | 3229 cb->hasOverrideLogicalContentHeight() && |
| 3224 | 3230 style()->boxSizing() == BoxSizingContentBox); |
| 3225 if (includeBorderPadding) { | 3231 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(); | 3232 result -= borderAndPaddingLogicalHeight(); |
| 3232 return std::max(LayoutUnit(), result); | 3233 return std::max(LayoutUnit(), result); |
| 3233 } | 3234 } |
| 3234 return result; | 3235 return result; |
| 3235 } | 3236 } |
| 3236 | 3237 |
| 3237 LayoutUnit LayoutBox::computeReplacedLogicalWidth( | 3238 LayoutUnit LayoutBox::computeReplacedLogicalWidth( |
| 3238 ShouldComputePreferred shouldComputePreferred) const { | 3239 ShouldComputePreferred shouldComputePreferred) const { |
| 3239 return computeReplacedLogicalWidthRespectingMinMaxWidth( | 3240 return computeReplacedLogicalWidthRespectingMinMaxWidth( |
| 3240 computeReplacedLogicalWidthUsing(MainOrPreferredSize, | 3241 computeReplacedLogicalWidthUsing(MainOrPreferredSize, |
| (...skipping 2411 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5652 LayoutRect rect = frameRect(); | 5653 LayoutRect rect = frameRect(); |
| 5653 | 5654 |
| 5654 LayoutBlock* block = containingBlock(); | 5655 LayoutBlock* block = containingBlock(); |
| 5655 if (block) | 5656 if (block) |
| 5656 block->adjustChildDebugRect(rect); | 5657 block->adjustChildDebugRect(rect); |
| 5657 | 5658 |
| 5658 return rect; | 5659 return rect; |
| 5659 } | 5660 } |
| 5660 | 5661 |
| 5661 } // namespace blink | 5662 } // namespace blink |
| OLD | NEW |