| 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()));
|
|
|