| Index: Source/WebCore/rendering/RenderBlock.cpp
|
| ===================================================================
|
| --- Source/WebCore/rendering/RenderBlock.cpp (revision 89285)
|
| +++ Source/WebCore/rendering/RenderBlock.cpp (working copy)
|
| @@ -262,12 +262,33 @@
|
| }
|
|
|
| // 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();
|
| }
|
| }
|
|
|
| @@ -3741,6 +3762,19 @@
|
| 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.
|
|
|