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 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 } | 546 } |
547 | 547 |
548 #if ENABLE(ASSERT) | 548 #if ENABLE(ASSERT) |
549 for (LayoutObject *c = firstChild(); c; c = c->nextSibling()) | 549 for (LayoutObject *c = firstChild(); c; c = c->nextSibling()) |
550 ASSERT(!c->isInline()); | 550 ASSERT(!c->isInline()); |
551 #endif | 551 #endif |
552 | 552 |
553 setShouldDoFullPaintInvalidation(); | 553 setShouldDoFullPaintInvalidation(); |
554 } | 554 } |
555 | 555 |
556 void LayoutBlock::promoteAllChildrenAndInsertAfter() | |
557 { | |
558 LayoutObject* firstPromotee = firstChild(); | |
559 if (!firstPromotee) | |
560 return; | |
561 LayoutObject* lastPromotee = lastChild(); | |
562 LayoutBlock* parent = toLayoutBlock(this->parent()); | |
563 LayoutObject* nextSiblingOfPromotees = nextSibling(); | |
564 for (LayoutObject* o = firstPromotee; o; o = o->nextSibling()) | |
565 o->setParent(parent); | |
566 children()->setFirstChild(nullptr); | |
567 children()->setLastChild(nullptr); | |
568 firstPromotee->setPreviousSibling(this); | |
569 setNextSibling(firstPromotee); | |
570 lastPromotee->setNextSibling(nextSiblingOfPromotees); | |
571 if (nextSiblingOfPromotees) | |
572 nextSiblingOfPromotees->setPreviousSibling(lastPromotee); | |
573 if (parent->children()->lastChild() == this) | |
574 parent->children()->setLastChild(lastPromotee); | |
575 } | |
576 | |
577 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) | 556 void LayoutBlock::removeLeftoverAnonymousBlock(LayoutBlock* child) |
578 { | 557 { |
579 ASSERT(child->isAnonymousBlock()); | 558 ASSERT(child->isAnonymousBlock()); |
580 ASSERT(!child->childrenInline()); | 559 ASSERT(!child->childrenInline()); |
581 ASSERT(child->parent() == this); | 560 ASSERT(child->parent() == this); |
582 | 561 |
583 if (child->continuation()) | 562 if (child->continuation()) |
584 return; | 563 return; |
585 | 564 |
586 // Promote all the leftover anonymous block's children (to become children o
f this block | 565 // Promote all the leftover anonymous block's children (to become children o
f this block |
587 // instead). We still want to keep the leftover block in the tree for a mome
nt, for notification | 566 // instead). We still want to keep the leftover block in the tree for a mome
nt, for notification |
588 // purposes done further below (flow threads and grids). | 567 // purposes done further below (flow threads and grids). |
589 child->promoteAllChildrenAndInsertAfter(); | 568 child->moveAllChildrenTo(this, child->nextSibling()); |
590 | 569 |
591 // Remove all the information in the flow thread associated with the leftove
r anonymous block. | 570 // Remove all the information in the flow thread associated with the leftove
r anonymous block. |
592 child->removeFromLayoutFlowThread(); | 571 child->removeFromLayoutFlowThread(); |
593 | 572 |
594 // LayoutGrid keeps track of its children, we must notify it about changes i
n the tree. | 573 // LayoutGrid keeps track of its children, we must notify it about changes i
n the tree. |
595 if (child->parent()->isLayoutGrid()) | 574 if (child->parent()->isLayoutGrid()) |
596 toLayoutGrid(child->parent())->dirtyGrid(); | 575 toLayoutGrid(child->parent())->dirtyGrid(); |
597 | 576 |
598 // Now remove the leftover anonymous block from the tree, and destroy it. We
'll rip it out | 577 // Now remove the leftover anonymous block from the tree, and destroy it. We
'll rip it out |
599 // manually from the tree before destroying it, because we don't want to tri
gger any tree | 578 // manually from the tree before destroying it, because we don't want to tri
gger any tree |
(...skipping 2171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2771 if (layoutObject->isOutOfFlowPositioned() || !layoutObject->needsOverflowRec
alcAfterStyleChange()) | 2750 if (layoutObject->isOutOfFlowPositioned() || !layoutObject->needsOverflowRec
alcAfterStyleChange()) |
2772 return false; | 2751 return false; |
2773 | 2752 |
2774 ASSERT(layoutObject->isLayoutBlock()); | 2753 ASSERT(layoutObject->isLayoutBlock()); |
2775 return toLayoutBlock(layoutObject)->recalcOverflowAfterStyleChange(); | 2754 return toLayoutBlock(layoutObject)->recalcOverflowAfterStyleChange(); |
2776 } | 2755 } |
2777 | 2756 |
2778 bool LayoutBlock::recalcChildOverflowAfterStyleChange() | 2757 bool LayoutBlock::recalcChildOverflowAfterStyleChange() |
2779 { | 2758 { |
2780 ASSERT(childNeedsOverflowRecalcAfterStyleChange()); | 2759 ASSERT(childNeedsOverflowRecalcAfterStyleChange()); |
2781 setChildNeedsOverflowRecalcAfterStyleChange(false); | 2760 clearChildNeedsOverflowRecalcAfterStyleChange(); |
2782 | 2761 |
2783 bool childrenOverflowChanged = false; | 2762 bool childrenOverflowChanged = false; |
2784 | 2763 |
2785 if (childrenInline()) { | 2764 if (childrenInline()) { |
2786 ListHashSet<RootInlineBox*> lineBoxes; | 2765 ListHashSet<RootInlineBox*> lineBoxes; |
2787 ASSERT_WITH_SECURITY_IMPLICATION(isLayoutBlockFlow()); | 2766 ASSERT_WITH_SECURITY_IMPLICATION(isLayoutBlockFlow()); |
2788 for (InlineWalker walker(toLayoutBlockFlow(this)); !walker.atEnd(); walk
er.advance()) { | 2767 for (InlineWalker walker(toLayoutBlockFlow(this)); !walker.atEnd(); walk
er.advance()) { |
2789 LayoutObject* layoutObject = walker.current(); | 2768 LayoutObject* layoutObject = walker.current(); |
2790 if (recalcNormalFlowChildOverflowIfNeeded(layoutObject)) { | 2769 if (recalcNormalFlowChildOverflowIfNeeded(layoutObject)) { |
2791 childrenOverflowChanged = true; | 2770 childrenOverflowChanged = true; |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2827 { | 2806 { |
2828 ASSERT(needsOverflowRecalcAfterStyleChange()); | 2807 ASSERT(needsOverflowRecalcAfterStyleChange()); |
2829 | 2808 |
2830 bool childrenOverflowChanged = false; | 2809 bool childrenOverflowChanged = false; |
2831 if (childNeedsOverflowRecalcAfterStyleChange()) | 2810 if (childNeedsOverflowRecalcAfterStyleChange()) |
2832 childrenOverflowChanged = recalcChildOverflowAfterStyleChange(); | 2811 childrenOverflowChanged = recalcChildOverflowAfterStyleChange(); |
2833 | 2812 |
2834 if (!selfNeedsOverflowRecalcAfterStyleChange() && !childrenOverflowChanged) | 2813 if (!selfNeedsOverflowRecalcAfterStyleChange() && !childrenOverflowChanged) |
2835 return false; | 2814 return false; |
2836 | 2815 |
2837 setSelfNeedsOverflowRecalcAfterStyleChange(false); | 2816 clearSelfNeedsOverflowRecalcAfterStyleChange(); |
2838 // If the current block needs layout, overflow will be recalculated during | 2817 // If the current block needs layout, overflow will be recalculated during |
2839 // layout time anyway. We can safely exit here. | 2818 // layout time anyway. We can safely exit here. |
2840 if (needsLayout()) | 2819 if (needsLayout()) |
2841 return false; | 2820 return false; |
2842 | 2821 |
2843 LayoutUnit oldClientAfterEdge = hasOverflowModel() ? m_overflow->layoutClien
tAfterEdge() : clientLogicalBottom(); | 2822 LayoutUnit oldClientAfterEdge = hasOverflowModel() ? m_overflow->layoutClien
tAfterEdge() : clientLogicalBottom(); |
2844 computeOverflow(oldClientAfterEdge); | 2823 computeOverflow(oldClientAfterEdge); |
2845 | 2824 |
2846 if (hasOverflowClip()) | 2825 if (hasOverflowClip()) |
2847 layer()->scrollableArea()->updateAfterOverflowRecalc(); | 2826 layer()->scrollableArea()->updateAfterOverflowRecalc(); |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2918 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const | 2897 void LayoutBlock::showLineTreeAndMark(const InlineBox* markedBox1, const char* m
arkedLabel1, const InlineBox* markedBox2, const char* markedLabel2, const Layout
Object* obj) const |
2919 { | 2898 { |
2920 showLayoutObject(); | 2899 showLayoutObject(); |
2921 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) | 2900 for (const RootInlineBox* root = firstRootBox(); root; root = root->nextRoot
Box()) |
2922 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); | 2901 root->showLineTreeAndMark(markedBox1, markedLabel1, markedBox2, markedLa
bel2, obj, 1); |
2923 } | 2902 } |
2924 | 2903 |
2925 #endif | 2904 #endif |
2926 | 2905 |
2927 } // namespace blink | 2906 } // namespace blink |
OLD | NEW |