Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(645)

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutMultiColumnSet.cpp

Issue 2737503002: Allow zero-height fragmentainers. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 const auto& row = m_fragmentainerGroups[index]; 81 const auto& row = m_fragmentainerGroups[index];
82 if (row.logicalTop() + row.logicalHeight() > blockOffset) 82 if (row.logicalTop() + row.logicalHeight() > blockOffset)
83 return row; 83 return row;
84 } 84 }
85 return m_fragmentainerGroups.last(); 85 return m_fragmentainerGroups.last();
86 } 86 }
87 87
88 LayoutUnit LayoutMultiColumnSet::pageLogicalHeightForOffset( 88 LayoutUnit LayoutMultiColumnSet::pageLogicalHeightForOffset(
89 LayoutUnit offsetInFlowThread) const { 89 LayoutUnit offsetInFlowThread) const {
90 const MultiColumnFragmentainerGroup& lastRow = lastFragmentainerGroup(); 90 const MultiColumnFragmentainerGroup& lastRow = lastFragmentainerGroup();
91 if (!lastRow.logicalHeight()) { 91 if (!lastRow.logicalHeight() && m_fragmentainerGroups.size() == 1) {
92 // In the first layout pass of an auto-height multicol container, height 92 // In the first layout pass of an auto-height multicol container, height
93 // isn't set. No need to perform the series of complicated dance steps below 93 // isn't set. No need to perform the series of complicated dance steps below
94 // to figure out that we should simply return 0. Bail now. 94 // to figure out that we should simply return 0. Bail now.
95 ASSERT(m_fragmentainerGroups.size() == 1);
96 return LayoutUnit(); 95 return LayoutUnit();
97 } 96 }
98 if (offsetInFlowThread >= 97 if (offsetInFlowThread >=
99 lastRow.logicalTopInFlowThread() + fragmentainerGroupCapacity(lastRow)) { 98 lastRow.logicalTopInFlowThread() + fragmentainerGroupCapacity(lastRow)) {
100 // The offset is outside the bounds of the fragmentainer groups that we have 99 // The offset is outside the bounds of the fragmentainer groups that we have
101 // established at this point. If we're nested inside another fragmentation 100 // established at this point. If we're nested inside another fragmentation
102 // context, we need to calculate the height on our own. 101 // context, we need to calculate the height on our own.
103 const LayoutMultiColumnFlowThread* flowThread = multiColumnFlowThread(); 102 const LayoutMultiColumnFlowThread* flowThread = multiColumnFlowThread();
104 if (FragmentationContext* enclosingFragmentationContext = 103 if (FragmentationContext* enclosingFragmentationContext =
105 flowThread->enclosingFragmentationContext()) { 104 flowThread->enclosingFragmentationContext()) {
(...skipping 24 matching lines...) Expand all
130 .logicalHeight(); 129 .logicalHeight();
131 } 130 }
132 131
133 LayoutUnit LayoutMultiColumnSet::pageRemainingLogicalHeightForOffset( 132 LayoutUnit LayoutMultiColumnSet::pageRemainingLogicalHeightForOffset(
134 LayoutUnit offsetInFlowThread, 133 LayoutUnit offsetInFlowThread,
135 PageBoundaryRule pageBoundaryRule) const { 134 PageBoundaryRule pageBoundaryRule) const {
136 const MultiColumnFragmentainerGroup& row = 135 const MultiColumnFragmentainerGroup& row =
137 fragmentainerGroupAtFlowThreadOffset(offsetInFlowThread, 136 fragmentainerGroupAtFlowThreadOffset(offsetInFlowThread,
138 pageBoundaryRule); 137 pageBoundaryRule);
139 LayoutUnit pageLogicalHeight = row.logicalHeight(); 138 LayoutUnit pageLogicalHeight = row.logicalHeight();
140 // It's not allowed to call this method if the height is unknown.
141 DCHECK(pageLogicalHeight);
142 LayoutUnit pageLogicalBottom = 139 LayoutUnit pageLogicalBottom =
143 row.columnLogicalTopForOffset(offsetInFlowThread) + pageLogicalHeight; 140 row.columnLogicalTopForOffset(offsetInFlowThread) + pageLogicalHeight;
144 LayoutUnit remainingLogicalHeight = pageLogicalBottom - offsetInFlowThread; 141 LayoutUnit remainingLogicalHeight = pageLogicalBottom - offsetInFlowThread;
145 142
146 if (pageBoundaryRule == AssociateWithFormerPage) { 143 if (pageBoundaryRule == AssociateWithFormerPage) {
147 // An offset exactly at a column boundary will act as being part of the 144 // An offset exactly at a column boundary will act as being part of the
148 // former column in question (i.e. no remaining space), rather than being 145 // former column in question (i.e. no remaining space), rather than being
149 // part of the latter (i.e. one whole column length of remaining space). 146 // part of the latter (i.e. one whole column length of remaining space).
150 remainingLogicalHeight = intMod(remainingLogicalHeight, pageLogicalHeight); 147 remainingLogicalHeight = intMod(remainingLogicalHeight, pageLogicalHeight);
151 } else if (!remainingLogicalHeight) { 148 } else if (!remainingLogicalHeight) {
152 // When pageBoundaryRule is AssociateWithLatterPage, we should never return 149 // When pageBoundaryRule is AssociateWithLatterPage, we shouldn't just
153 // 0, because if there's no space left, it means that we should be at a 150 // return 0 if there's no space left, because in that case we're at a
154 // column boundary, in which case we should return the amount of space 151 // column boundary, in which case we should return the amount of space
155 // remaining in the *next* column. But this is not true if the offset is 152 // remaining in the *next* column. Note that the page height itself may be
156 // "infinite" (saturated), so allow this to happen in that case. 153 // 0, though.
157 ASSERT(offsetInFlowThread.mightBeSaturated());
158 remainingLogicalHeight = pageLogicalHeight; 154 remainingLogicalHeight = pageLogicalHeight;
159 } 155 }
160 return remainingLogicalHeight; 156 return remainingLogicalHeight;
161 } 157 }
162 158
163 bool LayoutMultiColumnSet::isPageLogicalHeightKnown() const { 159 bool LayoutMultiColumnSet::isPageLogicalHeightKnown() const {
164 return firstFragmentainerGroup().logicalHeight(); 160 return firstFragmentainerGroup().logicalHeight();
165 } 161 }
166 162
167 bool LayoutMultiColumnSet::newFragmentainerGroupsAllowed() const { 163 bool LayoutMultiColumnSet::newFragmentainerGroupsAllowed() const {
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 // Now add in column rule bounds, if present. 579 // Now add in column rule bounds, if present.
584 Vector<LayoutRect> columnRuleBounds; 580 Vector<LayoutRect> columnRuleBounds;
585 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) { 581 if (computeColumnRuleBounds(LayoutPoint(), columnRuleBounds)) {
586 for (auto& bound : columnRuleBounds) 582 for (auto& bound : columnRuleBounds)
587 blockFlowBounds.unite(bound); 583 blockFlowBounds.unite(bound);
588 } 584 }
589 return blockFlowBounds; 585 return blockFlowBounds;
590 } 586 }
591 587
592 } // namespace blink 588 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698