Index: Source/core/rendering/RenderMultiColumnFlowThread.cpp |
diff --git a/Source/core/rendering/RenderMultiColumnFlowThread.cpp b/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
index bfe606ee19699df4ef2c4e7e8d5c0a31d6618872..fff2e8bd0c4b7195193de545668d0879ed6b8174 100644 |
--- a/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
+++ b/Source/core/rendering/RenderMultiColumnFlowThread.cpp |
@@ -356,56 +356,51 @@ bool RenderMultiColumnFlowThread::hasColumnSpanner(const RenderObject* renderer) |
return m_spannerMap.get(renderer); |
} |
-LayoutUnit RenderMultiColumnFlowThread::spannerLogicalTopAdjustment(RenderBox* renderer, LayoutUnit logicalTop) const |
+LayoutUnit RenderMultiColumnFlowThread::enterColumnSpanner(RenderBox* renderer, LayoutUnit logicalTop) |
{ |
- ASSERT(m_spannerMap.get(renderer) == m_lastSetWorkedOn); |
- RenderMultiColumnSet* previousSet = m_lastSetWorkedOn->previousSiblingMultiColumnSet(); |
- if (!previousSet || previousSet->isRenderMultiColumnSpannerSet() || !previousSet->pageLogicalHeight()) |
- return LayoutUnit(); |
- |
- RenderBlock* cb = renderer->containingBlock(); |
- LayoutUnit logicalTopInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalTop; |
- LayoutUnit columnLogicalTopInFlowThread = previousSet->pageLogicalTopForOffset(logicalTopInFlowThread); |
- if (columnLogicalTopInFlowThread == logicalTopInFlowThread) |
- return LayoutUnit(); // Exactly at the top of a column. No need to adjust. |
- return columnLogicalTopInFlowThread + previousSet->pageLogicalHeight() - logicalTopInFlowThread; |
-} |
- |
-void RenderMultiColumnFlowThread::enterColumnSpanner(RenderBox* renderer, LayoutUnit& logicalTop) |
-{ |
- ASSERT(m_spannerMap.get(renderer)); |
ASSERT(renderer->isDescendantOf(this)); |
- |
- if (m_spannerMap.get(renderer) == m_lastSetWorkedOn) { |
+ RenderMultiColumnSpannerSet* spannerSet = m_spannerMap.get(renderer); |
+ ASSERT(spannerSet); |
+ RenderMultiColumnSet* previousSet = spannerSet->previousSiblingMultiColumnSet(); |
+ if (!previousSet) { |
// The first set is entered at the beginning of flow thread layout. If the first set happens |
// to be a spanner, we have nothing more to do here. |
- ASSERT(!m_lastSetWorkedOn->previousSiblingMultiColumnSet()); |
- return; |
+ return LayoutUnit(); |
} |
- RenderMultiColumnSet* previousSet = m_lastSetWorkedOn; |
- m_lastSetWorkedOn = m_lastSetWorkedOn->nextSiblingMultiColumnSet(); |
- ASSERT(m_lastSetWorkedOn); |
- ASSERT(m_lastSetWorkedOn->isRenderMultiColumnSpannerSet()); |
- ASSERT(toRenderMultiColumnSpannerSet(m_lastSetWorkedOn)->renderer() == renderer); |
- |
- logicalTop += spannerLogicalTopAdjustment(renderer, logicalTop); |
RenderBlock* cb = renderer->containingBlock(); |
LayoutUnit logicalTopInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalTop; |
+ LayoutUnit adjustment; |
+ if (!previousSet->isRenderMultiColumnSpannerSet() && previousSet->pageLogicalHeight()) { |
+ // Pad flow thread offset to a column boundary, so that contents that's supposed to come |
+ // after the spanner (or the spanner itself) don't bleed into the column preceding the |
+ // spanner. |
+ LayoutUnit columnLogicalTopInFlowThread = previousSet->pageLogicalTopForOffset(logicalTopInFlowThread); |
+ if (columnLogicalTopInFlowThread != logicalTopInFlowThread) { |
+ adjustment = columnLogicalTopInFlowThread + previousSet->pageLogicalHeight() - logicalTopInFlowThread; |
+ logicalTopInFlowThread += adjustment; |
+ } |
+ } |
+ |
if (!previousSet->isRenderMultiColumnSpannerSet()) |
previousSet->endFlow(logicalTopInFlowThread); |
- m_lastSetWorkedOn->beginFlow(logicalTopInFlowThread); |
+ spannerSet->beginFlow(logicalTopInFlowThread); |
+ |
+ m_lastSetWorkedOn = spannerSet; |
+ return adjustment; |
} |
void RenderMultiColumnFlowThread::leaveColumnSpanner(RenderBox* renderer, LayoutUnit logicalBottom) |
{ |
+ ASSERT(m_lastSetWorkedOn == m_spannerMap.get(renderer)); |
+ |
RenderBlock* cb = renderer->containingBlock(); |
LayoutUnit logicalBottomInFlowThread = cb->offsetFromLogicalTopOfFirstPage() + logicalBottom; |
m_lastSetWorkedOn->endFlow(logicalBottomInFlowThread); |
RenderMultiColumnSet* nextSet = m_lastSetWorkedOn->nextSiblingMultiColumnSet(); |
- if (nextSet && !nextSet->isRenderMultiColumnSpannerSet()) { |
+ if (nextSet) { |
m_lastSetWorkedOn = nextSet; |
- if (m_lastSetWorkedOn) |
+ if (!m_lastSetWorkedOn->isRenderMultiColumnSpannerSet()) |
m_lastSetWorkedOn->beginFlow(logicalBottomInFlowThread); |
} |
} |
@@ -501,6 +496,16 @@ void RenderMultiColumnFlowThread::flowThreadDescendantWillBeRemoved(RenderObject |
} |
} |
+void RenderMultiColumnFlowThread::flowThreadDescendantStyleDidChange(RenderObject* descendant) |
+{ |
+ ASSERT(descendant->isDescendantOf(this)); |
+ if (RenderMultiColumnSpannerSet* spanner = m_spannerMap.get(descendant)) { |
+ RefPtr<RenderStyle> newStyle = RenderStyle::clone(style()); |
+ spanner->updateMarginProperties(newStyle.get(), descendant); |
+ setStyle(newStyle); |
+ } |
+} |
+ |
void RenderMultiColumnFlowThread::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, LogicalExtentComputedValues& computedValues) const |
{ |
// We simply remain at our intrinsic height. |