Index: Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp |
=================================================================== |
--- Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp (revision 99027) |
+++ Source/WebCore/rendering/RenderDeprecatedFlexibleBox.cpp (working copy) |
@@ -97,7 +97,7 @@ |
if (m_currentChild && notFirstOrdinalValue()) |
m_ordinalValues.add(m_currentChild->style()->boxOrdinalGroup()); |
} while (!m_currentChild || (!m_currentChild->isAnonymous() |
- && (m_currentChild->style()->boxOrdinalGroup() != m_currentOrdinal || m_currentChild->style()->visibility() == COLLAPSE))); |
+ && m_currentChild->style()->boxOrdinalGroup() != m_currentOrdinal)); |
return m_currentChild; |
} |
@@ -144,11 +144,16 @@ |
return margin; |
} |
+static bool childDoesNotAffectWidthOrFlexing(RenderObject* child) |
+{ |
+ // Positioned children and collapsed children don't affect the min/max width. |
+ return child->isPositioned() || child->style()->visibility() == COLLAPSE; |
+} |
+ |
void RenderDeprecatedFlexibleBox::calcHorizontalPrefWidths() |
{ |
for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { |
- // Positioned children and collapsed children don't affect the min/max width. |
- if (child->isPositioned() || child->style()->visibility() == COLLAPSE) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
LayoutUnit margin = marginWidthForChild(child); |
@@ -160,8 +165,7 @@ |
void RenderDeprecatedFlexibleBox::calcVerticalPrefWidths() |
{ |
for (RenderBox* child = firstChildBox(); child; child = child->nextSiblingBox()) { |
- // Positioned children and collapsed children don't affect the min/max width. |
- if (child->isPositioned() || child->style()->visibility() == COLLAPSE) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
LayoutUnit margin = marginWidthForChild(child); |
@@ -310,7 +314,7 @@ |
{ |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
// Check to see if this child flexes. |
- if (!child->isPositioned() && child->style()->boxFlex() > 0.0f) { |
+ if (!childDoesNotAffectWidthOrFlexing(child) && child->style()->boxFlex() > 0.0f) { |
// We always have to lay out flexible objects again, since the flex distribution |
// may have changed, and we need to reallocate space. |
child->clearOverrideSize(); |
@@ -422,8 +426,14 @@ |
child->setChildNeedsLayout(true, false); |
} |
continue; |
+ } else if (child->style()->visibility() == COLLAPSE) { |
+ // visibility: collapsed children do not participate in our positioning. |
+ // But we need to lay them down. |
+ child->layoutIfNeeded(); |
+ continue; |
} |
+ |
// We need to see if this child's height has changed, since we make block elements |
// fill the height of a containing box by default. |
// Now do a layout. |
@@ -513,6 +523,9 @@ |
// Now distribute the space to objects. |
for (RenderBox* child = iterator.first(); child && spaceAvailableThisPass && totalFlex; child = iterator.next()) { |
+ if (child->style()->visibility() == COLLAPSE) |
+ continue; |
+ |
if (allowedChildFlex(child, expanding, i)) { |
LayoutUnit spaceAdd = static_cast<LayoutUnit>(spaceAvailableThisPass * (child->style()->boxFlex() / totalFlex)); |
if (spaceAdd) { |
@@ -562,7 +575,7 @@ |
// Determine the total number of children. |
int totalChildren = 0; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
++totalChildren; |
} |
@@ -573,7 +586,7 @@ |
--totalChildren; |
bool firstChild = true; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
if (firstChild) { |
@@ -594,7 +607,7 @@ |
else // END for LTR, START for RTL |
offset += remainingSpace; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
placeChild(child, child->location() + LayoutSize(offset, 0)); |
@@ -654,6 +667,11 @@ |
child->setChildNeedsLayout(true, false); |
} |
continue; |
+ } else if (child->style()->visibility() == COLLAPSE) { |
+ // visibility: collapsed children do not participate in our positioning. |
+ // But we need to lay them down. |
+ child->layoutIfNeeded(); |
+ continue; |
} |
// Compute the child's vertical margins. |
@@ -805,7 +823,7 @@ |
// Determine the total number of children. |
int totalChildren = 0; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
++totalChildren; |
@@ -817,7 +835,7 @@ |
--totalChildren; |
bool firstChild = true; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
if (firstChild) { |
@@ -837,7 +855,7 @@ |
else // END |
offset += remainingSpace; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
placeChild(child, child->location() + LayoutSize(0, offset)); |
} |
@@ -854,7 +872,7 @@ |
{ |
int maxLineCount = 0; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned()) |
+ if (childDoesNotAffectWidthOrFlexing(child)) |
continue; |
if (relayoutChildren || (child->isReplaced() && (child->style()->width().isPercent() || child->style()->height().isPercent())) |
@@ -880,7 +898,7 @@ |
return; |
for (RenderBox* child = iterator.first(); child; child = iterator.next()) { |
- if (child->isPositioned() || !child->style()->height().isAuto() || !child->isBlockFlow()) |
+ if (childDoesNotAffectWidthOrFlexing(child) || !child->style()->height().isAuto() || !child->isBlockFlow()) |
continue; |
RenderBlock* blockChild = toRenderBlock(child); |
@@ -968,7 +986,7 @@ |
LayoutUnit RenderDeprecatedFlexibleBox::allowedChildFlex(RenderBox* child, bool expanding, unsigned int group) |
{ |
- if (child->isPositioned() || child->style()->boxFlex() == 0.0f || child->style()->boxFlexGroup() != group) |
+ if (childDoesNotAffectWidthOrFlexing(child) || child->style()->boxFlex() == 0.0f || child->style()->boxFlexGroup() != group) |
return 0; |
if (expanding) { |