Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1492)

Unified Diff: Source/core/rendering/RenderObject.cpp

Issue 64913004: Align RenderObject's containingBlock / container (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated after Elliott's review Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderObject.cpp
diff --git a/Source/core/rendering/RenderObject.cpp b/Source/core/rendering/RenderObject.cpp
index 48f44c93d88895e96845b5d88fb09b6f2817b06b..7841983ce86e5181e2a6e76c131dc2503cdeafed 100644
--- a/Source/core/rendering/RenderObject.cpp
+++ b/Source/core/rendering/RenderObject.cpp
@@ -796,18 +796,29 @@ void RenderObject::setLayerNeedsFullRepaintForPositionedMovementLayout()
toRenderLayerModelObject(this)->layer()->repainter().setRepaintStatus(NeedsFullRepaintForPositionedMovementLayout);
}
+RenderBlock* RenderObject::containerForFixedPosition(const RenderLayerModelObject* repaintContainer, bool* repaintContainerSkipped) const
+{
+ ASSERT(!repaintContainerSkipped || !*repaintContainerSkipped);
+ ASSERT(!isText());
+ ASSERT(style()->position() == FixedPosition);
+
+ RenderObject* ancestor = parent();
+ for (; ancestor && !ancestor->canContainFixedPositionObjects(); ancestor = ancestor->parent()) {
+ if (repaintContainerSkipped && ancestor == repaintContainer)
+ *repaintContainerSkipped = true;
+ }
+
+ ASSERT(!ancestor || !ancestor->isAnonymousBlock());
+ return toRenderBlock(ancestor);
+}
+
RenderBlock* RenderObject::containingBlock() const
{
RenderObject* o = parent();
if (!o && isRenderScrollbarPart())
o = toRenderScrollbarPart(this)->rendererOwningScrollbar();
if (!isText() && m_style->position() == FixedPosition) {
- while (o) {
- if (o->canContainFixedPositionObjects())
- break;
- o = o->parent();
- }
- ASSERT(!o || !o->isAnonymousBlock());
+ return containerForFixedPosition();
} else if (!isText() && m_style->position() == AbsolutePosition) {
while (o) {
// For relpositioned inlines, we return the nearest non-anonymous enclosing block. We don't try
@@ -817,17 +828,14 @@ RenderBlock* RenderObject::containingBlock() const
// inline directly.
if (o->style()->position() != StaticPosition && (!o->isInline() || o->isReplaced()))
break;
- if (o->isRenderView())
- break;
- if (o->hasTransform() && o->isRenderBlock())
+
+ if (o->canContainAbsolutePositionObjects())
break;
if (o->style()->hasInFlowPosition() && o->isInline() && !o->isReplaced()) {
o = o->containingBlock();
break;
}
- if (o->isSVGForeignObject()) //foreignObject is the containing block for contents inside it
- break;
o = o->parent();
}
@@ -2471,35 +2479,16 @@ RenderObject* RenderObject::container(const RenderLayerModelObject* repaintConta
EPosition pos = m_style->position();
if (pos == FixedPosition) {
- // container() can be called on an object that is not in the
- // tree yet. We don't call view() since it will assert if it
- // can't get back to the canvas. Instead we just walk as high up
- // as we can. If we're in the tree, we'll get the root. If we
- // aren't we'll get the root of our little subtree (most likely
- // we'll just return 0).
- // FIXME: The definition of view() has changed to not crawl up the render tree. It might
- // be safe now to use it.
- while (o && o->parent() && !(o->hasTransform() && o->isRenderBlock())) {
- // foreignObject is the containing block for its contents.
- if (o->isSVGForeignObject())
- break;
-
- // The render flow thread is the top most containing block
- // for the fixed positioned elements.
- if (o->isOutOfFlowRenderFlowThread())
+ return containerForFixedPosition(repaintContainer, repaintContainerSkipped);
+ } else if (pos == AbsolutePosition) {
+ // We technically just want our containing block, but
+ // we may not have one if we're part of an uninstalled
+ // subtree. We'll climb as high as we can though.
+ while (o) {
+ if (o->style()->position() != StaticPosition)
break;
- if (repaintContainerSkipped && o == repaintContainer)
- *repaintContainerSkipped = true;
-
- o = o->parent();
- }
- } else if (pos == AbsolutePosition) {
- // Same goes here. We technically just want our containing block, but
- // we may not have one if we're part of an uninstalled subtree. We'll
- // climb as high as we can though.
- while (o && o->style()->position() == StaticPosition && !o->isRenderView() && !(o->hasTransform() && o->isRenderBlock())) {
- if (o->isSVGForeignObject()) // foreignObject is the containing block for contents inside it
+ if (o->canContainFixedPositionObjects())
break;
if (repaintContainerSkipped && o == repaintContainer)
« no previous file with comments | « Source/core/rendering/RenderObject.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698