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

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp

Issue 1974753002: Move block container specific parts of addChild() to LayoutBlockFlow. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlock.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
index 41c2a8b01561d1995b4ed3b97965ec192ad515d5..ed57480b0e9cf27e9b4c9e038c2cb645fd8aff41 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBlockFlow.cpp
@@ -2296,7 +2296,64 @@ void LayoutBlockFlow::addChild(LayoutObject* newChild, LayoutObject* beforeChild
flowThread->addChild(newChild, beforeChild);
return;
}
- LayoutBlock::addChild(newChild, beforeChild);
+
+ if (beforeChild && beforeChild->parent() != this) {
+ addChildBeforeDescendant(newChild, beforeChild);
+ return;
+ }
+
+ bool madeBoxesNonInline = false;
+
+ // A block has to either have all of its children inline, or all of its children as blocks.
+ // So, if our children are currently inline and a block child has to be inserted, we move all our
+ // inline children into anonymous block boxes.
+ bool childIsBlockLevel = !newChild->isInline() && !newChild->isFloatingOrOutOfFlowPositioned();
+ if (childrenInline()) {
+ if (childIsBlockLevel) {
+ // Wrap the inline content in anonymous blocks, to allow for the new block child to be
+ // inserted.
+ makeChildrenNonInline(beforeChild);
+ madeBoxesNonInline = true;
+
+ if (beforeChild && beforeChild->parent() != this) {
+ beforeChild = beforeChild->parent();
+ ASSERT(beforeChild->isAnonymousBlock());
+ ASSERT(beforeChild->parent() == this);
+ }
+ }
+ } else if (!childIsBlockLevel) {
+ // This block has block children. We may want to put the new child into an anomyous
+ // block. Floats and out-of-flow children may live among either block or inline children,
+ // so for such children, only put them inside an anonymous block if one already exists. If
+ // the child is inline, on the other hand, we *have to* put it inside an anonymous block,
+ // so create a new one if there is none for us there already.
+ LayoutObject* afterChild = beforeChild ? beforeChild->previousSibling() : lastChild();
+
+ if (afterChild && afterChild->isAnonymousBlock()) {
+ afterChild->addChild(newChild);
+ return;
+ }
+
+ if (newChild->isInline()) {
+ // No suitable existing anonymous box - create a new one.
+ LayoutBlockFlow* newBlock = toLayoutBlockFlow(createAnonymousBlock());
+ LayoutBox::addChild(newBlock, beforeChild);
+ // Reparent adjacent floating or out-of-flow siblings to the new box.
+ newBlock->reparentPrecedingFloatingOrOutOfFlowSiblings();
+ newBlock->addChild(newChild);
+ newBlock->reparentSubsequentFloatingOrOutOfFlowSiblings();
+ return;
+ }
+ }
+
+ // Skip the LayoutBlock override, since that one deals with anonymous child insertion in a way
+ // that isn't sufficient for us, and can only cause trouble at this point.
+ LayoutBox::addChild(newChild, beforeChild);
+
+ if (madeBoxesNonInline && parent() && isAnonymousBlock() && parent()->isLayoutBlock()) {
+ toLayoutBlock(parent())->removeLeftoverAnonymousBlock(this);
+ // |this| may be dead now.
+ }
}
void LayoutBlockFlow::removeChild(LayoutObject* oldChild)
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutBlock.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698