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

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBox.cpp

Issue 2154593003: [css-grid] Fix indefinite height detection (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix fast/table/003.html test Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/LayoutBox.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
index bd3dd55b2e8ccb76b136b641254925cee03264ec..f2d83420e8653059e267893e595dc18eaa37967c 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -2696,22 +2696,9 @@ bool LayoutBox::skipContainingBlockForPercentHeightCalculation(const LayoutBox*
return document().inQuirksMode() && !containingBlock->isTableCell() && !containingBlock->isOutOfFlowPositioned() && !containingBlock->isLayoutGrid() && containingBlock->style()->logicalHeight().isAuto();
}
-LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
+LayoutUnit LayoutBox::availableLogicalHeightForPercentageComputation(const LayoutBlock* cb, bool skippedAutoHeightContainingBlock, bool scrollsOverflowY)
jfernandez 2016/07/18 06:13:24 I find it weird how we use the skippedAutoHeightCo
svillar 2016/07/18 08:43:30 Agree with jfernandez, this is related to the fact
Manuel Rego 2016/07/19 13:12:32 Yeah, I've redo the patch and have removed the boo
{
- LayoutUnit availableHeight(-1);
-
- bool skippedAutoHeightContainingBlock = false;
- LayoutBlock* cb = containingBlock();
- const LayoutBox* containingBlockChild = this;
- LayoutUnit rootMarginBorderPaddingHeight;
- while (!cb->isLayoutView() && skipContainingBlockForPercentHeightCalculation(cb)) {
- if (cb->isBody() || cb->isDocumentElement())
- rootMarginBorderPaddingHeight += cb->marginBefore() + cb->marginAfter() + cb->borderAndPaddingLogicalHeight();
- skippedAutoHeightContainingBlock = true;
- containingBlockChild = cb;
- cb = cb->containingBlock();
- }
- cb->addPercentHeightDescendant(const_cast<LayoutBox*>(this));
+ LayoutUnit availableHeight = LayoutUnit(-1);
const ComputedStyle& cbstyle = cb->styleRef();
@@ -2719,26 +2706,18 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
// explicitly specified that can be used for any percentage computations.
bool isOutOfFlowPositionedWithSpecifiedHeight = cb->isOutOfFlowPositioned() && (!cbstyle.logicalHeight().isAuto() || (!cbstyle.logicalTop().isAuto() && !cbstyle.logicalBottom().isAuto()));
- bool includeBorderPadding = isTable();
-
LayoutUnit stretchedFlexHeight(-1);
if (cb->isFlexItem())
stretchedFlexHeight = toLayoutFlexibleBox(cb->parent())->childLogicalHeightForPercentageResolution(*cb);
- if (isHorizontalWritingMode() != cb->isHorizontalWritingMode()) {
- availableHeight = containingBlockChild->containingBlockLogicalWidthForContent();
- } else if (stretchedFlexHeight != LayoutUnit(-1)) {
+ if (stretchedFlexHeight != LayoutUnit(-1)) {
availableHeight = stretchedFlexHeight;
- } else if (hasOverrideContainingBlockLogicalHeight() && !isOutOfFlowPositionedWithSpecifiedHeight) {
- availableHeight = overrideContainingBlockContentLogicalHeight();
} else if (cb->isGridItem() && cb->hasOverrideLogicalContentHeight()) {
availableHeight = cb->overrideLogicalContentHeight();
} else if (cbstyle.logicalHeight().isFixed()) {
LayoutUnit contentBoxHeight = cb->adjustContentBoxLogicalHeightForBoxSizing(cbstyle.logicalHeight().value());
availableHeight = cb->constrainContentBoxLogicalHeightByMinMax(
contentBoxHeight - cb->scrollbarLogicalHeight(), LayoutUnit(-1)).clampNegativeToZero();
- if (cb->isTableCell())
- includeBorderPadding = true;
} else if (cb->isTableCell()) {
if (!skippedAutoHeightContainingBlock) {
// Table cells violate what the CSS spec says to do with heights. Basically we
@@ -2752,13 +2731,12 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
// no size and allow the flexing of the table or the cell to its specified height to cause us
// to grow to fill the space. This could end up being wrong in some cases, but it is
// preferable to the alternative (sizing intrinsically and making the row end up too big).
- LayoutTableCell* cell = toLayoutTableCell(cb);
- if (scrollsOverflowY() && (!cell->style()->logicalHeight().isAuto() || !cell->table()->style()->logicalHeight().isAuto()))
+ const LayoutTableCell* cell = toLayoutTableCell(cb);
jfernandez 2016/07/18 06:13:24 Why do you need the cell to be const here ?
Manuel Rego 2016/07/19 13:12:32 This was not needed, just slipped into the patch.
+ if (scrollsOverflowY && (!cell->style()->logicalHeight().isAuto() || !cell->table()->style()->logicalHeight().isAuto()))
return LayoutUnit();
return LayoutUnit(-1);
}
availableHeight = cb->overrideLogicalContentHeight();
- includeBorderPadding = true;
}
} else if (cbstyle.logicalHeight().hasPercent() && !isOutOfFlowPositionedWithSpecifiedHeight) {
// We need to recur and compute the percentage height for our containing block.
@@ -2779,8 +2757,37 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
cb->computeLogicalHeight(cb->logicalHeight(), LayoutUnit(), computedValues);
availableHeight = computedValues.m_extent - cb->borderAndPaddingLogicalHeight() - cb->scrollbarLogicalHeight();
} else if (cb->isLayoutView()) {
- availableHeight = view()->viewLogicalHeightForPercentages();
+ availableHeight = toLayoutView(cb)->viewLogicalHeightForPercentages();
svillar 2016/07/18 08:43:30 why this?
Manuel Rego 2016/07/19 13:12:32 This was because it's a static method so I couldn'
+ }
+
+ if (availableHeight == -1)
+ return availableHeight;
+
+ return availableHeight;
+}
+
+LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
+{
+ LayoutBlock* cb = containingBlock();
+ const LayoutBox* containingBlockChild = this;
+ bool skippedAutoHeightContainingBlock = false;
+ LayoutUnit rootMarginBorderPaddingHeight;
+ while (!cb->isLayoutView() && skipContainingBlockForPercentHeightCalculation(cb)) {
+ if (cb->isBody() || cb->isDocumentElement())
+ rootMarginBorderPaddingHeight += cb->marginBefore() + cb->marginAfter() + cb->borderAndPaddingLogicalHeight();
+ skippedAutoHeightContainingBlock = true;
+ containingBlockChild = cb;
+ cb = cb->containingBlock();
}
+ cb->addPercentHeightDescendant(const_cast<LayoutBox*>(this));
+
+ LayoutUnit availableHeight;
+ if (isHorizontalWritingMode() != cb->isHorizontalWritingMode())
+ availableHeight = containingBlockChild->containingBlockLogicalWidthForContent();
+ else if (isGridItem() && hasOverrideContainingBlockLogicalHeight())
+ availableHeight = overrideContainingBlockContentLogicalHeight();
jfernandez 2016/07/18 06:13:24 I guess this is new logic. I'd rather do it in a d
svillar 2016/07/18 08:43:30 I think that's a good idea. First the refactoring,
Manuel Rego 2016/07/19 13:12:32 This is not exactly new logic. There were some sim
+ else
+ availableHeight = availableLogicalHeightForPercentageComputation(cb, skippedAutoHeightContainingBlock, scrollsOverflowY());
if (availableHeight == -1)
return availableHeight;
@@ -2791,6 +2798,7 @@ LayoutUnit LayoutBox::computePercentageLogicalHeight(const Length& height) const
availableHeight += cb->paddingLogicalHeight();
LayoutUnit result = valueForLength(height, availableHeight);
+ bool includeBorderPadding = isTable() || (cb->isTableCell() && (cb->styleRef().logicalHeight().isFixed() || (!skippedAutoHeightContainingBlock && cb->hasOverrideLogicalContentHeight())));
if (includeBorderPadding) {
// TODO(rhogan) crbug.com/467378: Doing this for content inside tables cells is wrong, it should fill
// whatever height the cell makes available.

Powered by Google App Engine
This is Rietveld 408576698