Index: Source/core/rendering/RenderBlock.cpp |
diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp |
index 32175d5e795d124659372246731a642a8e3fe8c3..4dc625a006d76555ae5979d23a8a9f9715abb689 100644 |
--- a/Source/core/rendering/RenderBlock.cpp |
+++ b/Source/core/rendering/RenderBlock.cpp |
@@ -362,21 +362,19 @@ void RenderBlock::styleDidChange(StyleDifference diff, const RenderStyle* oldSty |
ResourceLoadPriorityOptimizer::resourceLoadPriorityOptimizer()->addRenderObject(this); |
} |
-void RenderBlock::invalidateTreeAfterLayout(const PaintInvalidationState& paintInvalidationState) |
+void RenderBlock::invalidateTreeAfterLayout(const RenderLayerModelObject& invalidationContainer) |
{ |
// Note, we don't want to early out here using shouldCheckForInvalidationAfterLayout as |
// we have to make sure we go through any positioned objects as they won't be seen in |
// the normal tree walk. |
if (shouldCheckForPaintInvalidationAfterLayout()) |
- RenderBox::invalidateTreeAfterLayout(paintInvalidationState); |
+ RenderBox::invalidateTreeAfterLayout(invalidationContainer); |
- // Take care of positioned objects. This is required as PaintInvalidationState keeps a single clip rect. |
+ // 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(); |
- bool establishesNewPaintInvalidationContainer = isPaintInvalidationContainer(); |
- const RenderLayerModelObject& newPaintInvalidationContainer = *adjustCompositedContainerForSpecialAncestors(establishesNewPaintInvalidationContainer ? this : &paintInvalidationState.paintInvalidationContainer()); |
- PaintInvalidationState childPaintInvalidationState(paintInvalidationState, *this, newPaintInvalidationContainer); |
+ LayoutState state(*this, isTableRow() ? LayoutSize() : locationOffset()); |
for (TrackedRendererListHashSet::iterator it = positionedObjects->begin(); it != end; ++it) { |
RenderBox* box = *it; |
@@ -384,33 +382,22 @@ void RenderBlock::invalidateTreeAfterLayout(const PaintInvalidationState& paintI |
// so we can't pass our own repaint container along. |
const RenderLayerModelObject& repaintContainerForChild = *box->containerForPaintInvalidation(); |
- // If it's a new paint invalidation container, we won't have properly accumulated the offset into the |
- // PaintInvalidationState. |
- // FIXME: Teach PaintInvalidationState to handle this case. crbug.com/371485 |
- if (&repaintContainerForChild != newPaintInvalidationContainer) { |
- ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalidationState); |
- PaintInvalidationState disabledPaintInvalidationState(childPaintInvalidationState, *this, repaintContainerForChild); |
- box->invalidateTreeAfterLayout(disabledPaintInvalidationState); |
- continue; |
- } |
- |
// If the positioned renderer is absolutely positioned and it is inside |
- // a relatively positioned inline element, we need to account for |
- // the inline elements position in PaintInvalidationState. |
+ // a relatively positioend inline element, we need to account for |
+ // the inline elements position in LayoutState. |
if (box->style()->position() == AbsolutePosition) { |
RenderObject* container = box->container(&repaintContainerForChild, 0); |
if (container->isRelPositioned() && container->isRenderInline()) { |
- // FIXME: We should be able to use PaintInvalidationState for this. |
- // Currently, we will place absolutely positioned elements inside |
+ // 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 |
- ForceHorriblySlowRectMapping slowRectMapping(&childPaintInvalidationState); |
- PaintInvalidationState disabledPaintInvalidationState(childPaintInvalidationState, *this, repaintContainerForChild); |
- box->invalidateTreeAfterLayout(disabledPaintInvalidationState); |
+ ForceHorriblySlowRectMapping slowRectMapping(*this); |
+ box->invalidateTreeAfterLayout(repaintContainerForChild); |
continue; |
} |
} |
- box->invalidateTreeAfterLayout(childPaintInvalidationState); |
+ box->invalidateTreeAfterLayout(repaintContainerForChild); |
} |
} |
} |
@@ -4024,6 +4011,8 @@ void RenderBlock::updateFirstLetterStyle(RenderObject* firstLetterBlock, RenderO |
RenderStyle* pseudoStyle = styleForFirstLetter(firstLetterBlock, firstLetterContainer); |
ASSERT(firstLetter->isFloating() || firstLetter->isInline()); |
+ ForceHorriblySlowRectMapping slowRectMapping(*this); |
+ |
if (RenderStyle::stylePropagationDiff(firstLetter->style(), pseudoStyle) == Reattach) { |
// The first-letter renderer needs to be replaced. Create a new renderer of the right type. |
RenderBoxModelObject* newFirstLetter; |
@@ -4204,6 +4193,10 @@ void RenderBlock::updateFirstLetter() |
if (!currChild->isText() || currChild->isBR() || toRenderText(currChild)->isWordBreak()) |
return; |
+ // Our layout state is not valid for the repaints we are going to trigger by |
+ // adding and removing children of firstLetterContainer. |
+ ForceHorriblySlowRectMapping slowRectMapping(*this); |
+ |
createFirstLetterRenderer(firstLetterBlock, currChild, length); |
} |
@@ -4462,9 +4455,9 @@ void RenderBlock::absoluteQuads(Vector<FloatQuad>& quads, bool* wasFixed) const |
} |
} |
-LayoutRect RenderBlock::rectWithOutlineForPaintInvalidation(const RenderLayerModelObject* paintInvalidationContainer, LayoutUnit outlineWidth, const PaintInvalidationState* paintInvalidationState) const |
+LayoutRect RenderBlock::rectWithOutlineForPaintInvalidation(const RenderLayerModelObject* paintInvalidationContainer, LayoutUnit outlineWidth) const |
{ |
- LayoutRect r(RenderBox::rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineWidth, paintInvalidationState)); |
+ LayoutRect r(RenderBox::rectWithOutlineForPaintInvalidation(paintInvalidationContainer, outlineWidth)); |
if (isAnonymousBlockContinuation()) |
r.inflateY(collapsedMarginBefore()); // FIXME: This is wrong for block-flows that are horizontal. |
return r; |