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

Unified Diff: Source/core/rendering/RenderBox.cpp

Issue 637033003: [CSS Grid Layout] Fix positioned grid children position and size (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Remove "if else" Created 6 years, 1 month 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: Source/core/rendering/RenderBox.cpp
diff --git a/Source/core/rendering/RenderBox.cpp b/Source/core/rendering/RenderBox.cpp
index 7e63fe333b7890e7e5c48a84f0ad34a67eb493fb..a9836c79a1e1e0e6b0fc801d72ed7547e61b086e 100644
--- a/Source/core/rendering/RenderBox.cpp
+++ b/Source/core/rendering/RenderBox.cpp
@@ -2617,6 +2617,9 @@ LayoutUnit RenderBox::containingBlockLogicalWidthForPositioned(const RenderBoxMo
}
}
+ if (hasOverrideContainingBlockLogicalWidth())
+ return overrideContainingBlockContentLogicalWidth();
+
if (containingBlock->isBox())
return toRenderBox(containingBlock)->clientLogicalWidth();
@@ -2657,6 +2660,9 @@ LayoutUnit RenderBox::containingBlockLogicalHeightForPositioned(const RenderBoxM
}
}
+ if (hasOverrideContainingBlockLogicalHeight())
+ return overrideContainingBlockContentLogicalHeight();
+
if (containingBlock->isBox()) {
const RenderBlock* cb = containingBlock->isRenderBlock() ?
toRenderBlock(containingBlock) : containingBlock->containingBlock();
@@ -2683,14 +2689,37 @@ LayoutUnit RenderBox::containingBlockLogicalHeightForPositioned(const RenderBoxM
return heightResult;
}
+static LayoutUnit computeInlineStaticPositionForGridChild(Length& logicalLeft, Length& logicalRight, const RenderBox* child, const RenderBoxModelObject* containerBlock, LayoutUnit containerLogicalWidth)
+{
+ ASSERT(containerBlock->isRenderGrid());
+ LayoutUnit staticPosition = 0;
+
+ if (containerBlock->style()->direction() == LTR) {
+ if (!logicalLeft.isAuto())
+ staticPosition += valueForLength(logicalLeft, containerLogicalWidth);
+ else if (!logicalRight.isAuto())
+ staticPosition -= valueForLength(logicalRight, containerLogicalWidth);
+ } else {
+ if (!logicalRight.isAuto())
+ staticPosition += valueForLength(logicalRight, containerLogicalWidth);
+ else if (!logicalLeft.isAuto())
+ staticPosition -= valueForLength(logicalLeft, containerLogicalWidth);
+ }
+ return staticPosition;
+}
+
static void computeInlineStaticDistance(Length& logicalLeft, Length& logicalRight, const RenderBox* child, const RenderBoxModelObject* containerBlock, LayoutUnit containerLogicalWidth)
{
- if (!logicalLeft.isAuto() || !logicalRight.isAuto())
+ if ((!logicalLeft.isAuto() || !logicalRight.isAuto()) && (!containerBlock->isRenderGrid() || (containerBlock->isRenderGrid() && child->style()->gridColumnStart().isAuto())))
return;
+ LayoutUnit staticPosition = 0;
+ if (containerBlock->isRenderGrid())
+ staticPosition = computeInlineStaticPositionForGridChild(logicalLeft, logicalRight, child, containerBlock, containerLogicalWidth);
+
// FIXME: The static distance computation has not been patched for mixed writing modes yet.
if (child->parent()->style()->direction() == LTR) {
- LayoutUnit staticPosition = child->layer()->staticInlinePosition() - containerBlock->borderLogicalLeft();
+ staticPosition += child->layer()->staticInlinePosition() - containerBlock->borderLogicalLeft();
for (RenderObject* curr = child->parent(); curr && curr != containerBlock; curr = curr->container()) {
if (curr->isBox()) {
staticPosition += toRenderBox(curr)->logicalLeft();
@@ -2708,7 +2737,7 @@ static void computeInlineStaticDistance(Length& logicalLeft, Length& logicalRigh
logicalLeft.setValue(Fixed, staticPosition);
} else {
RenderBox* enclosingBox = child->parent()->enclosingBox();
- LayoutUnit staticPosition = child->layer()->staticInlinePosition() + containerLogicalWidth + containerBlock->borderLogicalLeft();
+ staticPosition += child->layer()->staticInlinePosition() + containerLogicalWidth + containerBlock->borderLogicalLeft();
for (RenderObject* curr = child->parent(); curr; curr = curr->container()) {
if (curr->isBox()) {
if (curr != containerBlock) {
@@ -3051,13 +3080,29 @@ void RenderBox::computePositionedLogicalWidthUsing(Length logicalWidth, const Re
computeLogicalLeftPositionedOffset(computedValues.m_position, this, computedValues.m_extent, containerBlock, containerLogicalWidth);
}
-static void computeBlockStaticDistance(Length& logicalTop, Length& logicalBottom, const RenderBox* child, const RenderBoxModelObject* containerBlock)
+static LayoutUnit computeBlockStaticPositionForGridItem(Length& logicalTop, Length& logicalBottom, const RenderBox* child, const RenderBoxModelObject* containerBlock, LayoutUnit containerLogicalHeight)
{
- if (!logicalTop.isAuto() || !logicalBottom.isAuto())
+ ASSERT(containerBlock->isRenderGrid());
+
+ LayoutUnit staticPosition = 0;
+ if (!logicalTop.isAuto())
+ staticPosition += valueForLength(logicalTop, containerLogicalHeight);
+ else if (!logicalBottom.isAuto())
Julien - ping for review 2014/11/24 21:44:40 Shoudn't we remove the logical bottom even if we h
Manuel Rego 2014/12/01 11:10:36 Yeah, thanks for your comment. I was testing this
+ staticPosition -= valueForLength(logicalBottom, containerLogicalHeight);
+ return staticPosition;
+}
+
+static void computeBlockStaticDistance(Length& logicalTop, Length& logicalBottom, const RenderBox* child, const RenderBoxModelObject* containerBlock, LayoutUnit containerLogicalHeight)
+{
+ if ((!logicalTop.isAuto() || !logicalBottom.isAuto()) && (!containerBlock->isRenderGrid() || (containerBlock->isRenderGrid() && child->style()->gridRowStart().isAuto())))
return;
+ LayoutUnit staticLogicalTop = 0;
+ if (containerBlock->isRenderGrid())
+ staticLogicalTop = computeBlockStaticPositionForGridItem(logicalTop, logicalBottom, child, containerBlock, containerLogicalHeight);
+
// FIXME: The static distance computation has not been patched for mixed writing modes.
- LayoutUnit staticLogicalTop = child->layer()->staticBlockPosition() - containerBlock->borderBefore();
+ staticLogicalTop += child->layer()->staticBlockPosition() - containerBlock->borderBefore();
for (RenderObject* curr = child->parent(); curr && curr != containerBlock; curr = curr->container()) {
if (curr->isBox() && !curr->isTableRow())
staticLogicalTop += toRenderBox(curr)->logicalTop();
@@ -3110,7 +3155,7 @@ void RenderBox::computePositionedLogicalHeight(LogicalExtentComputedValues& comp
// see FIXME 1
// Calculate the static distance if needed.
- computeBlockStaticDistance(logicalTopLength, logicalBottomLength, this, containerBlock);
+ computeBlockStaticDistance(logicalTopLength, logicalBottomLength, this, containerBlock, containerLogicalHeight);
// Calculate constraint equation values for 'height' case.
LayoutUnit logicalHeight = computedValues.m_extent;
@@ -3516,7 +3561,7 @@ void RenderBox::computePositionedLogicalHeightReplaced(LogicalExtentComputedValu
* with the element's static position.
\*-----------------------------------------------------------------------*/
// see FIXME 1
- computeBlockStaticDistance(logicalTop, logicalBottom, this, containerBlock);
+ computeBlockStaticDistance(logicalTop, logicalBottom, this, containerBlock, containerLogicalHeight);
/*-----------------------------------------------------------------------*\
* 3. If 'bottom' is 'auto', replace any 'auto' on 'margin-top' or

Powered by Google App Engine
This is Rietveld 408576698