Chromium Code Reviews| Index: Source/core/layout/LayoutBlockFlowLine.cpp |
| diff --git a/Source/core/layout/LayoutBlockFlowLine.cpp b/Source/core/layout/LayoutBlockFlowLine.cpp |
| index 924b1d52140ee051dd94115e57b832038eeab219..7a72556c6adffc96dce70ffea1b62d4ccc6f4389 100644 |
| --- a/Source/core/layout/LayoutBlockFlowLine.cpp |
| +++ b/Source/core/layout/LayoutBlockFlowLine.cpp |
| @@ -902,27 +902,8 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, |
| clearFloats(lineBreaker.clear()); |
| } |
| - if (m_floatingObjects && lastRootBox()) { |
| - const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| - FloatingObjectSetIterator it = floatingObjectSet.begin(); |
| - FloatingObjectSetIterator end = floatingObjectSet.end(); |
| - if (layoutState.lastFloat()) { |
| - FloatingObjectSetIterator lastFloatIterator = floatingObjectSet.find(layoutState.lastFloat()); |
| - ASSERT(lastFloatIterator != end); |
| - ++lastFloatIterator; |
| - it = lastFloatIterator; |
| - } |
| - for (; it != end; ++it) { |
| - FloatingObject* f = it->get(); |
| - appendFloatingObjectToLastLine(f); |
| - ASSERT(f->layoutObject() == layoutState.floats()[layoutState.floatIndex()].object); |
| - // If a float's geometry has changed, give up on syncing with clean lines. |
| - if (layoutState.floats()[layoutState.floatIndex()].rect != f->frameRect()) |
| - checkForEndLineMatch = false; |
| - layoutState.setFloatIndex(layoutState.floatIndex() + 1); |
| - } |
| - layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floatingObjectSet.last().get() : 0); |
| - } |
| + if (appendFloatsToEndOfLine(layoutState, true)) |
| + checkForEndLineMatch = false; |
| } |
| lineMidpointState.reset(); |
| @@ -992,6 +973,37 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, |
| clearDidBreakAtLineToAvoidWidow(); |
| } |
| +bool LayoutBlockFlow::appendFloatsToEndOfLine(LineLayoutState& layoutState, bool updateFloatIndex) |
| +{ |
| + if (!m_floatingObjects || !lastRootBox()) |
| + return false; |
| + |
| + const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| + FloatingObjectSetIterator it = floatingObjectSet.begin(); |
| + FloatingObjectSetIterator end = floatingObjectSet.end(); |
| + if (layoutState.lastFloat()) { |
| + FloatingObjectSetIterator lastFloatIterator = floatingObjectSet.find(layoutState.lastFloat()); |
| + ASSERT(lastFloatIterator != end); |
| + ++lastFloatIterator; |
| + it = lastFloatIterator; |
| + } |
| + |
| + bool floatChangedSize = false; |
| + for (; it != end; ++it) { |
| + FloatingObject* f = it->get(); |
| + appendFloatingObjectToLastLine(f); |
| + if (updateFloatIndex) { |
| + ASSERT(f->layoutObject() == layoutState.floats()[layoutState.floatIndex()].object); |
| + // If a float's geometry has changed, give up on syncing with clean lines. |
| + if (layoutState.floats()[layoutState.floatIndex()].rect != f->frameRect()) |
| + floatChangedSize = true; |
| + layoutState.setFloatIndex(layoutState.floatIndex() + 1); |
| + } |
| + } |
| + layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floatingObjectSet.last().get() : 0); |
| + return floatChangedSize; |
| +} |
| + |
| void LayoutBlockFlow::linkToEndLineIfNeeded(LineLayoutState& layoutState) |
| { |
| if (layoutState.endLine()) { |
| @@ -1026,27 +1038,8 @@ void LayoutBlockFlow::linkToEndLineIfNeeded(LineLayoutState& layoutState) |
| } |
| } |
| - if (positionNewFloats() && lastRootBox()) { |
| - // In case we have a float on the last line, it might not be positioned up to now. |
| - // This has to be done before adding in the bottom border/padding, or the float will |
| - // include the padding incorrectly. -dwh |
|
leviw_travelin_and_unemployed
2015/05/27 18:26:19
Ahhh, from the good ol' days of "-dwh"
|
| - const FloatingObjectSet& floatingObjectSet = m_floatingObjects->set(); |
| - FloatingObjectSetIterator it = floatingObjectSet.begin(); |
| - FloatingObjectSetIterator end = floatingObjectSet.end(); |
| - if (layoutState.lastFloat()) { |
| - FloatingObjectSetIterator lastFloatIterator = floatingObjectSet.find(layoutState.lastFloat()); |
| - ASSERT(lastFloatIterator != end); |
| - ++lastFloatIterator; |
| - it = lastFloatIterator; |
| - } |
| - layoutState.setLastFloat(!floatingObjectSet.isEmpty() ? floatingObjectSet.last().get() : 0); |
| - |
| - if (it == end) |
| - return; |
| - |
| - for (; it != end; ++it) |
| - appendFloatingObjectToLastLine(it->get()); |
| - } |
| + if (positionNewFloats()) |
| + appendFloatsToEndOfLine(layoutState, false); |
| } |
| void LayoutBlockFlow::markDirtyFloatsForPaintInvalidation(Vector<FloatWithRect>& floats) |