Index: Source/core/rendering/RenderBlock.cpp |
diff --git a/Source/core/rendering/RenderBlock.cpp b/Source/core/rendering/RenderBlock.cpp |
index b6adb87eec591bab10914ea26fbd52b4b0640858..8923ae033b6c5f6aefe3272b24725b2f82a283fa 100644 |
--- a/Source/core/rendering/RenderBlock.cpp |
+++ b/Source/core/rendering/RenderBlock.cpp |
@@ -4849,6 +4849,93 @@ RenderBlockFlow* RenderBlock::createAnonymousColumnSpanWithParentRenderer(const |
return newBox; |
} |
+bool RenderBlock::recalcChildOverflowAfterStyleChange() |
+{ |
+ ASSERT(childNeedsOverflowRecalcAfterStyleChange()); |
+ setChildNeedsOverflowRecalcAfterStyleChange(false); |
+ |
+ bool childrenOverflowChanged = false; |
+ |
+ if (childrenInline()) { |
+ ListHashSet<RootInlineBox*> lineBoxes; |
+ for (InlineWalker walker(this); !walker.atEnd(); walker.advance()) { |
+ RenderObject* renderer = walker.current(); |
+ if (renderer->isOutOfFlowPositioned() || !renderer->needsOverflowRecalcAfterStyleChange()) |
+ continue; |
+ |
+ RenderBlock* block = toRenderBlock(renderer); |
+ if (!block->recalcOverflowAfterStyleChange()) |
+ continue; |
+ |
+ childrenOverflowChanged = true; |
+ if (InlineBox* inlineBoxWrapper = block->inlineBoxWrapper()) |
+ lineBoxes.add(&inlineBoxWrapper->root()); |
+ } |
+ |
+ // FIXME: Glyph overflow will get lost in this case, but not really a big deal. |
+ GlyphOverflowAndFallbackFontsMap textBoxDataMap; |
+ for (ListHashSet<RootInlineBox*>::const_iterator it = lineBoxes.begin(); it != lineBoxes.end(); ++it) { |
+ RootInlineBox* box = *it; |
+ box->computeOverflow(box->lineTop(), box->lineBottom(), textBoxDataMap); |
+ } |
+ } else { |
+ for (RenderBox* box = firstChildBox(); box; box = box->nextSiblingBox()) { |
+ if (box->isOutOfFlowPositioned() || !box->needsOverflowRecalcAfterStyleChange()) |
+ continue; |
+ |
+ RenderBlock* block = toRenderBlock(box); |
+ if (!block->recalcOverflowAfterStyleChange()) |
+ continue; |
ojan
2014/04/19 02:19:30
These 6 lines of code are identical to the ones in
trchen
2014/04/19 05:08:21
Sounds reasonable to me. Will do it.
|
+ |
+ childrenOverflowChanged = true; |
+ } |
+ } |
+ |
+ TrackedRendererListHashSet* positionedDescendants = positionedObjects(); |
+ if (!positionedDescendants) |
+ return childrenOverflowChanged; |
+ |
+ TrackedRendererListHashSet::iterator end = positionedDescendants->end(); |
+ for (TrackedRendererListHashSet::iterator it = positionedDescendants->begin(); it != end; ++it) { |
+ RenderBox* box = *it; |
+ |
+ if (!box->needsOverflowRecalcAfterStyleChange()) |
+ continue; |
+ RenderBlock* block = toRenderBlock(box); |
+ if (!block->recalcOverflowAfterStyleChange() || box->style()->position() == FixedPosition) |
+ continue; |
+ |
+ childrenOverflowChanged = true; |
+ } |
+ return childrenOverflowChanged; |
+} |
+ |
+bool RenderBlock::recalcOverflowAfterStyleChange() |
+{ |
+ ASSERT(needsOverflowRecalcAfterStyleChange()); |
+ |
+ bool childrenOverflowChanged = false; |
+ if (childNeedsOverflowRecalcAfterStyleChange()) |
+ childrenOverflowChanged = recalcChildOverflowAfterStyleChange(); |
+ |
+ if (!selfNeedsOverflowRecalcAfterStyleChange() && !childrenOverflowChanged) |
+ return false; |
+ |
+ setSelfNeedsOverflowRecalcAfterStyleChange(false); |
+ // If the current block needs layout, overflow will be recalculated during |
+ // layout time anyway. We can safely exit here. |
+ if (needsLayout()) |
+ return false; |
+ |
+ LayoutUnit oldClientAfterEdge = hasRenderOverflow() ? m_overflow->layoutClientAfterEdge() : clientLogicalBottom(); |
+ computeOverflow(oldClientAfterEdge, true); |
+ |
+ if (hasOverflowClip()) |
+ layer()->scrollableArea()->updateAfterOverflowRecalc(); |
+ |
+ return !hasOverflowClip(); |
+} |
+ |
#ifndef NDEBUG |
void RenderBlock::checkPositionedObjectsNeedLayout() |
{ |