OLD | NEW |
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 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 | 713 |
714 // We already know the newBlockBox isn't going to contain inline kids, so av
oid wasting | 714 // We already know the newBlockBox isn't going to contain inline kids, so av
oid wasting |
715 // time in makeChildrenNonInline by just setting this explicitly up front. | 715 // time in makeChildrenNonInline by just setting this explicitly up front. |
716 newBlockBox->setChildrenInline(false); | 716 newBlockBox->setChildrenInline(false); |
717 | 717 |
718 newBlockBox->addChild(newChild); | 718 newBlockBox->addChild(newChild); |
719 | 719 |
720 // Always just do a full layout in order to ensure that line boxes (especial
ly wrappers for images) | 720 // Always just do a full layout in order to ensure that line boxes (especial
ly wrappers for images) |
721 // get deleted properly. Because objects moves from the pre block into the
post block, we want to | 721 // get deleted properly. Because objects moves from the pre block into the
post block, we want to |
722 // make new line boxes instead of leaving the old line boxes around. | 722 // make new line boxes instead of leaving the old line boxes around. |
723 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 723 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalid
ationReason::ColumnsChanged); |
724 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 724 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInval
idationReason::ColumnsChanged); |
725 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 725 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvali
dationReason::ColumnsChanged); |
726 } | 726 } |
727 | 727 |
728 void LayoutBlock::makeChildrenAnonymousColumnBlocks(LayoutObject* beforeChild, L
ayoutBlockFlow* newBlockBox, LayoutObject* newChild) | 728 void LayoutBlock::makeChildrenAnonymousColumnBlocks(LayoutObject* beforeChild, L
ayoutBlockFlow* newBlockBox, LayoutObject* newChild) |
729 { | 729 { |
730 LayoutBlockFlow* pre = 0; | 730 LayoutBlockFlow* pre = 0; |
731 LayoutBlockFlow* post = 0; | 731 LayoutBlockFlow* post = 0; |
732 LayoutBlock* block = this; // Eventually block will not just be |this|, but
will also be a block nested inside |this|. Assign to a variable | 732 LayoutBlock* block = this; // Eventually block will not just be |this|, but
will also be a block nested inside |this|. Assign to a variable |
733 // so that we don't have to patch all of the rest of the code later on. | 733 // so that we don't have to patch all of the rest of the code later on. |
734 | 734 |
735 // Delete the block's line boxes before we do the split. | 735 // Delete the block's line boxes before we do the split. |
(...skipping 27 matching lines...) Expand all Loading... |
763 // We already know the newBlockBox isn't going to contain inline kids, so av
oid wasting | 763 // We already know the newBlockBox isn't going to contain inline kids, so av
oid wasting |
764 // time in makeChildrenNonInline by just setting this explicitly up front. | 764 // time in makeChildrenNonInline by just setting this explicitly up front. |
765 newBlockBox->setChildrenInline(false); | 765 newBlockBox->setChildrenInline(false); |
766 | 766 |
767 newBlockBox->addChild(newChild); | 767 newBlockBox->addChild(newChild); |
768 | 768 |
769 // Always just do a full layout in order to ensure that line boxes (especial
ly wrappers for images) | 769 // Always just do a full layout in order to ensure that line boxes (especial
ly wrappers for images) |
770 // get deleted properly. Because objects moved from the pre block into the
post block, we want to | 770 // get deleted properly. Because objects moved from the pre block into the
post block, we want to |
771 // make new line boxes instead of leaving the old line boxes around. | 771 // make new line boxes instead of leaving the old line boxes around. |
772 if (pre) | 772 if (pre) |
773 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 773 pre->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInv
alidationReason::ColumnsChanged); |
774 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 774 block->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInval
idationReason::ColumnsChanged); |
775 if (post) | 775 if (post) |
776 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 776 post->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutIn
validationReason::ColumnsChanged); |
777 } | 777 } |
778 | 778 |
779 LayoutBlockFlow* LayoutBlock::columnsBlockForSpanningElement(LayoutObject* newCh
ild) | 779 LayoutBlockFlow* LayoutBlock::columnsBlockForSpanningElement(LayoutObject* newCh
ild) |
780 { | 780 { |
781 // FIXME: This function is the gateway for the addition of column-span suppo
rt. It will | 781 // FIXME: This function is the gateway for the addition of column-span suppo
rt. It will |
782 // be added to in three stages: | 782 // be added to in three stages: |
783 // (1) Immediate children of a multi-column block can span. | 783 // (1) Immediate children of a multi-column block can span. |
784 // (2) Nested block-level children with only block-level ancestors between t
hem and the multi-column block can span. | 784 // (2) Nested block-level children with only block-level ancestors between t
hem and the multi-column block can span. |
785 // (3) Nested children with block or inline ancestors between them and the m
ulti-column block can span (this is when we | 785 // (3) Nested children with block or inline ancestors between them and the m
ulti-column block can span (this is when we |
786 // cross the streams and have to cope with both types of continuations mixed
together). | 786 // 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 Loading... |
1117 collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i])); | 1117 collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i])); |
1118 } | 1118 } |
1119 | 1119 |
1120 void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock*
child) | 1120 void LayoutBlock::collapseAnonymousBlockChild(LayoutBlock* parent, LayoutBlock*
child) |
1121 { | 1121 { |
1122 // It's possible that this block's destruction may have been triggered by th
e | 1122 // It's possible that this block's destruction may have been triggered by th
e |
1123 // child's removal. Just bail if the anonymous child block is already being | 1123 // child's removal. Just bail if the anonymous child block is already being |
1124 // destroyed. See crbug.com/282088 | 1124 // destroyed. See crbug.com/282088 |
1125 if (child->beingDestroyed()) | 1125 if (child->beingDestroyed()) |
1126 return; | 1126 return; |
1127 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 1127 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInva
lidationReason::ChildAnonymousBlockChanged); |
1128 parent->setChildrenInline(child->childrenInline()); | 1128 parent->setChildrenInline(child->childrenInline()); |
1129 LayoutObject* nextSibling = child->nextSibling(); | 1129 LayoutObject* nextSibling = child->nextSibling(); |
1130 | 1130 |
1131 parent->children()->removeChildNode(parent, child, child->hasLayer()); | 1131 parent->children()->removeChildNode(parent, child, child->hasLayer()); |
1132 // FIXME: Get rid of the temporary disabling of continuations. This is neede
d by the old | 1132 // FIXME: Get rid of the temporary disabling of continuations. This is neede
d by the old |
1133 // multicol implementation, because of buggy block continuation handling (wh
ich is hard and | 1133 // multicol implementation, because of buggy block continuation handling (wh
ich is hard and |
1134 // rather pointless to fix at this point). Support for block continuations c
an be removed | 1134 // rather pointless to fix at this point). Support for block continuations c
an be removed |
1135 // together with the old multicol implementation. crbug.com/408123 | 1135 // together with the old multicol implementation. crbug.com/408123 |
1136 LayoutBoxModelObject* temporarilyInactiveContinuation = parent->continuation
(); | 1136 LayoutBoxModelObject* temporarilyInactiveContinuation = parent->continuation
(); |
1137 if (temporarilyInactiveContinuation) | 1137 if (temporarilyInactiveContinuation) |
(...skipping 19 matching lines...) Expand all Loading... |
1157 // This protects against column split flows when anonymous blocks are gettin
g merged. | 1157 // This protects against column split flows when anonymous blocks are gettin
g merged. |
1158 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false)
; | 1158 TemporaryChange<bool> columnFlowSplitEnabled(gColumnFlowSplitEnabled, false)
; |
1159 | 1159 |
1160 // If this child is a block, and if our previous and next siblings are | 1160 // If this child is a block, and if our previous and next siblings are |
1161 // both anonymous blocks with inline content, then we can go ahead and | 1161 // both anonymous blocks with inline content, then we can go ahead and |
1162 // fold the inline content back together. | 1162 // fold the inline content back together. |
1163 LayoutObject* prev = oldChild->previousSibling(); | 1163 LayoutObject* prev = oldChild->previousSibling(); |
1164 LayoutObject* next = oldChild->nextSibling(); | 1164 LayoutObject* next = oldChild->nextSibling(); |
1165 bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, p
rev, next); | 1165 bool canMergeAnonymousBlocks = canMergeContiguousAnonymousBlocks(oldChild, p
rev, next); |
1166 if (canMergeAnonymousBlocks && prev && next) { | 1166 if (canMergeAnonymousBlocks && prev && next) { |
1167 prev->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 1167 prev->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutIn
validationReason::AnonymousBlockChange); |
1168 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next); | 1168 LayoutBlockFlow* nextBlock = toLayoutBlockFlow(next); |
1169 LayoutBlockFlow* prevBlock = toLayoutBlockFlow(prev); | 1169 LayoutBlockFlow* prevBlock = toLayoutBlockFlow(prev); |
1170 | 1170 |
1171 if (prev->childrenInline() != next->childrenInline()) { | 1171 if (prev->childrenInline() != next->childrenInline()) { |
1172 LayoutBlock* inlineChildrenBlock = prev->childrenInline() ? prevBloc
k : nextBlock; | 1172 LayoutBlock* inlineChildrenBlock = prev->childrenInline() ? prevBloc
k : nextBlock; |
1173 LayoutBlock* blockChildrenBlock = prev->childrenInline() ? nextBlock
: prevBlock; | 1173 LayoutBlock* blockChildrenBlock = prev->childrenInline() ? nextBlock
: prevBlock; |
1174 | 1174 |
1175 // Place the inline children block inside of the block children bloc
k instead of deleting it. | 1175 // Place the inline children block inside of the block children bloc
k instead of deleting it. |
1176 // In order to reuse it, we have to reset it to just be a generic an
onymous block. Make sure | 1176 // In order to reuse it, we have to reset it to just be a generic an
onymous block. Make sure |
1177 // to clear out inherited column properties by just making a new sty
le, and to also clear the | 1177 // to clear out inherited column properties by just making a new sty
le, and to also clear the |
1178 // column span flag if it is set. | 1178 // column span flag if it is set. |
1179 ASSERT(!inlineChildrenBlock->continuation()); | 1179 ASSERT(!inlineChildrenBlock->continuation()); |
1180 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyle
WithDisplay(styleRef(), BLOCK); | 1180 RefPtr<ComputedStyle> newStyle = ComputedStyle::createAnonymousStyle
WithDisplay(styleRef(), BLOCK); |
1181 // Cache this value as it might get changed in setStyle() call. | 1181 // Cache this value as it might get changed in setStyle() call. |
1182 bool inlineChildrenBlockHasLayer = inlineChildrenBlock->hasLayer(); | 1182 bool inlineChildrenBlockHasLayer = inlineChildrenBlock->hasLayer(); |
1183 inlineChildrenBlock->setStyle(newStyle); | 1183 inlineChildrenBlock->setStyle(newStyle); |
1184 children()->removeChildNode(this, inlineChildrenBlock, inlineChildre
nBlockHasLayer); | 1184 children()->removeChildNode(this, inlineChildrenBlock, inlineChildre
nBlockHasLayer); |
1185 | 1185 |
1186 // Now just put the inlineChildrenBlock inside the blockChildrenBloc
k. | 1186 // Now just put the inlineChildrenBlock inside the blockChildrenBloc
k. |
1187 blockChildrenBlock->children()->insertChildNode(blockChildrenBlock,
inlineChildrenBlock, prev == inlineChildrenBlock ? blockChildrenBlock->firstChil
d() : 0, | 1187 blockChildrenBlock->children()->insertChildNode(blockChildrenBlock,
inlineChildrenBlock, prev == inlineChildrenBlock ? blockChildrenBlock->firstChil
d() : 0, |
1188 inlineChildrenBlockHasLayer || blockChildrenBlock->hasLayer()); | 1188 inlineChildrenBlockHasLayer || blockChildrenBlock->hasLayer()); |
1189 next->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(); | 1189 next->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(Layo
utInvalidationReason::AnonymousBlockChange); |
1190 | 1190 |
1191 // inlineChildrenBlock got reparented to blockChildrenBlock, so it i
s no longer a child | 1191 // inlineChildrenBlock got reparented to blockChildrenBlock, so it i
s no longer a child |
1192 // of "this". we null out prev or next so that is not used later in
the function. | 1192 // of "this". we null out prev or next so that is not used later in
the function. |
1193 if (inlineChildrenBlock == prevBlock) | 1193 if (inlineChildrenBlock == prevBlock) |
1194 prev = 0; | 1194 prev = 0; |
1195 else | 1195 else |
1196 next = 0; | 1196 next = 0; |
1197 } else { | 1197 } else { |
1198 // Take all the children out of the |next| block and put them in | 1198 // Take all the children out of the |next| block and put them in |
1199 // the |prev| block. | 1199 // the |prev| block. |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1731 if (isHorizontalWritingMode() == r->isHorizontalWritingMode()) | 1731 if (isHorizontalWritingMode() == r->isHorizontalWritingMode()) |
1732 r->updateLogicalHeight(); | 1732 r->updateLogicalHeight(); |
1733 else | 1733 else |
1734 r->updateLogicalWidth(); | 1734 r->updateLogicalWidth(); |
1735 oldLogicalTop = logicalTopForChild(*r); | 1735 oldLogicalTop = logicalTopForChild(*r); |
1736 } | 1736 } |
1737 | 1737 |
1738 // FIXME: We should be able to do a r->setNeedsPositionedMovementLayout(
) here instead of a full layout. Need | 1738 // FIXME: We should be able to do a r->setNeedsPositionedMovementLayout(
) here instead of a full layout. Need |
1739 // to investigate why it does not trigger the correct invalidations in t
hat case. crbug.com/350756 | 1739 // to investigate why it does not trigger the correct invalidations in t
hat case. crbug.com/350756 |
1740 if (info == ForcedLayoutAfterContainingBlockMoved) | 1740 if (info == ForcedLayoutAfterContainingBlockMoved) |
1741 r->setNeedsLayout(MarkOnlyThis); | 1741 r->setNeedsLayout(LayoutInvalidationReason::AncestorMoved, MarkOnlyT
his); |
1742 | 1742 |
1743 r->layoutIfNeeded(); | 1743 r->layoutIfNeeded(); |
1744 | 1744 |
1745 // Lay out again if our estimate was wrong. | 1745 // Lay out again if our estimate was wrong. |
1746 if (needsBlockDirectionLocationSetBeforeLayout && logicalTopForChild(*r)
!= oldLogicalTop) | 1746 if (needsBlockDirectionLocationSetBeforeLayout && logicalTopForChild(*r)
!= oldLogicalTop) |
1747 r->forceChildLayout(); | 1747 r->forceChildLayout(); |
1748 } | 1748 } |
1749 | 1749 |
1750 if (hasColumns()) | 1750 if (hasColumns()) |
1751 view()->layoutState()->setColumnInfo(columnInfo()); // FIXME: Kind of gr
oss. We just put this back into the layout state so that pop() will work. | 1751 view()->layoutState()->setColumnInfo(columnInfo()); // FIXME: Kind of gr
oss. We just put this back into the layout state so that pop() will work. |
(...skipping 2192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3944 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const | 3944 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const |
3945 { | 3945 { |
3946 showLayoutObject(); | 3946 showLayoutObject(); |
3947 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 3947 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
3948 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 3948 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
3949 } | 3949 } |
3950 | 3950 |
3951 #endif | 3951 #endif |
3952 | 3952 |
3953 } // namespace blink | 3953 } // namespace blink |
OLD | NEW |