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

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, 6 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
« no previous file with comments | « Source/core/layout/FloatingObjects.h ('k') | Source/core/layout/LayoutBlockFlow.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/layout/FloatingObjects.cpp
diff --git a/Source/core/layout/FloatingObjects.cpp b/Source/core/layout/FloatingObjects.cpp
index e66ab9afcd87c414ec3412e2c6eba190166a192e..206e7f817fe02cfc54fb597c9e08fa6388fae5f3 100644
--- a/Source/core/layout/FloatingObjects.cpp
+++ b/Source/core/layout/FloatingObjects.cpp
@@ -48,6 +48,7 @@ FloatingObject::FloatingObject(LayoutBox* layoutObject)
, m_shouldPaint(true)
, m_isDescendant(false)
, m_isPlaced(false)
+ , m_isLowestNonOverhangingFloatInChild(false)
#if ENABLE(ASSERT)
, m_isInPlacedTree(false)
#endif
@@ -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)
@@ -69,6 +70,7 @@ FloatingObject::FloatingObject(LayoutBox* layoutObject, Type type, const LayoutR
, m_shouldPaint(shouldPaint)
, m_isDescendant(isDescendant)
, m_isPlaced(true)
+ , m_isLowestNonOverhangingFloatInChild(isLowestNonOverhangingFloatInChild)
#if ENABLE(ASSERT)
, m_isInPlacedTree(false)
#endif
@@ -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();
@@ -209,6 +211,8 @@ LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatT
const FloatingObjectSet& floatingObjectSet = set();
FloatingObjectSetIterator end = floatingObjectSet.end();
if (floatType == FloatingObject::FloatLeftRight) {
+ FloatingObject* lowestFloatingObjectLeft = nullptr;
+ FloatingObject* lowestFloatingObjectRight = nullptr;
LayoutUnit lowestFloatBottomLeft = 0;
LayoutUnit lowestFloatBottomRight = 0;
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
@@ -216,22 +220,31 @@ LayoutUnit FloatingObjects::lowestFloatLogicalBottom(FloatingObject::Type floatT
if (floatingObject->isPlaced()) {
FloatingObject::Type curType = floatingObject->type();
LayoutUnit curFloatLogicalBottom = m_layoutObject->logicalBottomForFloat(floatingObject);
- if (curType & FloatingObject::FloatLeft)
- lowestFloatBottomLeft = std::max(lowestFloatBottomLeft, curFloatLogicalBottom);
- if (curType & FloatingObject::FloatRight)
- lowestFloatBottomRight = std::max(lowestFloatBottomRight, curFloatLogicalBottom);
+ if (curType & FloatingObject::FloatLeft && curFloatLogicalBottom > lowestFloatBottomLeft) {
+ lowestFloatBottomLeft = curFloatLogicalBottom;
+ lowestFloatingObjectLeft = floatingObject;
+ }
+ if (curType & FloatingObject::FloatRight && curFloatLogicalBottom > lowestFloatBottomRight) {
+ lowestFloatBottomRight = curFloatLogicalBottom;
+ lowestFloatingObjectRight = floatingObject;
+ }
}
}
lowestFloatBottom = std::max(lowestFloatBottomLeft, lowestFloatBottomRight);
- setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatLeft, lowestFloatBottomLeft);
- setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatRight, lowestFloatBottomRight);
+ setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatLeft, lowestFloatingObjectLeft);
+ setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, FloatingObject::FloatRight, lowestFloatingObjectRight);
} else {
+ FloatingObject* lowestFloatingObject = nullptr;
for (FloatingObjectSetIterator it = floatingObjectSet.begin(); it != end; ++it) {
FloatingObject* floatingObject = it->get();
- if (floatingObject->isPlaced() && floatingObject->type() == floatType)
- lowestFloatBottom = std::max(lowestFloatBottom, m_layoutObject->logicalBottomForFloat(floatingObject));
+ if (floatingObject->isPlaced() && floatingObject->type() == floatType) {
+ if (m_layoutObject->logicalBottomForFloat(floatingObject) > lowestFloatBottom) {
+ lowestFloatingObject = floatingObject;
+ lowestFloatBottom = m_layoutObject->logicalBottomForFloat(floatingObject);
+ }
+ }
}
- setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatBottom);
+ setCachedLowestFloatLogicalBottom(isInHorizontalWritingMode, floatType, lowestFloatingObject);
}
return lowestFloatBottom;
@@ -250,19 +263,36 @@ LayoutUnit FloatingObjects::getCachedlowestFloatLogicalBottom(FloatingObject::Ty
int floatIndex = static_cast<int>(type) - 1;
ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue)));
ASSERT(floatIndex >= 0);
- return m_lowestFloatBottomCache[floatIndex].value;
+ if (!m_lowestFloatBottomCache[floatIndex].floatingObject)
+ return LayoutUnit();
+ return m_layoutObject->logicalBottomForFloat(m_lowestFloatBottomCache[floatIndex].floatingObject);
}
-void FloatingObjects::setCachedLowestFloatLogicalBottom(bool isHorizontal, FloatingObject::Type type, LayoutUnit value)
+void FloatingObjects::setCachedLowestFloatLogicalBottom(bool isHorizontal, FloatingObject::Type type, FloatingObject* floatingObject)
{
int floatIndex = static_cast<int>(type) - 1;
ASSERT(floatIndex < static_cast<int>(sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue)));
ASSERT(floatIndex >= 0);
m_cachedHorizontalWritingMode = isHorizontal;
- m_lowestFloatBottomCache[floatIndex].value = value;
+ m_lowestFloatBottomCache[floatIndex].floatingObject = floatingObject;
m_lowestFloatBottomCache[floatIndex].dirty = false;
}
+FloatingObject* FloatingObjects::lowestFloatingObject() const
+{
+ bool isInHorizontalWritingMode = m_horizontalWritingMode;
+ if (!hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingObject::FloatLeft) && !hasLowestFloatLogicalBottomCached(isInHorizontalWritingMode, FloatingObject::FloatRight))
+ return nullptr;
+ FloatingObject* lowestLeftObject = m_lowestFloatBottomCache[0].floatingObject;
+ FloatingObject* lowestRightObject = m_lowestFloatBottomCache[1].floatingObject;
+ LayoutUnit lowestFloatBottomLeft = lowestLeftObject ? m_layoutObject->logicalBottomForFloat(lowestLeftObject) : LayoutUnit();
+ LayoutUnit lowestFloatBottomRight = lowestRightObject ? m_layoutObject->logicalBottomForFloat(lowestRightObject) : LayoutUnit();
+
+ if (lowestFloatBottomLeft > lowestFloatBottomRight)
+ return lowestLeftObject;
+ return lowestRightObject;
+}
+
void FloatingObjects::markLowestFloatLogicalBottomCacheAsDirty()
{
for (size_t i = 0; i < sizeof(m_lowestFloatBottomCache) / sizeof(FloatBottomCachedValue); ++i)
@@ -410,7 +440,7 @@ LayoutUnit FloatingObjects::logicalRightOffset(LayoutUnit fixedOffset, LayoutUni
}
FloatingObjects::FloatBottomCachedValue::FloatBottomCachedValue()
- : value(0)
+ : floatingObject(nullptr)
, dirty(true)
{
}
« no previous file with comments | « Source/core/layout/FloatingObjects.h ('k') | Source/core/layout/LayoutBlockFlow.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698