Title: [89286] branches/chromium/782
- Revision
- 89286
- Author
- cev...@google.com
- Date
- 2011-06-20 13:27:48 -0700 (Mon, 20 Jun 2011)
Log Message
Merge 89165
BUG=86502
Review URL: http://codereview.chromium.org/7200036
Modified Paths
Added Paths
Diff
Copied: branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5-expected.txt (from rev 89165, trunk/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5-expected.txt) (0 => 89286)
--- branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5-expected.txt (rev 0)
+++ branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5-expected.txt 2011-06-20 20:27:48 UTC (rev 89286)
@@ -0,0 +1,4 @@
+Test passes if it does not crash.
+A A
+
+
Copied: branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5.html (from rev 89165, trunk/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5.html) (0 => 89286)
--- branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5.html (rev 0)
+++ branches/chromium/782/LayoutTests/fast/block/float/float-not-removed-from-next-sibling5.html 2011-06-20 20:27:48 UTC (rev 89286)
@@ -0,0 +1,26 @@
+<html>
+Test passes if it does not crash.
+<div id="test1" style="width: 12px; position: relative">
+ <span>
+ <div id="test2">
+ <p style="float: left"></p>
+ </div>
+ </span>
+ <div id="test3">
+ <span>
+ <p>A A</p>
+ </span>
+ </div>
+</div>
+<script>
+ if (window.layoutTestController)
+ layoutTestController.dumpAsText();
+
+ document.body.offsetTop;
+ test3.style.position = 'absolute';
+ test2.style.position = 'absolute';
+ document.body.offsetTop;
+ test1.style.height = '1';
+ test2.style.display = 'none';
+</script>
+</html>
Modified: branches/chromium/782/Source/WebCore/rendering/RenderBlock.cpp (89285 => 89286)
--- branches/chromium/782/Source/WebCore/rendering/RenderBlock.cpp 2011-06-20 20:24:35 UTC (rev 89285)
+++ branches/chromium/782/Source/WebCore/rendering/RenderBlock.cpp 2011-06-20 20:27:48 UTC (rev 89286)
@@ -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.
Modified: branches/chromium/782/Source/WebCore/rendering/RenderBlock.h (89285 => 89286)
--- branches/chromium/782/Source/WebCore/rendering/RenderBlock.h 2011-06-20 20:24:35 UTC (rev 89285)
+++ branches/chromium/782/Source/WebCore/rendering/RenderBlock.h 2011-06-20 20:27:48 UTC (rev 89286)
@@ -582,6 +582,7 @@
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);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes