Index: Source/core/layout/LayoutObject.cpp |
diff --git a/Source/core/layout/LayoutObject.cpp b/Source/core/layout/LayoutObject.cpp |
index 9b76a8877e6b7d9990a3cbe82991cdb83e062057..124e2f699fdab7df99f7105047bfcdd691b0b4fe 100644 |
--- a/Source/core/layout/LayoutObject.cpp |
+++ b/Source/core/layout/LayoutObject.cpp |
@@ -857,7 +857,9 @@ LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* |
{ |
ASSERT(!paintInvalidationContainerSkipped || !*paintInvalidationContainerSkipped); |
ASSERT(!isText()); |
- ASSERT(style()->position() == FixedPosition); |
+ // Ideally we'd like to ASSERT here, but containingBlock(overrideStyle) can hit this |
+ // when calculating containingBlock if the style was changed to overrideStyle. |
+ // ASSERT(style()->position() == FixedPosition); |
LayoutObject* ancestor = parent(); |
for (; ancestor && !ancestor->canContainFixedPositionObjects(); ancestor = ancestor->parent()) { |
@@ -869,14 +871,15 @@ LayoutBlock* LayoutObject::containerForFixedPosition(const LayoutBoxModelObject* |
return toLayoutBlock(ancestor); |
} |
-LayoutBlock* LayoutObject::containingBlock() const |
+LayoutBlock* LayoutObject::containingBlock(const ComputedStyle* overrideStyle) const |
{ |
LayoutObject* o = parent(); |
if (!o && isLayoutScrollbarPart()) |
o = toLayoutScrollbarPart(this)->layoutObjectOwningScrollbar(); |
- if (!isTextOrSVGChild() && m_style->position() == FixedPosition) |
+ const ComputedStyle* style = overrideStyle ? overrideStyle : m_style.get(); |
+ if (!isTextOrSVGChild() && style->position() == FixedPosition) |
return containerForFixedPosition(); |
- if (!isTextOrSVGChild() && m_style->position() == AbsolutePosition) { |
+ if (!isTextOrSVGChild() && style->position() == AbsolutePosition) { |
while (o) { |
// For relpositioned inlines, we return the nearest non-anonymous enclosing block. We don't try |
// to return the inline itself. This allows us to avoid having a positioned objects |