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

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

Issue 2231383002: Need to roll back the multicol machinery state when re-laying out a block child. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 4 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) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google 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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
159 // Some features, such as floats, margin collapsing and fragmentation, require s ome knowledge about 159 // Some features, such as floats, margin collapsing and fragmentation, require s ome knowledge about
160 // things that happened when laying out previous block child siblings. Only look ing at the object 160 // things that happened when laying out previous block child siblings. Only look ing at the object
161 // currently being laid out isn't always enough. 161 // currently being laid out isn't always enough.
162 class BlockChildrenLayoutInfo { 162 class BlockChildrenLayoutInfo {
163 public: 163 public:
164 BlockChildrenLayoutInfo(LayoutBlockFlow* blockFlow, LayoutUnit beforeEdge, L ayoutUnit afterEdge) 164 BlockChildrenLayoutInfo(LayoutBlockFlow* blockFlow, LayoutUnit beforeEdge, L ayoutUnit afterEdge)
165 : m_marginInfo(blockFlow, beforeEdge, afterEdge) 165 : m_marginInfo(blockFlow, beforeEdge, afterEdge)
166 , m_previousBreakAfterValue(BreakAuto) 166 , m_previousBreakAfterValue(BreakAuto)
167 , m_isAtFirstInFlowChild(true) { } 167 , m_isAtFirstInFlowChild(true) { }
168 168
169 // Store multicol layout state before first layout of a block child. The chi ld may contain a
170 // column spanner. If we need to re-lay out the block child because our init ial logical top
171 // estimate was wrong, we need to roll back to how things were before laying out the child.
172 void storeMultiColumnLayoutState(const LayoutFlowThread& flowThread)
173 {
174 m_multiColumnLayoutState = flowThread.multiColumnLayoutState();
175 }
176 void rollBackToInitialMultiColumnLayoutState(LayoutFlowThread& flowThread)
177 {
178 flowThread.restoreMultiColumnLayoutState(m_multiColumnLayoutState);
179 }
180
169 const MarginInfo& marginInfo() const { return m_marginInfo; } 181 const MarginInfo& marginInfo() const { return m_marginInfo; }
170 MarginInfo& marginInfo() { return m_marginInfo; } 182 MarginInfo& marginInfo() { return m_marginInfo; }
171 LayoutUnit& previousFloatLogicalBottom() { return m_previousFloatLogicalBott om; } 183 LayoutUnit& previousFloatLogicalBottom() { return m_previousFloatLogicalBott om; }
172 184
173 EBreak previousBreakAfterValue() const { return m_previousBreakAfterValue; } 185 EBreak previousBreakAfterValue() const { return m_previousBreakAfterValue; }
174 void setPreviousBreakAfterValue(EBreak value) { m_previousBreakAfterValue = value; } 186 void setPreviousBreakAfterValue(EBreak value) { m_previousBreakAfterValue = value; }
175 187
176 bool isAtFirstInFlowChild() const { return m_isAtFirstInFlowChild; } 188 bool isAtFirstInFlowChild() const { return m_isAtFirstInFlowChild; }
177 void clearIsAtFirstInFlowChild() { m_isAtFirstInFlowChild = false; } 189 void clearIsAtFirstInFlowChild() { m_isAtFirstInFlowChild = false; }
178 190
179 private: 191 private:
192 MultiColumnLayoutState m_multiColumnLayoutState;
180 MarginInfo m_marginInfo; 193 MarginInfo m_marginInfo;
181 LayoutUnit m_previousFloatLogicalBottom; 194 LayoutUnit m_previousFloatLogicalBottom;
182 EBreak m_previousBreakAfterValue; 195 EBreak m_previousBreakAfterValue;
183 bool m_isAtFirstInFlowChild; 196 bool m_isAtFirstInFlowChild;
184 }; 197 };
185 198
186 LayoutBlockFlow::LayoutBlockFlow(ContainerNode* node) 199 LayoutBlockFlow::LayoutBlockFlow(ContainerNode* node)
187 : LayoutBlock(node) 200 : LayoutBlock(node)
188 { 201 {
189 static_assert(sizeof(MarginInfo) == sizeof(SameSizeAsMarginInfo), "MarginInf o should stay small"); 202 static_assert(sizeof(MarginInfo) == sizeof(SameSizeAsMarginInfo), "MarginInf o should stay small");
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 if (std::max(previousFloatLogicalBottom, lowestFloatLogicalBottom()) > n ewLogicalTop) 629 if (std::max(previousFloatLogicalBottom, lowestFloatLogicalBottom()) > n ewLogicalTop)
617 markDescendantsWithFloats = true; 630 markDescendantsWithFloats = true;
618 } 631 }
619 632
620 if (markDescendantsWithFloats) 633 if (markDescendantsWithFloats)
621 child.markAllDescendantsWithFloatsForLayout(); 634 child.markAllDescendantsWithFloatsForLayout();
622 } 635 }
623 636
624 bool LayoutBlockFlow::positionAndLayoutOnceIfNeeded(LayoutBox& child, LayoutUnit newLogicalTop, BlockChildrenLayoutInfo& layoutInfo) 637 bool LayoutBlockFlow::positionAndLayoutOnceIfNeeded(LayoutBox& child, LayoutUnit newLogicalTop, BlockChildrenLayoutInfo& layoutInfo)
625 { 638 {
639 if (LayoutFlowThread* flowThread = flowThreadContainingBlock())
640 layoutInfo.rollBackToInitialMultiColumnLayoutState(*flowThread);
641
626 if (child.isLayoutBlockFlow()) { 642 if (child.isLayoutBlockFlow()) {
627 LayoutUnit& previousFloatLogicalBottom = layoutInfo.previousFloatLogical Bottom(); 643 LayoutUnit& previousFloatLogicalBottom = layoutInfo.previousFloatLogical Bottom();
628 LayoutBlockFlow& childBlockFlow = toLayoutBlockFlow(child); 644 LayoutBlockFlow& childBlockFlow = toLayoutBlockFlow(child);
629 if (childBlockFlow.containsFloats() || containsFloats()) 645 if (childBlockFlow.containsFloats() || containsFloats())
630 markDescendantsWithFloatsForLayoutIfNeeded(childBlockFlow, newLogica lTop, previousFloatLogicalBottom); 646 markDescendantsWithFloatsForLayoutIfNeeded(childBlockFlow, newLogica lTop, previousFloatLogicalBottom);
631 647
632 // TODO(mstensho): A writing mode root is one thing, but we should be ab le to skip anything 648 // TODO(mstensho): A writing mode root is one thing, but we should be ab le to skip anything
633 // that establishes a new block formatting context here. Their floats do n't affect us. 649 // that establishes a new block formatting context here. Their floats do n't affect us.
634 if (!childBlockFlow.isWritingModeRoot()) 650 if (!childBlockFlow.isWritingModeRoot())
635 previousFloatLogicalBottom = std::max(previousFloatLogicalBottom, ch ildBlockFlow.logicalTop() + childBlockFlow.lowestFloatLogicalBottom()); 651 previousFloatLogicalBottom = std::max(previousFloatLogicalBottom, ch ildBlockFlow.logicalTop() + childBlockFlow.lowestFloatLogicalBottom());
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
691 707
692 // Try to guess our correct logical top position. In most cases this guess w ill 708 // Try to guess our correct logical top position. In most cases this guess w ill
693 // be correct. Only if we're wrong (when we compute the real logical top pos ition) 709 // be correct. Only if we're wrong (when we compute the real logical top pos ition)
694 // will we have to potentially relayout. 710 // will we have to potentially relayout.
695 LayoutUnit estimateWithoutPagination; 711 LayoutUnit estimateWithoutPagination;
696 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, layoutInfo , estimateWithoutPagination); 712 LayoutUnit logicalTopEstimate = estimateLogicalTopPosition(child, layoutInfo , estimateWithoutPagination);
697 713
698 // Cache our old rect so that we can dirty the proper paint invalidation rec ts if the child moves. 714 // Cache our old rect so that we can dirty the proper paint invalidation rec ts if the child moves.
699 LayoutRect oldRect = child.frameRect(); 715 LayoutRect oldRect = child.frameRect();
700 716
717 if (LayoutFlowThread* flowThread = flowThreadContainingBlock())
718 layoutInfo.storeMultiColumnLayoutState(*flowThread);
719
701 // Use the estimated block position and lay out the child if needed. After c hild layout, when 720 // Use the estimated block position and lay out the child if needed. After c hild layout, when
702 // we have enough information to perform proper margin collapsing, float cle aring and 721 // we have enough information to perform proper margin collapsing, float cle aring and
703 // pagination, we may have to reposition and lay out again if the estimate w as wrong. 722 // pagination, we may have to reposition and lay out again if the estimate w as wrong.
704 bool childNeededLayout = positionAndLayoutOnceIfNeeded(child, logicalTopEsti mate, layoutInfo); 723 bool childNeededLayout = positionAndLayoutOnceIfNeeded(child, logicalTopEsti mate, layoutInfo);
705 724
706 // Cache if we are at the top of the block right now. 725 // Cache if we are at the top of the block right now.
707 bool atBeforeSideOfBlock = marginInfo.atBeforeSideOfBlock(); 726 bool atBeforeSideOfBlock = marginInfo.atBeforeSideOfBlock();
708 bool childIsSelfCollapsing = child.isSelfCollapsingBlock(); 727 bool childIsSelfCollapsing = child.isSelfCollapsingBlock();
709 bool childDiscardMarginBefore = mustDiscardMarginBeforeForChild(child); 728 bool childDiscardMarginBefore = mustDiscardMarginBeforeForChild(child);
710 bool childDiscardMarginAfter = mustDiscardMarginAfterForChild(child); 729 bool childDiscardMarginAfter = mustDiscardMarginAfterForChild(child);
(...skipping 3064 matching lines...) Expand 10 before | Expand all | Expand 10 after
3775 if (!rect.isEmpty()) 3794 if (!rect.isEmpty())
3776 rects.append(rect); 3795 rects.append(rect);
3777 } 3796 }
3778 } 3797 }
3779 3798
3780 if (inlineElementContinuation) 3799 if (inlineElementContinuation)
3781 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in lineElementContinuation->containingBlock()->location() - location()), includeBlo ckOverflows); 3800 inlineElementContinuation->addOutlineRects(rects, additionalOffset + (in lineElementContinuation->containingBlock()->location() - location()), includeBlo ckOverflows);
3782 } 3801 }
3783 3802
3784 } // namespace blink 3803 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698