Index: Source/core/layout/LayoutInline.cpp |
diff --git a/Source/core/layout/LayoutInline.cpp b/Source/core/layout/LayoutInline.cpp |
index 5abf88d5da1e19e4388cb66c7a8d6f1c6e07bb84..8db6834d12bc05a9ea472cede73bb011ea130334 100644 |
--- a/Source/core/layout/LayoutInline.cpp |
+++ b/Source/core/layout/LayoutInline.cpp |
@@ -1050,32 +1050,22 @@ LayoutRect LayoutInline::clippedOverflowRect(const LayoutBoxModelObject* paintIn |
return LayoutRect(); |
LayoutRect overflowRect(linesVisualOverflowBoundingBox()); |
- mapRectToPaintInvalidationBacking(paintInvalidationContainer, overflowRect, paintInvalidationState); |
LayoutUnit outlineOutset = style()->outlineOutsetExtent(); |
if (outlineOutset) { |
- for (LayoutObject* curr = firstChild(); curr; curr = curr->nextSibling()) { |
- if (!curr->isText()) |
- overflowRect.unite(curr->rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineOutset)); |
+ Vector<LayoutRect> rects; |
+ addOutlineRectsForChildrenAndContinuations(rects, LayoutPoint()); |
+ LayoutRect outlineRect = unionRect(rects); |
+ if (!outlineRect.isEmpty()) { |
+ outlineRect.inflate(outlineOutset); |
+ overflowRect.unite(outlineRect); |
} |
- |
- if (continuation && !continuation->isInline() && continuation->parent()) |
- overflowRect.unite(continuation->rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineOutset)); |
} |
+ mapRectToPaintInvalidationBacking(paintInvalidationContainer, overflowRect, paintInvalidationState); |
return overflowRect; |
} |
-LayoutRect LayoutInline::rectWithOutlineForPaintInvalidation(const LayoutBoxModelObject* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalidationState* paintInvalidationState) const |
-{ |
- LayoutRect r(LayoutBoxModelObject::rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineWidth, paintInvalidationState)); |
- for (LayoutObject* curr = firstChild(); curr; curr = curr->nextSibling()) { |
- if (!curr->isText()) |
- r.unite(curr->rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineWidth, paintInvalidationState)); |
- } |
- return r; |
-} |
- |
void LayoutInline::mapRectToPaintInvalidationBacking(const LayoutBoxModelObject* paintInvalidationContainer, LayoutRect& rect, const PaintInvalidationState* paintInvalidationState) const |
{ |
if (paintInvalidationState && paintInvalidationState->canMapToContainer(paintInvalidationContainer)) { |
@@ -1378,16 +1368,20 @@ public: |
void LayoutInline::addOutlineRects(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const |
{ |
- // Add line boxes only if this object is the first object of addOutlineRects(). |
- // Otherwise the parent (LayoutBlockFlow or LayoutInline) should have added line box rects |
- // covering those of this object. |
- if (rects.isEmpty()) { |
- AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, additionalOffset); |
- generateLineBoxRects(context); |
- } |
+ AbsoluteLayoutRectsIgnoringEmptyRectsGeneratorContext context(rects, additionalOffset); |
+ generateLineBoxRects(context); |
+ |
+ addOutlineRectsForChildrenAndContinuations(rects, additionalOffset); |
+} |
+void LayoutInline::addOutlineRectsForChildrenAndContinuations(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const |
+{ |
addOutlineRectsForNormalChildren(rects, additionalOffset); |
+ addOutlineRectsForContinuations(rects, additionalOffset); |
+} |
+void LayoutInline::addOutlineRectsForContinuations(Vector<LayoutRect>& rects, const LayoutPoint& additionalOffset) const |
+{ |
if (LayoutBoxModelObject* continuation = this->continuation()) { |
if (continuation->isInline()) |
continuation->addOutlineRects(rects, additionalOffset + (continuation->containingBlock()->location() - containingBlock()->location())); |