| 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.
|
|
|