| 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) {
 | 
| 
 |