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

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

Issue 1423573002: Remove anonymous block wrapper when all children become inline (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month 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
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 624 matching lines...) Expand 10 before | Expand all | Expand 10 after
635 return; 635 return;
636 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInva lidationReason::ChildAnonymousBlockChanged); 636 parent->setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInva lidationReason::ChildAnonymousBlockChanged);
637 637
638 child->moveAllChildrenTo(parent, child->nextSibling(), child->hasLayer()); 638 child->moveAllChildrenTo(parent, child->nextSibling(), child->hasLayer());
639 parent->setChildrenInline(child->childrenInline()); 639 parent->setChildrenInline(child->childrenInline());
640 640
641 parent->children()->removeChildNode(parent, child, child->hasLayer()); 641 parent->children()->removeChildNode(parent, child, child->hasLayer());
642 child->destroy(); 642 child->destroy();
643 } 643 }
644 644
645 static inline bool shouldMakeChildrenInline(const LayoutBlock* block) 645 void LayoutBlock::makeChildrenInlineIfPossible()
646 { 646 {
647 if (!block->isLayoutBlockFlow()) 647 if (!isLayoutBlockFlow() || isRubyRun())
mstensho (USE GERRIT) 2015/10/22 19:19:57 Where does the ruby check come from? Do we have a
648 return false; 648 return;
649 LayoutObject* child = block->firstChild(); 649 Vector<LayoutBox*, 16> blocksToRemove;
mstensho (USE GERRIT) 2015/10/22 19:19:58 How many anonymous blocks can we possibly find her
650 LayoutObject* child = firstChild();
650 while (child) { 651 while (child) {
651 // TODO(rhogan): If we encounter anonymous blocks with inline children w e should fold them in here. 652 if (child->isAnonymousBlock() && child->childrenInline())
652 if (!child->isFloatingOrOutOfFlowPositioned()) 653 blocksToRemove.append(toLayoutBox(child));
653 return false; 654 else if (!child->isFloatingOrOutOfFlowPositioned())
655 return;
654 child = child->nextSibling(); 656 child = child->nextSibling();
655 } 657 }
656 return true; 658 for (size_t i = 0; i < blocksToRemove.size(); i++)
659 collapseAnonymousBlockChild(this, toLayoutBlock(blocksToRemove[i]));
mstensho (USE GERRIT) 2015/10/22 19:19:58 Looks like blocksToRemove should hold LayoutBlock
660 setChildrenInline(true);
657 } 661 }
658 662
659 void LayoutBlock::removeChild(LayoutObject* oldChild) 663 void LayoutBlock::removeChild(LayoutObject* oldChild)
660 { 664 {
661 // No need to waste time in merging or removing empty anonymous blocks. 665 // No need to waste time in merging or removing empty anonymous blocks.
662 // We can just bail out if our document is getting destroyed. 666 // We can just bail out if our document is getting destroyed.
663 if (documentBeingDestroyed()) { 667 if (documentBeingDestroyed()) {
664 LayoutBox::removeChild(oldChild); 668 LayoutBox::removeChild(oldChild);
665 return; 669 return;
666 } 670 }
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
751 else if (curr->isLayoutBlock()) 755 else if (curr->isLayoutBlock())
752 toLayoutBlock(curr)->setContinuation(nextContinuation); 756 toLayoutBlock(curr)->setContinuation(nextContinuation);
753 else 757 else
754 ASSERT_NOT_REACHED(); 758 ASSERT_NOT_REACHED();
755 759
756 break; 760 break;
757 } 761 }
758 setContinuation(nullptr); 762 setContinuation(nullptr);
759 destroy(); 763 destroy();
760 } 764 }
761 } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned() && shouldMakeChildrenInline(this)) { 765 } else if (!beingDestroyed() && !oldChild->isFloatingOrOutOfFlowPositioned() ) {
762 // If the child we're removing means that we can now treat all children as inline without the need for anonymous blocks, then do that. 766 // If the child we're removing means that we can now treat all children as inline without the need for anonymous blocks, then do that.
763 setChildrenInline(true); 767 makeChildrenInlineIfPossible();
764 } 768 }
765 } 769 }
766 770
767 bool LayoutBlock::isSelfCollapsingBlock() const 771 bool LayoutBlock::isSelfCollapsingBlock() const
768 { 772 {
769 // We are not self-collapsing if we 773 // We are not self-collapsing if we
770 // (a) have a non-zero height according to layout (an optimization to avoid wasting time) 774 // (a) have a non-zero height according to layout (an optimization to avoid wasting time)
771 // (b) are a table, 775 // (b) are a table,
772 // (c) have border/padding, 776 // (c) have border/padding,
773 // (d) have a min-height 777 // (d) have a min-height
(...skipping 2102 matching lines...) Expand 10 before | Expand all | Expand 10 after
2876 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const 2880 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout Object* obj) const
2877 { 2881 {
2878 showLayoutObject(); 2882 showLayoutObject();
2879 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box()) 2883 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot Box())
2880 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1); 2884 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa bel2, obj, 1);
2881 } 2885 }
2882 2886
2883 #endif 2887 #endif
2884 2888
2885 } // namespace blink 2889 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698