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

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

Issue 1025213002: Begin tracking why layout is invalidated (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 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 | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2007 David Smith (catfish.man@gmail.com) 4 * (C) 2007 David Smith (catfish.man@gmail.com)
5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 5 * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 700 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 711
712 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting 712 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting
713 // time in makeChildrenNonInline by just setting this explicitly up front. 713 // time in makeChildrenNonInline by just setting this explicitly up front.
714 newBlockBox->setChildrenInline(false); 714 newBlockBox->setChildrenInline(false);
715 715
716 newBlockBox->addChild(newChild); 716 newBlockBox->addChild(newChild);
717 717
718 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images) 718 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images)
719 // get deleted properly. Because objects moves from the pre block into the post block, we want to 719 // get deleted properly. Because objects moves from the pre block into the post block, we want to
720 // make new line boxes instead of leaving the old line boxes around. 720 // make new line boxes instead of leaving the old line boxes around.
721 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 721 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalid ationReason::ColumnsChanged);
722 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 722 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInval idationReason::ColumnsChanged);
723 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 723 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvali dationReason::ColumnsChanged);
724 } 724 }
725 725
726 void LayoutBlock::makeChildrenAnonymousColumnBlocks(LayoutObject* beforeChild, L ayoutBlockFlow* newBlockBox, LayoutObject* newChild) 726 void LayoutBlock::makeChildrenAnonymousColumnBlocks(LayoutObject* beforeChild, L ayoutBlockFlow* newBlockBox, LayoutObject* newChild)
727 { 727 {
728 LayoutBlockFlow* pre = 0; 728 LayoutBlockFlow* pre = 0;
729 LayoutBlockFlow* post = 0; 729 LayoutBlockFlow* post = 0;
730 LayoutBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable 730 LayoutBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable
731 // so that we don't have to patch all of the rest of the code later on. 731 // so that we don't have to patch all of the rest of the code later on.
732 732
733 // Delete the block's line boxes before we do the split. 733 // Delete the block's line boxes before we do the split.
(...skipping 27 matching lines...) Expand all
761 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting 761 // We already know the newBlockBox isn't going to contain inline kids, so av oid wasting
762 // time in makeChildrenNonInline by just setting this explicitly up front. 762 // time in makeChildrenNonInline by just setting this explicitly up front.
763 newBlockBox->setChildrenInline(false); 763 newBlockBox->setChildrenInline(false);
764 764
765 newBlockBox->addChild(newChild); 765 newBlockBox->addChild(newChild);
766 766
767 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images) 767 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images)
768 // get deleted properly. Because objects moved from the pre block into the post block, we want to 768 // get deleted properly. Because objects moved from the pre block into the post block, we want to
769 // make new line boxes instead of leaving the old line boxes around. 769 // make new line boxes instead of leaving the old line boxes around.
770 if (pre) 770 if (pre)
771 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 771 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInv alidationReason::ColumnsChanged);
772 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 772 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInval idationReason::ColumnsChanged);
773 if (post) 773 if (post)
774 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 774 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutIn validationReason::ColumnsChanged);
775 } 775 }
776 776
777 LayoutBlockFlow* LayoutBlock::columnsBlockForSpanningElement(LayoutObject* newCh ild) 777 LayoutBlockFlow* LayoutBlock::columnsBlockForSpanningElement(LayoutObject* newCh ild)
778 { 778 {
779 // FIXME: This function is the gateway for the addition of column-span suppo rt. It will 779 // FIXME: This function is the gateway for the addition of column-span suppo rt. It will
780 // be added to in three stages: 780 // be added to in three stages:
781 // (1) Immediate children of a multi-column block can span. 781 // (1) Immediate children of a multi-column block can span.
782 // (2) Nested block-level children with only block-level ancestors between t hem and the multi-column block can span. 782 // (2) Nested block-level children with only block-level ancestors between t hem and the multi-column block can span.
783 // (3) Nested children with block or inline ancestors between them and the m ulti-column block can span (this is when we 783 // (3) Nested children with block or inline ancestors between them and the m ulti-column block can span (this is when we
784 // cross the streams and have to cope with both types of continuations mixed together). 784 // cross the streams and have to cope with both types of continuations mixed together).
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
1115 collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i])); 1115 collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i]));
1116 } 1116 }
1117 1117
1118 void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock* child) 1118 void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock* child)
1119 { 1119 {
1120 // It's possible that this block's destruction may have been triggered by th e 1120 // It's possible that this block's destruction may have been triggered by th e
1121 // child's removal. Just bail if the anonymous child block is already being 1121 // child's removal. Just bail if the anonymous child block is already being
1122 // destroyed. See crbug.com/282088 1122 // destroyed. See crbug.com/282088
1123 if (child->beingDestroyed()) 1123 if (child->beingDestroyed())
1124 return; 1124 return;
1125 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 1125 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInva lidationReason::ChildAnonymousBlockChanged);
1126 parent->setChildrenInline(child->childrenInline()); 1126 parent->setChildrenInline(child->childrenInline());
1127 LayoutObject* nextSibling = child->nextSibling(); 1127 LayoutObject* nextSibling = child->nextSibling();
1128 1128
1129 parent->children()->removeChildNode(parent, child, child->hasLayer()); 1129 parent->children()->removeChildNode(parent, child, child->hasLayer());
1130 // FIXME: Get rid of the temporary disabling of continuations. This is neede d by the old 1130 // FIXME: Get rid of the temporary disabling of continuations. This is neede d by the old
1131 // multicol implementation, because of buggy block continuation handling (wh ich is hard and 1131 // multicol implementation, because of buggy block continuation handling (wh ich is hard and
1132 // rather pointless to fix at this point). Support for block continuations c an be removed 1132 // rather pointless to fix at this point). Support for block continuations c an be removed
1133 // together with the old multicol implementation. crbug.com/408123 1133 // together with the old multicol implementation. crbug.com/408123
1134 LayoutBoxModelObject* temporarilyInactiveContinuation = parent->continuation (); 1134 LayoutBoxModelObject* temporarilyInactiveContinuation = parent->continuation ();
1135 if (temporarilyInactiveContinuation) 1135 if (temporarilyInactiveContinuation)
(...skipping 19 matching lines...) Expand all
1155 // This protects against column split flows when anonymous blocks are gettin g merged. 1155 // This protects against column split flows when anonymous blocks are gettin g merged.
1156 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false) ; 1156 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false) ;
1157 1157
1158 // If this child is a block, and if our previous and next siblings are 1158 // If this child is a block, and if our previous and next siblings are
1159 // both anonymous blocks with inline content, then we can go ahead and 1159 // both anonymous blocks with inline content, then we can go ahead and
1160 // fold the inline content back together. 1160 // fold the inline content back together.
1161 LayoutObject* prev = oldChild->previousSibling(); 1161 LayoutObject* prev = oldChild->previousSibling();
1162 LayoutObject* next = oldChild->nextSibling(); 1162 LayoutObject* next = oldChild->nextSibling();
1163 bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, p rev, next); 1163 bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, p rev, next);
1164 if (canMergeAnonymousBlocks && prev && next) { 1164 if (canMergeAnonymousBlocks && prev && next) {
1165 prev->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 1165 prev->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutIn validationReason::AnonymousBlockChange);
1166 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next); 1166 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next);
1167 LayoutBlockFlow* prevBlock = toLayoutBlockFlow(prev); 1167 LayoutBlockFlow* prevBlock = toLayoutBlockFlow(prev);
1168 1168
1169 if (prev->childrenInline() != next->childrenInline()) { 1169 if (prev->childrenInline() != next->childrenInline()) {
1170 LayoutBlock* inlineChildrenBlock = prev->childrenInline() ? prevBloc k : nextBlock; 1170 LayoutBlock* inlineChildrenBlock = prev->childrenInline() ? prevBloc k : nextBlock;
1171 LayoutBlock* blockChildrenBlock = prev->childrenInline() ? nextBlock : prevBlock; 1171 LayoutBlock* blockChildrenBlock = prev->childrenInline() ? nextBlock : prevBlock;
1172 1172
1173 // Place the inline children block inside of the block children bloc k instead of deleting it. 1173 // Place the inline children block inside of the block children bloc k instead of deleting it.
1174 // In order to reuse it, we have to reset it to just be a generic an onymous block. Make sure 1174 // In order to reuse it, we have to reset it to just be a generic an onymous block. Make sure
1175 // to clear out inherited column properties by just making a new sty le, and to also clear the 1175 // to clear out inherited column properties by just making a new sty le, and to also clear the
1176 // column span flag if it is set. 1176 // column span flag if it is set.
1177 ASSERT(!inlineChildrenBlock->continuation()); 1177 ASSERT(!inlineChildrenBlock->continuation());
1178 RefPtr<LayoutStyle> newStyle = LayoutStyle::createAnonymousStyleWith Display(styleRef(), BLOCK); 1178 RefPtr<LayoutStyle> newStyle = LayoutStyle::createAnonymousStyleWith Display(styleRef(), BLOCK);
1179 // Cache this value as it might get changed in setStyle() call. 1179 // Cache this value as it might get changed in setStyle() call.
1180 bool inlineChildrenBlockHasLayer = inlineChildrenBlock->hasLayer(); 1180 bool inlineChildrenBlockHasLayer = inlineChildrenBlock->hasLayer();
1181 inlineChildrenBlock->setStyle(newStyle); 1181 inlineChildrenBlock->setStyle(newStyle);
1182 children()->removeChildNode(this, inlineChildrenBlock, inlineChildre nBlockHasLayer); 1182 children()->removeChildNode(this, inlineChildrenBlock, inlineChildre nBlockHasLayer);
1183 1183
1184 // Now just put the inlineChildrenBlock inside the blockChildrenBloc k. 1184 // Now just put the inlineChildrenBlock inside the blockChildrenBloc k.
1185 blockChildrenBlock->children()->insertChildNode(blockChildrenBlock, inlineChildrenBlock, prev == inlineChildrenBlock ? blockChildrenBlock->firstChil d() : 0, 1185 blockChildrenBlock->children()->insertChildNode(blockChildrenBlock, inlineChildrenBlock, prev == inlineChildrenBlock ? blockChildrenBlock->firstChil d() : 0,
1186 inlineChildrenBlockHasLayer || blockChildrenBlock->hasLayer()); 1186 inlineChildrenBlockHasLayer || blockChildrenBlock->hasLayer());
1187 next->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); 1187 next->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(Layo utInvalidationReason::AnonymousBlockChange);
1188 1188
1189 // inlineChildrenBlock got reparented to blockChildrenBlock, so it i s no longer a child 1189 // inlineChildrenBlock got reparented to blockChildrenBlock, so it i s no longer a child
1190 // of "this". we null out prev or next so that is not used later in the function. 1190 // of "this". we null out prev or next so that is not used later in the function.
1191 if (inlineChildrenBlock == prevBlock) 1191 if (inlineChildrenBlock == prevBlock)
1192 prev = 0; 1192 prev = 0;
1193 else 1193 else
1194 next = 0; 1194 next = 0;
1195 } else { 1195 } else {
1196 // Take all the children out of the |next| block and put them in 1196 // Take all the children out of the |next| block and put them in
1197 // the |prev| block. 1197 // the |prev| block.
(...skipping 525 matching lines...) Expand 10 before | Expand all | Expand 10 after
1723 if (isHorizontalWritingMode() == r->isHorizontalWritingMode()) 1723 if (isHorizontalWritingMode() == r->isHorizontalWritingMode())
1724 r->updateLogicalHeight(); 1724 r->updateLogicalHeight();
1725 else 1725 else
1726 r->updateLogicalWidth(); 1726 r->updateLogicalWidth();
1727 oldLogicalTop = logicalTopForChild(*r); 1727 oldLogicalTop = logicalTopForChild(*r);
1728 } 1728 }
1729 1729
1730 // FIXME: We should be able to do a r->setNeedsPositionedMovementLayout( ) here instead of a full layout. Need 1730 // FIXME: We should be able to do a r->setNeedsPositionedMovementLayout( ) here instead of a full layout. Need
1731 // to investigate why it does not trigger the correct invalidations in t hat case. crbug.com/350756 1731 // to investigate why it does not trigger the correct invalidations in t hat case. crbug.com/350756
1732 if (info == ForcedLayoutAfterContainingBlockMoved) 1732 if (info == ForcedLayoutAfterContainingBlockMoved)
1733 r->setNeedsLayout(MarkOnlyThis); 1733 r->setNeedsLayout(LayoutInvalidationReason::AncestorMoved, MarkOnlyT his);
esprehn 2015/03/23 20:19:43 Just like with setNeedsStyleRecalc I'd prefer the
pdr. 2015/03/24 03:56:18 setNeedsLayout takes 2 optional arguments so if we
1734 1734
1735 r->layoutIfNeeded(); 1735 r->layoutIfNeeded();
1736 1736
1737 // Lay out again if our estimate was wrong. 1737 // Lay out again if our estimate was wrong.
1738 if (needsBlockDirectionLocationSetBeforeLayout && logicalTopForChild(*r) != oldLogicalTop) 1738 if (needsBlockDirectionLocationSetBeforeLayout && logicalTopForChild(*r) != oldLogicalTop)
1739 r->forceChildLayout(); 1739 r->forceChildLayout();
1740 } 1740 }
1741 1741
1742 if (hasColumns()) 1742 if (hasColumns())
1743 view()->layoutState()->setColumnInfo(columnInfo()); // FIXME: Kind of gr oss. We just put this back into the layout state so that pop() will work. 1743 view()->layoutState()->setColumnInfo(columnInfo()); // FIXME: Kind of gr oss. We just put this back into the layout state so that pop() will work.
(...skipping 2178 matching lines...) Expand 10 before | Expand all | Expand 10 after
3922 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 3922 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
3923 { 3923 {
3924 showLayoutObject(); 3924 showLayoutObject();
3925 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 3925 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
3926 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 3926 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
3927 } 3927 }
3928 3928
3929 #endif 3929 #endif
3930 3930
3931 } // namespace blink 3931 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698