Index: third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
index 30551e504562a5c89f266da9890ad12836c0f64b..1ce8fc5cc5057ca7b94b750d9a3221d274a85a17 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutMultiColumnFlowThread.cpp |
@@ -307,7 +307,7 @@ LayoutUnit LayoutMultiColumnFlowThread::maxColumnLogicalHeight() const |
LayoutUnit LayoutMultiColumnFlowThread::tallestUnbreakableLogicalHeight(LayoutUnit offsetInFlowThread) const |
{ |
- if (LayoutMultiColumnSet* multicolSet = columnSetAtBlockOffset(offsetInFlowThread)) |
+ if (LayoutMultiColumnSet* multicolSet = columnSetAtBlockOffset(offsetInFlowThread, AssociateWithLatterPage)) |
return multicolSet->tallestUnbreakableLogicalHeight(); |
return LayoutUnit(); |
} |
@@ -336,7 +336,7 @@ LayoutSize LayoutMultiColumnFlowThread::flowThreadTranslationAtOffset(LayoutUnit |
{ |
if (!hasValidColumnSetInfo()) |
return LayoutSize(0, 0); |
- LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread); |
+ LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread, rule); |
if (!columnSet) |
return LayoutSize(0, 0); |
return columnSet->flowThreadTranslationAtOffset(offsetInFlowThread, rule, mode); |
@@ -374,15 +374,16 @@ LayoutPoint LayoutMultiColumnFlowThread::visualPointToFlowThreadPoint(const Layo |
int LayoutMultiColumnFlowThread::inlineBlockBaseline(LineDirectionMode lineDirection) const |
{ |
LayoutUnit baselineInFlowThread = LayoutUnit(LayoutFlowThread::inlineBlockBaseline(lineDirection)); |
- LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(baselineInFlowThread); |
+ LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(baselineInFlowThread, AssociateWithLatterPage); |
if (!columnSet) |
return baselineInFlowThread.toInt(); |
return (baselineInFlowThread - columnSet->pageLogicalTopForOffset(baselineInFlowThread)).ceil(); |
} |
-LayoutMultiColumnSet* LayoutMultiColumnFlowThread::columnSetAtBlockOffset(LayoutUnit offset) const |
+LayoutMultiColumnSet* LayoutMultiColumnFlowThread::columnSetAtBlockOffset(LayoutUnit offset, PageBoundaryRule pageBoundaryRule) const |
{ |
- if (LayoutMultiColumnSet* columnSet = m_lastSetWorkedOn) { |
+ LayoutMultiColumnSet* columnSet = m_lastSetWorkedOn; |
+ if (columnSet) { |
// Layout in progress. We are calculating the set heights as we speak, so the column set range |
// information is not up to date. |
while (columnSet->logicalTopInFlowThread() > offset) { |
@@ -394,22 +395,29 @@ LayoutMultiColumnSet* LayoutMultiColumnFlowThread::columnSetAtBlockOffset(Layout |
break; |
columnSet = previousSet; |
} |
- return columnSet; |
+ } else { |
+ DCHECK(!m_columnSetsInvalidated); |
+ if (m_multiColumnSetList.isEmpty()) |
+ return nullptr; |
+ if (offset < LayoutUnit()) |
+ return m_multiColumnSetList.first(); |
+ |
+ MultiColumnSetSearchAdapter adapter(offset); |
+ m_multiColumnSetIntervalTree.allOverlapsWithAdapter<MultiColumnSetSearchAdapter>(adapter); |
+ |
+ // If no set was found, the offset is in the flow thread overflow. |
+ if (!adapter.result() && !m_multiColumnSetList.isEmpty()) |
+ return m_multiColumnSetList.last(); |
+ columnSet = adapter.result(); |
} |
- |
- ASSERT(!m_columnSetsInvalidated); |
- if (m_multiColumnSetList.isEmpty()) |
- return nullptr; |
- if (offset < LayoutUnit()) |
- return m_multiColumnSetList.first(); |
- |
- MultiColumnSetSearchAdapter adapter(offset); |
- m_multiColumnSetIntervalTree.allOverlapsWithAdapter<MultiColumnSetSearchAdapter>(adapter); |
- |
- // If no set was found, the offset is in the flow thread overflow. |
- if (!adapter.result() && !m_multiColumnSetList.isEmpty()) |
- return m_multiColumnSetList.last(); |
- return adapter.result(); |
+ if (pageBoundaryRule == AssociateWithFormerPage && columnSet && offset == columnSet->logicalTopInFlowThread()) { |
+ // The column set that we found starts at the exact same flow thread offset as we specified. |
+ // Since we are to associate offsets at boundaries with the former fragmentainer, the |
+ // fragmentainer we're looking for is in the previous column set. |
+ if (LayoutMultiColumnSet* previousSet = columnSet->previousSiblingMultiColumnSet()) |
+ return previousSet; |
+ } |
+ return columnSet; |
} |
void LayoutMultiColumnFlowThread::layoutColumns(SubtreeLayoutScope& layoutScope) |
@@ -515,12 +523,7 @@ void LayoutMultiColumnFlowThread::appendNewFragmentainerGroupIfNeeded(LayoutUnit |
// Its height is indefinite for now. |
return; |
} |
- // TODO(mstensho): If pageBoundaryRule is AssociateWithFormerPage, offsetInFlowThread is an |
- // endpoint-exclusive offset, i.e. the offset just after the bottom of some object. So, ideally, |
- // columnSetAtBlockOffset() should be informed about this (i.e. take a PageBoundaryRule |
- // argument). This is not the only place with this issue; see also |
- // pageRemainingLogicalHeightForOffset(). |
- LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread); |
+ LayoutMultiColumnSet* columnSet = columnSetAtBlockOffset(offsetInFlowThread, pageBoundaryRule); |
if (columnSet->isInitialHeightCalculated()) { |
// We only insert additional fragmentainer groups in the initial layout pass. We only want |
// to balance columns in the last fragmentainer group (if we need to balance at all), so we |