Index: Source/core/layout/LayoutBlockFlowLine.cpp |
diff --git a/Source/core/layout/LayoutBlockFlowLine.cpp b/Source/core/layout/LayoutBlockFlowLine.cpp |
index 18c10cce7a561db99e71d25bfbf7224085246241..10fccd480b97973d8f1c7dd4506544f620fea671 100644 |
--- a/Source/core/layout/LayoutBlockFlowLine.cpp |
+++ b/Source/core/layout/LayoutBlockFlowLine.cpp |
@@ -38,7 +38,6 @@ |
#include "core/layout/line/LayoutTextInfo.h" |
#include "core/layout/line/LineLayoutState.h" |
#include "core/layout/line/LineWidth.h" |
-#include "core/layout/line/TrailingFloatsRootInlineBox.h" |
#include "core/layout/line/WordMeasurement.h" |
#include "core/layout/svg/line/SVGRootInlineBox.h" |
#include "platform/fonts/Character.h" |
@@ -816,7 +815,6 @@ void LayoutBlockFlow::layoutRunsAndFloatsInRange(LineLayoutState& layoutState, |
// Once BidiRunList is separated from BidiResolver this will not be needed. |
resolver.runs().deleteRuns(); |
resolver.markCurrentRunEmpty(); // FIXME: This can probably be replaced by an ASSERT (or just removed). |
- layoutState.setCheckForFloatsFromLastLine(true); |
resolver.setPosition(InlineIterator(resolver.position().root(), 0, 0), 0); |
break; |
} |
@@ -1012,7 +1010,7 @@ void LayoutBlockFlow::linkToEndLineIfNeeded(LineLayoutState& layoutState) |
} |
} |
- if (m_floatingObjects && (layoutState.checkForFloatsFromLastLine() || positionNewFloats()) && lastRootBox()) { |
+ 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 |
@@ -1030,22 +1028,6 @@ void LayoutBlockFlow::linkToEndLineIfNeeded(LineLayoutState& layoutState) |
if (it == end) |
return; |
- if (layoutState.checkForFloatsFromLastLine()) { |
- LayoutUnit bottomVisualOverflow = lastRootBox()->logicalBottomVisualOverflow(); |
- LayoutUnit bottomLayoutOverflow = lastRootBox()->logicalBottomLayoutOverflow(); |
- TrailingFloatsRootInlineBox* trailingFloatsLineBox = new TrailingFloatsRootInlineBox(*this); |
- m_lineBoxes.appendLineBox(trailingFloatsLineBox); |
- trailingFloatsLineBox->setConstructed(); |
- GlyphOverflowAndFallbackFontsMap textBoxDataMap; |
- VerticalPositionCache verticalPositionCache; |
- LayoutUnit blockLogicalHeight = logicalHeight(); |
- trailingFloatsLineBox->alignBoxesInBlockDirection(blockLogicalHeight, textBoxDataMap, verticalPositionCache); |
- trailingFloatsLineBox->setLineTopBottomPositions(blockLogicalHeight, blockLogicalHeight, blockLogicalHeight, blockLogicalHeight); |
- LayoutRect logicalLayoutOverflow(0, blockLogicalHeight, 1, bottomLayoutOverflow - blockLogicalHeight); |
- LayoutRect logicalVisualOverflow(0, blockLogicalHeight, 1, bottomVisualOverflow - blockLogicalHeight); |
- trailingFloatsLineBox->setOverflowFromLogicalRects(logicalLayoutOverflow, logicalVisualOverflow, trailingFloatsLineBox->lineTop(), trailingFloatsLineBox->lineBottom()); |
- } |
- |
for (; it != end; ++it) |
appendFloatingObjectToLastLine(*it->get()); |
} |
@@ -1546,6 +1528,7 @@ void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& pa |
// deleted and only dirtied. In that case, we can layout the replaced |
// elements at the same time. |
Vector<LayoutBox*> replacedChildren; |
+ LayoutObject* lastChild = nullptr; |
for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { |
LayoutObject* o = walker.current(); |
@@ -1580,7 +1563,13 @@ void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& pa |
dirtyLineBoxesForObject(o, layoutState.isFullLayout()); |
o->clearNeedsLayout(); |
} |
+ if (!o->isText() || !toLayoutText(o)->isAllCollapsibleWhitespace()) |
+ lastChild = o; |
} |
+ // If there is a trailing float on the line that will possibly occur after a natural line break |
+ // then dirty its adjacent lineboxes to ensure it gets placed. |
leviw_travelin_and_unemployed
2015/07/28 18:25:38
If it's the last child and a float, will we ever b
rhogan
2015/07/28 19:10:37
The one it's on and possibly the one before it. Th
|
+ if (lastChild && lastChild->isFloating()) |
+ dirtyLinesFromChangedChild(lastChild); |
leviw_travelin_and_unemployed
2015/07/28 18:25:38
Where did we dirty these lines before?
rhogan
2015/07/28 19:10:37
We didn't. Instead we added a new line box at the
|
for (size_t i = 0; i < replacedChildren.size(); i++) |
replacedChildren[i]->layoutIfNeeded(); |