Index: Source/core/layout/LayoutObject.cpp |
diff --git a/Source/core/layout/LayoutObject.cpp b/Source/core/layout/LayoutObject.cpp |
index 39912284a41dacf2f68f32faac07fca4172e674a..93e6bc74adc349f12dc6d743d3b618a84ace6059 100644 |
--- a/Source/core/layout/LayoutObject.cpp |
+++ b/Source/core/layout/LayoutObject.cpp |
@@ -865,30 +865,43 @@ LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* |
return toLayoutBlock(ancestor); |
} |
-LayoutBlock* LayoutObject::containingBlock() const |
+LayoutBlock* LayoutObject::containingBlockForAbsolutePosition() const |
{ |
LayoutObject* o = parent(); |
- if (!o && isLayoutScrollbarPart()) |
- o = toLayoutScrollbarPart(this)->layoutObjectOwningScrollbar(); |
- if (!isTextOrSVGChild() && m_style->position() == FixedPosition) |
- return containerForFixedPosition(); |
- if (!isTextOrSVGChild() && m_style->position() == AbsolutePosition) { |
- while (o) { |
- if (o->style()->position() != StaticPosition && (!o->isInline() || o->isReplaced())) |
- break; |
+ while (o) { |
+ if (o->style()->position() != StaticPosition && (!o->isInline() || o->isReplaced())) |
+ break; |
- if (o->canContainFixedPositionObjects()) |
- break; |
+ if (o->canContainFixedPositionObjects()) |
+ break; |
- o = o->parent(); |
- } |
+ o = o->parent(); |
+ } |
- if (o && !o->isLayoutBlock()) |
- o = o->containingBlock(); |
+ if (o && !o->isLayoutBlock()) |
+ o = o->containingBlock(); |
- while (o && o->isAnonymousBlock()) |
- o = o->containingBlock(); |
- } else if (isColumnSpanAll()) { |
+ while (o && o->isAnonymousBlock()) |
+ o = o->containingBlock(); |
+ |
+ if (!o || !o->isLayoutBlock()) |
+ return nullptr; // This can still happen in case of an orphaned tree |
+ |
+ return toLayoutBlock(o); |
+} |
+ |
+LayoutBlock* LayoutObject::containingBlock() const |
+{ |
+ LayoutObject* o = parent(); |
+ if (!o && isLayoutScrollbarPart()) |
+ o = toLayoutScrollbarPart(this)->layoutObjectOwningScrollbar(); |
+ if (!isTextOrSVGChild()) { |
+ if (m_style->position() == FixedPosition) |
+ return containerForFixedPosition(); |
+ if (m_style->position() == AbsolutePosition) |
+ return containingBlockForAbsolutePosition(); |
+ } |
+ if (isColumnSpanAll()) { |
o = spannerPlaceholder()->containingBlock(); |
} else { |
while (o && ((o->isInline() && !o->isReplaced()) || !o->isLayoutBlock())) |