Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(679)

Unified Diff: Source/core/layout/FloatingObjects.cpp

Issue 1106533002: Formatting contexts should always expand to enclose floats (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);
}

Powered by Google App Engine
This is Rietveld 408576698