diff options
Diffstat (limited to 'Source/WebCore/rendering')
-rw-r--r-- | Source/WebCore/rendering/RenderBlock.cpp | 45 | ||||
-rw-r--r-- | Source/WebCore/rendering/RenderBlock.h | 1 |
2 files changed, 42 insertions, 4 deletions
diff --git a/Source/WebCore/rendering/RenderBlock.cpp b/Source/WebCore/rendering/RenderBlock.cpp index 792b809..8fa021f 100644 --- a/Source/WebCore/rendering/RenderBlock.cpp +++ b/Source/WebCore/rendering/RenderBlock.cpp @@ -226,6 +226,9 @@ void RenderBlock::styleWillChange(StyleDifference diff, const RenderStyle* newSt if (cb->isRenderBlock()) toRenderBlock(cb)->removePositionedObjects(this); } + + if (containsFloats() && !isFloating() && !isPositioned() && (newStyle->position() == AbsolutePosition || newStyle->position() == FixedPosition)) + markAllDescendantsWithFloatsForLayout(); } RenderBox::styleWillChange(diff, newStyle); @@ -269,12 +272,33 @@ void RenderBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldSty } // After our style changed, if we lose our ability to propagate floats into next sibling - // blocks, then we need to mark our descendants with floats for layout and clear all floats - // from next sibling blocks that exist in our floating objects list. See bug 56299. + // blocks, then we need to find the top most parent containing that overhanging float and + // then mark its descendants with floats for layout and clear all floats from its next + // sibling blocks that exist in our floating objects list. See bug 56299 and 62875. bool canPropagateFloatIntoSibling = !isFloatingOrPositioned() && !avoidsFloats(); if (diff == StyleDifferenceLayout && s_canPropagateFloatIntoSibling && !canPropagateFloatIntoSibling && hasOverhangingFloats()) { - markAllDescendantsWithFloatsForLayout(); - markSiblingsWithFloatsForLayout(); + RenderBlock* parentBlock = this; + FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); + FloatingObjectSetIterator end = floatingObjectSet.end(); + + for (RenderObject* curr = parent(); curr && !curr->isRenderView(); curr = curr->parent()) { + if (curr->isRenderBlock()) { + RenderBlock* currBlock = toRenderBlock(curr); + + if (currBlock->hasOverhangingFloats()) { + for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) { + RenderBox* renderer = (*it)->renderer(); + if (currBlock->hasOverhangingFloat(renderer)) { + parentBlock = currBlock; + break; + } + } + } + } + } + + parentBlock->markAllDescendantsWithFloatsForLayout(); + parentBlock->markSiblingsWithFloatsForLayout(); } } @@ -3738,6 +3762,19 @@ int RenderBlock::addOverhangingFloats(RenderBlock* child, int logicalLeftOffset, return lowestFloatLogicalBottom; } +bool RenderBlock::hasOverhangingFloat(RenderBox* renderer) +{ + if (!m_floatingObjects || hasColumns() || !parent()) + return false; + + FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); + FloatingObjectSetIterator it = floatingObjectSet.find<RenderBox*, FloatingObjectHashTranslator>(renderer); + if (it == floatingObjectSet.end()) + return false; + + return logicalBottomForFloat(*it) > logicalHeight(); +} + void RenderBlock::addIntrudingFloats(RenderBlock* prev, int logicalLeftOffset, int logicalTopOffset) { // If the parent or previous sibling doesn't have any floats to add, don't bother. diff --git a/Source/WebCore/rendering/RenderBlock.h b/Source/WebCore/rendering/RenderBlock.h index d45ab66..7ca13c6 100644 --- a/Source/WebCore/rendering/RenderBlock.h +++ b/Source/WebCore/rendering/RenderBlock.h @@ -542,6 +542,7 @@ private: virtual bool avoidsFloats() const; bool hasOverhangingFloats() { return parent() && !hasColumns() && containsFloats() && lowestFloatLogicalBottom() > logicalHeight(); } + bool hasOverhangingFloat(RenderBox*); void addIntrudingFloats(RenderBlock* prev, int xoffset, int yoffset); int addOverhangingFloats(RenderBlock* child, int xoffset, int yoffset, bool makeChildPaintOtherFloats); |