| Index: Source/core/layout/FloatingObjects.cpp
|
| diff --git a/Source/core/layout/FloatingObjects.cpp b/Source/core/layout/FloatingObjects.cpp
|
| index e66ab9afcd87c414ec3412e2c6eba190166a192e..530c3572c75db9d32a356804954fac91dc0f0883 100644
|
| --- a/Source/core/layout/FloatingObjects.cpp
|
| +++ b/Source/core/layout/FloatingObjects.cpp
|
| @@ -51,6 +51,7 @@ FloatingObject::FloatingObject(LayoutBox* layoutObject)
|
| #if ENABLE(ASSERT)
|
| , m_isInPlacedTree(false)
|
| #endif
|
| + , m_isLowestNonOverhangingFloatInChild(false)
|
| {
|
| EFloat type = layoutObject->style()->floating();
|
| ASSERT(type != NoFloat);
|
| @@ -60,7 +61,7 @@ FloatingObject::FloatingObject(LayoutBox* layoutObject)
|
| m_type = FloatRight;
|
| }
|
|
|
| -FloatingObject::FloatingObject(LayoutBox* layoutObject, Type type, const LayoutRect& frameRect, bool shouldPaint, bool isDescendant)
|
| +FloatingObject::FloatingObject(LayoutBox* layoutObject, Type type, const LayoutRect& frameRect, bool shouldPaint, bool isDescendant, bool isLowestNonOverhangingFloatInChild)
|
| : m_layoutObject(layoutObject)
|
| , m_originatingLine(0)
|
| , m_frameRect(frameRect)
|
| @@ -72,6 +73,7 @@ FloatingObject::FloatingObject(LayoutBox* layoutObject, Type type, const LayoutR
|
| #if ENABLE(ASSERT)
|
| , m_isInPlacedTree(false)
|
| #endif
|
| + , m_isLowestNonOverhangingFloatInChild(isLowestNonOverhangingFloatInChild)
|
| {
|
| }
|
|
|
| @@ -86,12 +88,12 @@ PassOwnPtr<FloatingObject> FloatingObject::create(LayoutBox* layoutObject)
|
|
|
| PassOwnPtr<FloatingObject> FloatingObject::copyToNewContainer(LayoutSize offset, bool shouldPaint, bool isDescendant) const
|
| {
|
| - return adoptPtr(new FloatingObject(layoutObject(), type(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant));
|
| + return adoptPtr(new FloatingObject(layoutObject(), type(), LayoutRect(frameRect().location() - offset, frameRect().size()), shouldPaint, isDescendant, isLowestNonOverhangingFloatInChild()));
|
| }
|
|
|
| PassOwnPtr<FloatingObject> FloatingObject::unsafeClone() const
|
| {
|
| - OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(layoutObject(), type(), m_frameRect, m_shouldPaint, m_isDescendant));
|
| + OwnPtr<FloatingObject> cloneObject = adoptPtr(new FloatingObject(layoutObject(), type(), m_frameRect, m_shouldPaint, m_isDescendant, false));
|
| cloneObject->m_paginationStrut = m_paginationStrut;
|
| cloneObject->m_isPlaced = m_isPlaced;
|
| return cloneObject.release();
|
| @@ -180,6 +182,7 @@ FloatingObjects::FloatingObjects(const LayoutBlockFlow* layoutObject, bool horiz
|
| , m_horizontalWritingMode(horizontalWritingMode)
|
| , m_layoutObject(layoutObject)
|
| , m_cachedHorizontalWritingMode(false)
|
| + , m_lowestFloatObject(nullptr)
|
| {
|
| }
|
|
|
| @@ -190,6 +193,7 @@ void FloatingObjects::clear()
|
| m_leftObjectsCount = 0;
|
| m_rightObjectsCount = 0;
|
| markLowestFloatLogicalBottomCacheAsDirty();
|
| + m_lowestFloatObject = nullptr;
|
| }
|
|
|
| LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatType)
|
| @@ -207,15 +211,19 @@ LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatT
|
|
|
| LayoutUnit lowestFloatBottom = 0;
|
| const FloatingObjectSet& floatingObjectSet = set();
|
| + FloatingObject* lowestFloatObject = nullptr;
|
| FloatingObjectSetIterator end = floatingObjectSet.end();
|
| if (floatType == FloatingObject::FloatLeftRight) {
|
| LayoutUnit lowestFloatBottomLeft = 0;
|
| LayoutUnit lowestFloatBottomRight = 0;
|
| + FloatingObject* floatingObject = nullptr;
|
| for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
|
| - FloatingObject* floatingObject = it->get();
|
| + floatingObject = it->get();
|
| if (floatingObject->isPlaced()) {
|
| FloatingObject::Type curType = floatingObject->type();
|
| LayoutUnit curFloatLogicalBottom = m_layoutObject->logicalBottomForFloat(floatingObject);
|
| + if (curFloatLogicalBottom > std::max(lowestFloatBottomLeft, lowestFloatBottomRight))
|
| + lowestFloatObject = floatingObject;
|
| if (curType & FloatingObject::FloatLeft)
|
| lowestFloatBottomLeft = std::max(lowestFloatBottomLeft, curFloatLogicalBottom);
|
| if (curType & FloatingObject::FloatRight)
|
| @@ -223,14 +231,20 @@ LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatT
|
| }
|
| }
|
| lowestFloatBottom = std::max(lowestFloatBottomLeft, lowestFloatBottomRight);
|
| + setLowestFloatObject(lowestFloatObject);
|
| setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatLeft, lowestFloatBottomLeft);
|
| setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatRight, lowestFloatBottomRight);
|
| } else {
|
| + FloatingObject* floatingObject = nullptr;
|
| for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
|
| - FloatingObject* floatingObject = it->get();
|
| - if (floatingObject->isPlaced() && floatingObject->type() == floatType)
|
| + floatingObject = it->get();
|
| + if (floatingObject->isPlaced() && floatingObject->type() == floatType) {
|
| + if (m_layoutObject->logicalBottomForFloat(floatingObject) > lowestFloatBottom)
|
| + lowestFloatObject = floatingObject;
|
| lowestFloatBottom = std::max(lowestFloatBottom, m_layoutObject->logicalBottomForFloat(floatingObject));
|
| + }
|
| }
|
| + setLowestFloatObject(lowestFloatObject);
|
| setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatBottom);
|
| }
|
|
|
|
|