Chromium Code Reviews| Index: Source/core/rendering/RenderBlock.cpp |
| diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp |
| index 42a94250ded7cba0f6f0ceca5bf900c3a6666e4f..25c4d2a6ee51a933700af5e15b0dabfed9b9ada1 100644 |
| --- a/Source/core/rendering/RenderBlock.cpp |
| +++ b/Source/core/rendering/RenderBlock.cpp |
| @@ -360,37 +360,40 @@ void RenderBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldSty |
| ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addRenderObject(this); |
| } |
| -void RenderBlock::repaintTreeAfterLayout() |
| +void RenderBlock::repaintTreeAfterLayout(const RenderLayerModelObject& repaintContainer) |
| { |
| if (!shouldCheckForInvalidationAfterLayout()) |
| return; |
| - RenderBox::repaintTreeAfterLayout(); |
| + RenderBox::repaintTreeAfterLayout(repaintContainer); |
| // Take care of positioned objects. This is required as LayoutState keeps a single clip rect. |
| if (TrackedRendererListHashSet* positionedObjects = this->positionedObjects()) { |
| TrackedRendererListHashSet::iterator end = positionedObjects->end(); |
| LayoutStateMaintainer statePusher(*this, isTableRow() ? LayoutSize() : locationOffset()); |
| - |
| for (TrackedRendererListHashSet::iterator it = positionedObjects->begin(); it != end; ++it) { |
| - RenderBox* obj = *it; |
| + RenderBox* box = *it; |
| + |
| + // One of the renderers we're skipping over here may be the child's repaint container, |
| + // so we can't pass our own repaint container along. |
| + const RenderLayerModelObject& repaintContainerForChild = *box->containerForRepaint(); |
|
Julien - ping for review
2014/05/16 10:21:06
I don't think Ojan's optimization would work here
|
| // If the positioned renderer is absolutely positioned and it is inside |
| // a relatively positioend inline element, we need to account for |
| // the inline elements position in LayoutState. |
| - if (obj->style()->position() == AbsolutePosition) { |
| - RenderObject* o = obj->container(obj->containerForRepaint(), 0); |
| - if (o->isInFlowPositioned() && o->isRenderInline()) { |
| + if (box->style()->position() == AbsolutePosition) { |
| + RenderObject* container = box->container(&repaintContainerForChild, 0); |
| + if (container->isInFlowPositioned() && container->isRenderInline()) { |
| // FIXME: We should be able to use layout-state for this. |
| // Currently, we will place absolutly positioned elements inside |
| // relatively positioned inline blocks in the wrong location. crbug.com/371485 |
| LayoutStateDisabler disable(*this); |
| - obj->repaintTreeAfterLayout(); |
| + box->repaintTreeAfterLayout(repaintContainerForChild); |
| continue; |
| } |
| } |
| - obj->repaintTreeAfterLayout(); |
| + box->repaintTreeAfterLayout(repaintContainerForChild); |
| } |
| } |
| } |