Chromium Code Reviews| Index: Source/core/layout/LayoutBlockFlowLine.cpp |
| diff --git a/Source/core/layout/LayoutBlockFlowLine.cpp b/Source/core/layout/LayoutBlockFlowLine.cpp |
| index 1c192276d25404ba9e39b814d1c0683b9308e72a..816578bb988803eb82c703b81b29d5006d9b5332 100644 |
| --- a/Source/core/layout/LayoutBlockFlowLine.cpp |
| +++ b/Source/core/layout/LayoutBlockFlowLine.cpp |
| @@ -1490,6 +1490,11 @@ void LayoutBlockFlow::computeInlinePreferredLogicalWidths(LayoutUnit& minLogical |
| maxLogicalWidth = std::max(maxLogicalWidth, inlineMax); |
| } |
| +static bool isInlineWithOutlineAndContinuation(const LayoutObject& o) |
| +{ |
| + return o.isLayoutInline() && o.styleRef().hasOutline() && !o.isElementContinuation() && toLayoutInline(o).continuation(); |
| +} |
| + |
| void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& paintInvalidationLogicalTop, LayoutUnit& paintInvalidationLogicalBottom, LayoutUnit afterEdge) |
| { |
| LayoutFlowThread* flowThread = flowThreadContainingBlock(); |
| @@ -1523,6 +1528,8 @@ void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& pa |
| if (hasTextOverflow) |
| deleteEllipsisLineBoxes(); |
| + setContainsInlineWithOutlineAndContinuation(false); |
|
chrishtr
2015/08/27 18:20:59
If the DOM changes to remove all inline children,
Xianzhu
2015/08/27 19:23:12
Nice catch. Done.
|
| + |
| if (firstChild()) { |
| // In full layout mode, clear the line boxes of children upfront. Otherwise, |
| // siblings can run into stale root lineboxes during layout. Then layout |
| @@ -1567,6 +1574,9 @@ void LayoutBlockFlow::layoutInlineChildren(bool relayoutChildren, LayoutUnit& pa |
| } |
| if (!o->isText() || !toLayoutText(o)->isAllCollapsibleWhitespace()) |
| lastChild = o; |
| + |
| + if (!containsInlineWithOutlineAndContinuation() && isInlineWithOutlineAndContinuation(*o)) |
|
chrishtr
2015/08/27 18:20:59
What's the point of checking for !containsInlineWi
Xianzhu
2015/08/27 19:23:12
Was to avoid the cost of isInlineWithOutlineAndCon
|
| + setContainsInlineWithOutlineAndContinuation(true); |
| } |
| // 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. |
| @@ -1859,6 +1869,24 @@ void LayoutBlockFlow::addOverflowFromInlineChildren() |
| LayoutRect visualOverflow = curr->visualOverflowRect(curr->lineTop(), curr->lineBottom()); |
| addContentsVisualOverflow(visualOverflow); |
| } |
| + |
| + if (!containsInlineWithOutlineAndContinuation()) |
| + return; |
| + |
| + // Add outline rects of continuations of descendant inlines into visual overflow of this block. |
| + LayoutRect outlineBoundsOfAllContinuations; |
| + for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { |
| + const LayoutObject& o = *walker.current(); |
| + if (!isInlineWithOutlineAndContinuation(o)) |
| + continue; |
| + |
| + Vector<LayoutRect> outlineRects; |
| + toLayoutInline(o).addOutlineRectsForContinuations(outlineRects, LayoutPoint()); |
| + LayoutRect outlineBounds = unionRect(outlineRects); |
| + outlineBounds.inflate(o.styleRef().outlineOutsetExtent()); |
| + outlineBoundsOfAllContinuations.unite(outlineBounds); |
| + } |
| + addContentsVisualOverflow(outlineBoundsOfAllContinuations); |
| } |
| void LayoutBlockFlow::deleteEllipsisLineBoxes() |