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 1005 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1016 } | 1016 } |
1017 | 1017 |
1018 #if ENABLE(ASSERT) | 1018 #if ENABLE(ASSERT) |
1019 for (LayoutObject *c = firstChild(); c; c = c->nextSibling()) | 1019 for (LayoutObject *c = firstChild(); c; c = c->nextSibling()) |
1020 ASSERT(!c->isInline()); | 1020 ASSERT(!c->isInline()); |
1021 #endif | 1021 #endif |
1022 | 1022 |
1023 setShouldDoFullPaintInvalidation(); | 1023 setShouldDoFullPaintInvalidation(); |
1024 } | 1024 } |
1025 | 1025 |
| 1026 void LayoutBlock::promoteAllChildrenAndInsertAfter() |
| 1027 { |
| 1028 LayoutObject* firstPromotee = firstChild(); |
| 1029 if (!firstPromotee) |
| 1030 return; |
| 1031 LayoutObject* lastPromotee = lastChild(); |
| 1032 LayoutBlock* parent = toLayoutBlock(this->parent()); |
| 1033 LayoutObject* nextSiblingOfPromotees = nextSibling(); |
| 1034 for (LayoutObject* o = firstPromotee; o; o = o->nextSibling()) |
| 1035 o->setParent(parent); |
| 1036 children()->setFirstChild(nullptr); |
| 1037 children()->setLastChild(nullptr); |
| 1038 firstPromotee->setPreviousSibling(this); |
| 1039 setNextSibling(firstPromotee); |
| 1040 lastPromotee->setNextSibling(nextSiblingOfPromotees); |
| 1041 if (nextSiblingOfPromotees) |
| 1042 nextSiblingOfPromotees->setPreviousSibling(lastPromotee); |
| 1043 if (parent->children()->lastChild() == this) |
| 1044 parent->children()->setLastChild(lastPromotee); |
| 1045 } |
| 1046 |
1026 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) | 1047 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) |
1027 { | 1048 { |
1028 ASSERT(child->isAnonymousBlock()); | 1049 ASSERT(child->isAnonymousBlock()); |
1029 ASSERT(!child->childrenInline()); | 1050 ASSERT(!child->childrenInline()); |
| 1051 ASSERT(child->parent() == this); |
1030 | 1052 |
1031 if (child->continuation() || (child->firstChild() && (child->isAnonymousColu
mnSpanBlock() || child->isAnonymousColumnsBlock()))) | 1053 if (child->continuation() || (child->firstChild() && (child->isAnonymousColu
mnSpanBlock() || child->isAnonymousColumnsBlock()))) |
1032 return; | 1054 return; |
1033 | 1055 |
1034 LayoutObject* firstAnChild = child->m_children.firstChild(); | 1056 // Promote all the leftover anonymous block's children (to become children o
f this block |
1035 LayoutObject* lastAnChild = child->m_children.lastChild(); | 1057 // instead). We still want to keep the leftover block in the tree for a mome
nt, for notification |
1036 if (firstAnChild) { | 1058 // purposes done further below (flow threads and grids). |
1037 LayoutObject* o = firstAnChild; | 1059 child->promoteAllChildrenAndInsertAfter(); |
1038 while (o) { | |
1039 o->setParent(this); | |
1040 o = o->nextSibling(); | |
1041 } | |
1042 firstAnChild->setPreviousSibling(child->previousSibling()); | |
1043 lastAnChild->setNextSibling(child->nextSibling()); | |
1044 if (child->previousSibling()) | |
1045 child->previousSibling()->setNextSibling(firstAnChild); | |
1046 if (child->nextSibling()) | |
1047 child->nextSibling()->setPreviousSibling(lastAnChild); | |
1048 | |
1049 if (child == m_children.firstChild()) | |
1050 m_children.setFirstChild(firstAnChild); | |
1051 if (child == m_children.lastChild()) | |
1052 m_children.setLastChild(lastAnChild); | |
1053 } else { | |
1054 if (child == m_children.firstChild()) | |
1055 m_children.setFirstChild(child->nextSibling()); | |
1056 if (child == m_children.lastChild()) | |
1057 m_children.setLastChild(child->previousSibling()); | |
1058 | |
1059 if (child->previousSibling()) | |
1060 child->previousSibling()->setNextSibling(child->nextSibling()); | |
1061 if (child->nextSibling()) | |
1062 child->nextSibling()->setPreviousSibling(child->previousSibling()); | |
1063 } | |
1064 | |
1065 child->children()->setFirstChild(0); | |
1066 child->m_next = nullptr; | |
1067 | 1060 |
1068 // Remove all the information in the flow thread associated with the leftove
r anonymous block. | 1061 // Remove all the information in the flow thread associated with the leftove
r anonymous block. |
1069 child->removeFromLayoutFlowThread(); | 1062 child->removeFromLayoutFlowThread(); |
1070 | 1063 |
1071 // LayoutGrid keeps track of its children, we must notify it about changes i
n the tree. | 1064 // LayoutGrid keeps track of its children, we must notify it about changes i
n the tree. |
1072 if (child->parent()->isLayoutGrid()) | 1065 if (child->parent()->isLayoutGrid()) |
1073 toLayoutGrid(child->parent())->dirtyGrid(); | 1066 toLayoutGrid(child->parent())->dirtyGrid(); |
1074 | 1067 |
1075 child->setParent(0); | 1068 // Now remove the leftover anonymous block from the tree, and destroy it. We
'll rip it out |
1076 child->setPreviousSibling(0); | 1069 // manually from the tree before destroying it, because we don't want to tri
gger any tree |
1077 child->setNextSibling(0); | 1070 // adjustments with regards to anonymous blocks (or any other kind of undesi
red chain-reaction). |
1078 | 1071 children()->removeChildNode(this, child, false); |
1079 child->destroy(); | 1072 child->destroy(); |
1080 } | 1073 } |
1081 | 1074 |
1082 static bool canMergeContiguousAnonymousBlocks(LayoutObject* oldChild, LayoutObje
ct* prev, LayoutObject* next) | 1075 static bool canMergeContiguousAnonymousBlocks(LayoutObject* oldChild, LayoutObje
ct* prev, LayoutObject* next) |
1083 { | 1076 { |
1084 if (oldChild->documentBeingDestroyed() || oldChild->isInline() || oldChild->
virtualContinuation()) | 1077 if (oldChild->documentBeingDestroyed() || oldChild->isInline() || oldChild->
virtualContinuation()) |
1085 return false; | 1078 return false; |
1086 | 1079 |
1087 if ((prev && (!prev->isAnonymousBlock() || toLayoutBlock(prev)->continuation
() || toLayoutBlock(prev)->beingDestroyed())) | 1080 if ((prev && (!prev->isAnonymousBlock() || toLayoutBlock(prev)->continuation
() || toLayoutBlock(prev)->beingDestroyed())) |
1088 || (next && (!next->isAnonymousBlock() || toLayoutBlock(next)->continuat
ion() || toLayoutBlock(next)->beingDestroyed()))) | 1081 || (next && (!next->isAnonymousBlock() || toLayoutBlock(next)->continuat
ion() || toLayoutBlock(next)->beingDestroyed()))) |
(...skipping 2840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3929 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 |
3930 { | 3923 { |
3931 showLayoutObject(); | 3924 showLayoutObject(); |
3932 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 3925 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
3933 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 3926 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
3934 } | 3927 } |
3935 | 3928 |
3936 #endif | 3929 #endif |
3937 | 3930 |
3938 } // namespace blink | 3931 } // namespace blink |
OLD | NEW |