Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| index 2ef3c37559e0d29a34041f50adb818f5bc5297d8..0a898a5bad19f29d0a3221d3952b3098f280dfd0 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp |
| @@ -377,47 +377,56 @@ bool LayoutBlock::allowsOverflowClip() const |
| return node() != document().viewportDefiningElement(); |
| } |
| -void LayoutBlock::addChild(LayoutObject* newChild, LayoutObject* beforeChild) |
| -{ |
| - if (beforeChild && beforeChild->parent() != this) { |
| - LayoutObject* beforeChildContainer = beforeChild->parent(); |
| - while (beforeChildContainer->parent() != this) |
| - beforeChildContainer = beforeChildContainer->parent(); |
| - ASSERT(beforeChildContainer); |
| - |
| - if (beforeChildContainer->isAnonymous()) { |
| - // If the requested beforeChild is not one of our children, then this is because |
| - // there is an anonymous container within this object that contains the beforeChild. |
| - LayoutObject* beforeChildAnonymousContainer = beforeChildContainer; |
| - if (beforeChildAnonymousContainer->isAnonymousBlock() |
| - // Full screen layoutObjects and full screen placeholders act as anonymous blocks, not tables: |
| - || beforeChildAnonymousContainer->isLayoutFullScreen() |
| - || beforeChildAnonymousContainer->isLayoutFullScreenPlaceholder() |
| - ) { |
| - // Insert the child into the anonymous block box instead of here. |
| - if (newChild->isInline() || newChild->isFloatingOrOutOfFlowPositioned() || beforeChild->parent()->slowFirstChild() != beforeChild) |
| - beforeChild->parent()->addChild(newChild, beforeChild); |
| - else |
| - addChild(newChild, beforeChild->parent()); |
| - return; |
| - } |
| +void LayoutBlock::addChildBeforeDescendant(LayoutObject* newChild, LayoutObject* beforeDescendant) |
| +{ |
| + ASSERT(beforeDescendant->parent() != this); |
| + LayoutObject* beforeDescendantContainer = beforeDescendant->parent(); |
| + while (beforeDescendantContainer->parent() != this) |
| + beforeDescendantContainer = beforeDescendantContainer->parent(); |
| + ASSERT(beforeDescendantContainer); |
| + |
| + // We really can't go on if what we have found isn't anonymous. We're not supposed to use some |
| + // random non-anonymous object and put the child there. That's a recipe for security issues. |
| + RELEASE_ASSERT(beforeDescendantContainer->isAnonymous()); |
|
mstensho (USE GERRIT)
2016/05/11 21:06:00
Here's a difference. We previously allowed this si
eae
2016/05/11 21:10:11
Yay!
|
| + |
| + // If the requested insertion point is not one of our children, then this is because |
| + // there is an anonymous container within this object that contains the beforeDescendant. |
| + if (beforeDescendantContainer->isAnonymousBlock() |
| + // Full screen layoutObjects and full screen placeholders act as anonymous blocks, not tables: |
| + || beforeDescendantContainer->isLayoutFullScreen() |
| + || beforeDescendantContainer->isLayoutFullScreenPlaceholder()) { |
| + // Insert the child into the anonymous block box instead of here. |
| + if (newChild->isInline() || newChild->isFloatingOrOutOfFlowPositioned() || beforeDescendant->parent()->slowFirstChild() != beforeDescendant) |
| + beforeDescendant->parent()->addChild(newChild, beforeDescendant); |
| + else |
| + addChild(newChild, beforeDescendant->parent()); |
| + return; |
| + } |
| - ASSERT(beforeChildAnonymousContainer->isTable()); |
| - if (newChild->isTablePart()) { |
| - // Insert into the anonymous table. |
| - beforeChildAnonymousContainer->addChild(newChild, beforeChild); |
| - return; |
| - } |
| + ASSERT(beforeDescendantContainer->isTable()); |
| + if (newChild->isTablePart()) { |
| + // Insert into the anonymous table. |
| + beforeDescendantContainer->addChild(newChild, beforeDescendant); |
| + return; |
| + } |
| - beforeChild = splitAnonymousBoxesAroundChild(beforeChild); |
| + LayoutObject* beforeChild = splitAnonymousBoxesAroundChild(beforeDescendant); |
| - ASSERT(beforeChild->parent() == this); |
| - if (beforeChild->parent() != this) { |
| - // We should never reach here. If we do, we need to use the |
| - // safe fallback to use the topmost beforeChild container. |
| - beforeChild = beforeChildContainer; |
| - } |
| - } |
| + ASSERT(beforeChild->parent() == this); |
| + if (beforeChild->parent() != this) { |
| + // We should never reach here. If we do, we need to use the |
| + // safe fallback to use the topmost beforeChild container. |
| + beforeChild = beforeDescendantContainer; |
| + } |
| + |
| + addChild(newChild, beforeChild); |
| +} |
| + |
| +void LayoutBlock::addChild(LayoutObject* newChild, LayoutObject* beforeChild) |
| +{ |
| + if (beforeChild && beforeChild->parent() != this) { |
| + addChildBeforeDescendant(newChild, beforeChild); |
| + return; |
| } |
| bool madeBoxesNonInline = false; |