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

Side by Side Diff: Source/core/layout/LayoutMultiColumnFlowThread.cpp

Issue 1162383003: C++11: Replace 0 with nullptr where applicable in layout code. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add one more file. Created 5 years, 6 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 14 matching lines...) Expand all
25 25
26 #include "config.h" 26 #include "config.h"
27 #include "core/layout/LayoutMultiColumnFlowThread.h" 27 #include "core/layout/LayoutMultiColumnFlowThread.h"
28 28
29 #include "core/layout/LayoutMultiColumnSet.h" 29 #include "core/layout/LayoutMultiColumnSet.h"
30 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" 30 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h"
31 31
32 namespace blink { 32 namespace blink {
33 33
34 LayoutMultiColumnFlowThread::LayoutMultiColumnFlowThread() 34 LayoutMultiColumnFlowThread::LayoutMultiColumnFlowThread()
35 : m_lastSetWorkedOn(0) 35 : m_lastSetWorkedOn(nullptr)
36 , m_columnCount(1) 36 , m_columnCount(1)
37 , m_columnHeightAvailable(0) 37 , m_columnHeightAvailable(0)
38 , m_inBalancingPass(false) 38 , m_inBalancingPass(false)
39 , m_needsColumnHeightsRecalculation(false) 39 , m_needsColumnHeightsRecalculation(false)
40 , m_progressionIsInline(true) 40 , m_progressionIsInline(true)
41 , m_isBeingEvacuated(false) 41 , m_isBeingEvacuated(false)
42 { 42 {
43 setIsInsideFlowThread(true); 43 setIsInsideFlowThread(true);
44 } 44 }
45 45
46 LayoutMultiColumnFlowThread::~LayoutMultiColumnFlowThread() 46 LayoutMultiColumnFlowThread::~LayoutMultiColumnFlowThread()
47 { 47 {
48 } 48 }
49 49
50 LayoutMultiColumnFlowThread* LayoutMultiColumnFlowThread::createAnonymous(Docume nt& document, const ComputedStyle& parentStyle) 50 LayoutMultiColumnFlowThread* LayoutMultiColumnFlowThread::createAnonymous(Docume nt& document, const ComputedStyle& parentStyle)
51 { 51 {
52 LayoutMultiColumnFlowThread* layoutObject = new LayoutMultiColumnFlowThread( ); 52 LayoutMultiColumnFlowThread* layoutObject = new LayoutMultiColumnFlowThread( );
53 layoutObject->setDocumentForAnonymous(&document); 53 layoutObject->setDocumentForAnonymous(&document);
54 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay(parent Style, BLOCK)); 54 layoutObject->setStyle(ComputedStyle::createAnonymousStyleWithDisplay(parent Style, BLOCK));
55 return layoutObject; 55 return layoutObject;
56 } 56 }
57 57
58 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::firstMultiColumnSet() const 58 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::firstMultiColumnSet() const
59 { 59 {
60 for (LayoutObject* sibling = nextSibling(); sibling; sibling = sibling->next Sibling()) { 60 for (LayoutObject* sibling = nextSibling(); sibling; sibling = sibling->next Sibling()) {
61 if (sibling->isLayoutMultiColumnSet()) 61 if (sibling->isLayoutMultiColumnSet())
62 return toLayoutMultiColumnSet(sibling); 62 return toLayoutMultiColumnSet(sibling);
63 } 63 }
64 return 0; 64 return nullptr;
65 } 65 }
66 66
67 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::lastMultiColumnSet() const 67 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::lastMultiColumnSet() const
68 { 68 {
69 for (LayoutObject* sibling = multiColumnBlockFlow()->lastChild(); sibling; s ibling = sibling->previousSibling()) { 69 for (LayoutObject* sibling = multiColumnBlockFlow()->lastChild(); sibling; s ibling = sibling->previousSibling()) {
70 if (sibling->isLayoutMultiColumnSet()) 70 if (sibling->isLayoutMultiColumnSet())
71 return toLayoutMultiColumnSet(sibling); 71 return toLayoutMultiColumnSet(sibling);
72 } 72 }
73 return 0; 73 return nullptr;
74 } 74 }
75 75
76 static LayoutObject* nextInPreOrderAfterChildrenSkippingOutOfFlow(LayoutMultiCol umnFlowThread* flowThread, LayoutObject* descendant) 76 static LayoutObject* nextInPreOrderAfterChildrenSkippingOutOfFlow(LayoutMultiCol umnFlowThread* flowThread, LayoutObject* descendant)
77 { 77 {
78 ASSERT(descendant->isDescendantOf(flowThread)); 78 ASSERT(descendant->isDescendantOf(flowThread));
79 LayoutObject* object = descendant->nextInPreOrderAfterChildren(flowThread); 79 LayoutObject* object = descendant->nextInPreOrderAfterChildren(flowThread);
80 while (object) { 80 while (object) {
81 // Walk through the siblings and find the first one which is either in-f low or has this 81 // Walk through the siblings and find the first one which is either in-f low or has this
82 // flow thread as its containing block flow thread. 82 // flow thread as its containing block flow thread.
83 if (!object->isOutOfFlowPositioned()) 83 if (!object->isOutOfFlowPositioned())
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 // of them contains then. 120 // of them contains then.
121 ASSERT(sibling->isLayoutMultiColumnSpannerPlaceholder()); 121 ASSERT(sibling->isLayoutMultiColumnSpannerPlaceholder());
122 LayoutBox* spanner = toLayoutMultiColumnSpannerPlaceholder(sibling)->layoutO bjectInFlowThread(); 122 LayoutBox* spanner = toLayoutMultiColumnSpannerPlaceholder(sibling)->layoutO bjectInFlowThread();
123 return nextInPreOrderAfterChildrenSkippingOutOfFlow(multicolSet->multiColumn FlowThread(), spanner); 123 return nextInPreOrderAfterChildrenSkippingOutOfFlow(multicolSet->multiColumn FlowThread(), spanner);
124 } 124 }
125 125
126 static LayoutObject* lastLayoutObjectInSet(LayoutMultiColumnSet* multicolSet) 126 static LayoutObject* lastLayoutObjectInSet(LayoutMultiColumnSet* multicolSet)
127 { 127 {
128 LayoutBox* sibling = multicolSet->nextSiblingMultiColumnBox(); 128 LayoutBox* sibling = multicolSet->nextSiblingMultiColumnBox();
129 if (!sibling) 129 if (!sibling)
130 return 0; // By right we should return lastLeafChild() here, but the cal ler doesn't care, so just return 0. 130 return nullptr; // By right we should return lastLeafChild() here, but t he caller doesn't care, so just return 0.
131 // Adjacent column content sets should not occur. We would have no way of fi guring out what each 131 // Adjacent column content sets should not occur. We would have no way of fi guring out what each
132 // of them contains then. 132 // of them contains then.
133 ASSERT(sibling->isLayoutMultiColumnSpannerPlaceholder()); 133 ASSERT(sibling->isLayoutMultiColumnSpannerPlaceholder());
134 LayoutBox* spanner = toLayoutMultiColumnSpannerPlaceholder(sibling)->layoutO bjectInFlowThread(); 134 LayoutBox* spanner = toLayoutMultiColumnSpannerPlaceholder(sibling)->layoutO bjectInFlowThread();
135 return previousInPreOrderSkippingOutOfFlow(multicolSet->multiColumnFlowThrea d(), spanner); 135 return previousInPreOrderSkippingOutOfFlow(multicolSet->multiColumnFlowThrea d(), spanner);
136 } 136 }
137 137
138 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::mapDescendantToColumnSet(Layo utObject* layoutObject) const 138 LayoutMultiColumnSet* LayoutMultiColumnFlowThread::mapDescendantToColumnSet(Layo utObject* layoutObject) const
139 { 139 {
140 ASSERT(!containingColumnSpannerPlaceholder(layoutObject)); // should not be used for spanners or content inside them. 140 ASSERT(!containingColumnSpannerPlaceholder(layoutObject)); // should not be used for spanners or content inside them.
141 ASSERT(layoutObject != this); 141 ASSERT(layoutObject != this);
142 ASSERT(layoutObject->isDescendantOf(this)); 142 ASSERT(layoutObject->isDescendantOf(this));
143 ASSERT(layoutObject->containingBlock()->isDescendantOf(this)); // Out-of-flo w objects don't belong in column sets. 143 ASSERT(layoutObject->containingBlock()->isDescendantOf(this)); // Out-of-flo w objects don't belong in column sets.
144 LayoutMultiColumnSet* multicolSet = firstMultiColumnSet(); 144 LayoutMultiColumnSet* multicolSet = firstMultiColumnSet();
145 if (!multicolSet) 145 if (!multicolSet)
146 return 0; 146 return nullptr;
147 if (!multicolSet->nextSiblingMultiColumnSet()) 147 if (!multicolSet->nextSiblingMultiColumnSet())
148 return multicolSet; 148 return multicolSet;
149 149
150 // This is potentially SLOW! But luckily very uncommon. You would have to dy namically insert a 150 // This is potentially SLOW! But luckily very uncommon. You would have to dy namically insert a
151 // spanner into the middle of column contents to need this. 151 // spanner into the middle of column contents to need this.
152 for (; multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) { 152 for (; multicolSet; multicolSet = multicolSet->nextSiblingMultiColumnSet()) {
153 LayoutObject* firstLayoutObject = firstLayoutObjectInSet(multicolSet); 153 LayoutObject* firstLayoutObject = firstLayoutObjectInSet(multicolSet);
154 LayoutObject* lastLayoutObject = lastLayoutObjectInSet(multicolSet); 154 LayoutObject* lastLayoutObject = lastLayoutObjectInSet(multicolSet);
155 ASSERT(firstLayoutObject); 155 ASSERT(firstLayoutObject);
156 156
157 for (LayoutObject* walker = firstLayoutObject; walker; walker = walker-> nextInPreOrder(this)) { 157 for (LayoutObject* walker = firstLayoutObject; walker; walker = walker-> nextInPreOrder(this)) {
158 if (walker == layoutObject) 158 if (walker == layoutObject)
159 return multicolSet; 159 return multicolSet;
160 if (walker == lastLayoutObject) 160 if (walker == lastLayoutObject)
161 break; 161 break;
162 } 162 }
163 } 163 }
164 164
165 return 0; 165 return nullptr;
166 } 166 }
167 167
168 LayoutMultiColumnSpannerPlaceholder* LayoutMultiColumnFlowThread::containingColu mnSpannerPlaceholder(const LayoutObject* descendant) const 168 LayoutMultiColumnSpannerPlaceholder* LayoutMultiColumnFlowThread::containingColu mnSpannerPlaceholder(const LayoutObject* descendant) const
169 { 169 {
170 ASSERT(descendant->isDescendantOf(this)); 170 ASSERT(descendant->isDescendantOf(this));
171 171
172 // Before we spend time on searching the ancestry, see if there's a quick wa y to determine 172 // Before we spend time on searching the ancestry, see if there's a quick wa y to determine
173 // whether there might be any spanners at all. 173 // whether there might be any spanners at all.
174 LayoutBox* firstBox = firstMultiColumnBox(); 174 LayoutBox* firstBox = firstMultiColumnBox();
175 if (!firstBox || (firstBox == lastMultiColumnBox() && firstBox->isLayoutMult iColumnSet())) 175 if (!firstBox || (firstBox == lastMultiColumnBox() && firstBox->isLayoutMult iColumnSet()))
176 return 0; 176 return nullptr;
177 177
178 // We have spanners. See if the layoutObject in question is one or inside of one then. 178 // We have spanners. See if the layoutObject in question is one or inside of one then.
179 for (const LayoutObject* ancestor = descendant; ancestor && ancestor != this ; ancestor = ancestor->parent()) { 179 for (const LayoutObject* ancestor = descendant; ancestor && ancestor != this ; ancestor = ancestor->parent()) {
180 if (LayoutMultiColumnSpannerPlaceholder* placeholder = ancestor->spanner Placeholder()) 180 if (LayoutMultiColumnSpannerPlaceholder* placeholder = ancestor->spanner Placeholder())
181 return placeholder; 181 return placeholder;
182 } 182 }
183 return 0; 183 return nullptr;
184 } 184 }
185 185
186 void LayoutMultiColumnFlowThread::populate() 186 void LayoutMultiColumnFlowThread::populate()
187 { 187 {
188 LayoutBlockFlow* multicolContainer = multiColumnBlockFlow(); 188 LayoutBlockFlow* multicolContainer = multiColumnBlockFlow();
189 ASSERT(!nextSibling()); 189 ASSERT(!nextSibling());
190 // Reparent children preceding the flow thread into the flow thread. It's mu lticol content 190 // Reparent children preceding the flow thread into the flow thread. It's mu lticol content
191 // now. At this point there's obviously nothing after the flow thread, but l ayoutObjects (column 191 // now. At this point there's obviously nothing after the flow thread, but l ayoutObjects (column
192 // sets and spanners) will be inserted there as we insert elements into the flow thread. 192 // sets and spanners) will be inserted there as we insert elements into the flow thread.
193 multicolContainer->moveChildrenTo(this, multicolContainer->firstChild(), thi s, true); 193 multicolContainer->moveChildrenTo(this, multicolContainer->firstChild(), thi s, true);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 LayoutMultiColumnSet* previousSet = columnSet->previousSiblingMultiC olumnSet(); 267 LayoutMultiColumnSet* previousSet = columnSet->previousSiblingMultiC olumnSet();
268 if (!previousSet) 268 if (!previousSet)
269 break; 269 break;
270 columnSet = previousSet; 270 columnSet = previousSet;
271 } 271 }
272 return columnSet; 272 return columnSet;
273 } 273 }
274 274
275 ASSERT(!m_columnSetsInvalidated); 275 ASSERT(!m_columnSetsInvalidated);
276 if (m_multiColumnSetList.isEmpty()) 276 if (m_multiColumnSetList.isEmpty())
277 return 0; 277 return nullptr;
278 if (offset <= 0) 278 if (offset <= 0)
279 return m_multiColumnSetList.first(); 279 return m_multiColumnSetList.first();
280 280
281 MultiColumnSetSearchAdapter adapter(offset); 281 MultiColumnSetSearchAdapter adapter(offset);
282 m_multiColumnSetIntervalTree.allOverlapsWithAdapter<MultiColumnSetSearchAdap ter>(adapter); 282 m_multiColumnSetIntervalTree.allOverlapsWithAdapter<MultiColumnSetSearchAdap ter>(adapter);
283 283
284 // If no set was found, the offset is in the flow thread overflow. 284 // If no set was found, the offset is in the flow thread overflow.
285 if (!adapter.result() && !m_multiColumnSetList.isEmpty()) 285 if (!adapter.result() && !m_multiColumnSetList.isEmpty())
286 return m_multiColumnSetList.last(); 286 return m_multiColumnSetList.last();
287 return adapter.result(); 287 return adapter.result();
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
539 for (LayoutObject* layoutObject = descendant; layoutObject; layoutObject = n ext) { 539 for (LayoutObject* layoutObject = descendant; layoutObject; layoutObject = n ext) {
540 if (shouldSkipInsertedOrRemovedChild(this, *layoutObject)) { 540 if (shouldSkipInsertedOrRemovedChild(this, *layoutObject)) {
541 next = layoutObject->nextInPreOrderAfterChildren(descendant); 541 next = layoutObject->nextInPreOrderAfterChildren(descendant);
542 continue; 542 continue;
543 } 543 }
544 next = layoutObject->nextInPreOrder(descendant); 544 next = layoutObject->nextInPreOrder(descendant);
545 if (containingColumnSpannerPlaceholder(layoutObject)) 545 if (containingColumnSpannerPlaceholder(layoutObject))
546 continue; // Inside a column spanner. Nothing to do, then. 546 continue; // Inside a column spanner. Nothing to do, then.
547 if (descendantIsValidColumnSpanner(layoutObject)) { 547 if (descendantIsValidColumnSpanner(layoutObject)) {
548 // This layoutObject is a spanner, so it needs to establish a spanne r placeholder. 548 // This layoutObject is a spanner, so it needs to establish a spanne r placeholder.
549 LayoutBox* insertBefore = 0; 549 LayoutBox* insertBefore = nullptr;
550 LayoutMultiColumnSet* setToSplit = 0; 550 LayoutMultiColumnSet* setToSplit = nullptr;
551 if (objectAfterSubtree) { 551 if (objectAfterSubtree) {
552 // The spanner is inserted before something. Figure out what thi s entails. If the 552 // The spanner is inserted before something. Figure out what thi s entails. If the
553 // next layoutObject is a spanner too, it means that we can simp ly insert a new spanner 553 // next layoutObject is a spanner too, it means that we can simp ly insert a new spanner
554 // placeholder in front of its placeholder. 554 // placeholder in front of its placeholder.
555 insertBefore = objectAfterSubtree->spannerPlaceholder(); 555 insertBefore = objectAfterSubtree->spannerPlaceholder();
556 if (!insertBefore) { 556 if (!insertBefore) {
557 // The next layoutObject isn't a spanner; it's regular colum n content. Examine what 557 // The next layoutObject isn't a spanner; it's regular colum n content. Examine what
558 // comes right before us in the flow thread, then. 558 // comes right before us in the flow thread, then.
559 LayoutObject* previousLayoutObject = previousInPreOrderSkipp ingOutOfFlow(this, layoutObject); 559 LayoutObject* previousLayoutObject = previousInPreOrderSkipp ingOutOfFlow(this, layoutObject);
560 if (!previousLayoutObject || previousLayoutObject == this) { 560 if (!previousLayoutObject || previousLayoutObject == this) {
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 previousColumnBox->setNeedsLayout(LayoutInvalidationReason::Colu mnsChanged); 639 previousColumnBox->setNeedsLayout(LayoutInvalidationReason::Colu mnsChanged);
640 invalidateColumnSets(); 640 invalidateColumnSets();
641 } 641 }
642 } 642 }
643 placeholder->destroy(); 643 placeholder->destroy();
644 } 644 }
645 if (hadContainingPlaceholder || !processedSomething) 645 if (hadContainingPlaceholder || !processedSomething)
646 return; // No column content will be removed, so we can stop here. 646 return; // No column content will be removed, so we can stop here.
647 647
648 // Column content will be removed. Does this mean that we should destroy a c olumn set? 648 // Column content will be removed. Does this mean that we should destroy a c olumn set?
649 LayoutMultiColumnSpannerPlaceholder* adjacentPreviousSpannerPlaceholder = 0; 649 LayoutMultiColumnSpannerPlaceholder* adjacentPreviousSpannerPlaceholder = nu llptr;
650 LayoutObject* previousLayoutObject = previousInPreOrderSkippingOutOfFlow(thi s, descendant); 650 LayoutObject* previousLayoutObject = previousInPreOrderSkippingOutOfFlow(thi s, descendant);
651 if (previousLayoutObject && previousLayoutObject != this) { 651 if (previousLayoutObject && previousLayoutObject != this) {
652 adjacentPreviousSpannerPlaceholder = containingColumnSpannerPlaceholder( previousLayoutObject); 652 adjacentPreviousSpannerPlaceholder = containingColumnSpannerPlaceholder( previousLayoutObject);
653 if (!adjacentPreviousSpannerPlaceholder) 653 if (!adjacentPreviousSpannerPlaceholder)
654 return; // Preceded by column content. Set still needed. 654 return; // Preceded by column content. Set still needed.
655 } 655 }
656 LayoutMultiColumnSpannerPlaceholder* adjacentNextSpannerPlaceholder = 0; 656 LayoutMultiColumnSpannerPlaceholder* adjacentNextSpannerPlaceholder = nullpt r;
657 LayoutObject* nextLayoutObject = nextInPreOrderAfterChildrenSkippingOutOfFlo w(this, descendant); 657 LayoutObject* nextLayoutObject = nextInPreOrderAfterChildrenSkippingOutOfFlo w(this, descendant);
658 if (nextLayoutObject) { 658 if (nextLayoutObject) {
659 adjacentNextSpannerPlaceholder = containingColumnSpannerPlaceholder(next LayoutObject); 659 adjacentNextSpannerPlaceholder = containingColumnSpannerPlaceholder(next LayoutObject);
660 if (!adjacentNextSpannerPlaceholder) 660 if (!adjacentNextSpannerPlaceholder)
661 return; // Followed by column content. Set still needed. 661 return; // Followed by column content. Set still needed.
662 } 662 }
663 // We have now determined that, with the removal of |descendant|, we should remove a column 663 // We have now determined that, with the removal of |descendant|, we should remove a column
664 // set. Locate it and remove it. Do it without involving mapDescendantToColu mnSet(), as that 664 // set. Locate it and remove it. Do it without involving mapDescendantToColu mnSet(), as that
665 // might be very slow. Deduce the right set from the spanner placeholders th at we've already 665 // might be very slow. Deduce the right set from the spanner placeholders th at we've already
666 // found. 666 // found.
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 if (m_lastSetWorkedOn) 756 if (m_lastSetWorkedOn)
757 m_lastSetWorkedOn->beginFlow(LayoutUnit()); 757 m_lastSetWorkedOn->beginFlow(LayoutUnit());
758 LayoutFlowThread::layout(); 758 LayoutFlowThread::layout();
759 if (LayoutMultiColumnSet* lastSet = lastMultiColumnSet()) { 759 if (LayoutMultiColumnSet* lastSet = lastMultiColumnSet()) {
760 ASSERT(lastSet == m_lastSetWorkedOn); 760 ASSERT(lastSet == m_lastSetWorkedOn);
761 if (!lastSet->nextSiblingMultiColumnBox()) { 761 if (!lastSet->nextSiblingMultiColumnBox()) {
762 lastSet->endFlow(logicalHeight()); 762 lastSet->endFlow(logicalHeight());
763 lastSet->expandToEncompassFlowThreadContentsIfNeeded(); 763 lastSet->expandToEncompassFlowThreadContentsIfNeeded();
764 } 764 }
765 } 765 }
766 m_lastSetWorkedOn = 0; 766 m_lastSetWorkedOn = nullptr;
767 } 767 }
768 768
769 void LayoutMultiColumnFlowThread::setPageBreak(LayoutUnit offset, LayoutUnit spa ceShortage) 769 void LayoutMultiColumnFlowThread::setPageBreak(LayoutUnit offset, LayoutUnit spa ceShortage)
770 { 770 {
771 // Only positive values are interesting (and allowed) here. Zero space short age may be reported 771 // Only positive values are interesting (and allowed) here. Zero space short age may be reported
772 // when we're at the top of a column and the element has zero height. Ignore this, and also 772 // when we're at the top of a column and the element has zero height. Ignore this, and also
773 // ignore any negative values, which may occur when we set an early break in order to honor 773 // ignore any negative values, which may occur when we set an early break in order to honor
774 // widows in the next column. 774 // widows in the next column.
775 if (spaceShortage <= 0) 775 if (spaceShortage <= 0)
776 return; 776 return;
(...skipping 20 matching lines...) Expand all
797 } 797 }
798 798
799 bool LayoutMultiColumnFlowThread::isPageLogicalHeightKnown() const 799 bool LayoutMultiColumnFlowThread::isPageLogicalHeightKnown() const
800 { 800 {
801 if (LayoutMultiColumnSet* columnSet = lastMultiColumnSet()) 801 if (LayoutMultiColumnSet* columnSet = lastMultiColumnSet())
802 return columnSet->pageLogicalHeight(); 802 return columnSet->pageLogicalHeight();
803 return false; 803 return false;
804 } 804 }
805 805
806 } 806 }
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutMultiColumnFlowThread.h ('k') | Source/core/layout/LayoutMultiColumnFlowThreadTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698