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

Side by Side Diff: Source/WebCore/rendering/RenderBlock.cpp

Issue 9562026: Merge 108127 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/1025/
Patch Set: Created 8 years, 9 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 unified diff | Download patch
« no previous file with comments | « Source/WebCore/rendering/RenderBlock.h ('k') | Source/WebCore/rendering/RenderObject.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 581 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images) 592 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images)
593 // get deleted properly. Because objects moves from the pre block into the post block, we want to 593 // get deleted properly. Because objects moves from the pre block into the post block, we want to
594 // make new line boxes instead of leaving the old line boxes around. 594 // make new line boxes instead of leaving the old line boxes around.
595 pre->setNeedsLayoutAndPrefWidthsRecalc(); 595 pre->setNeedsLayoutAndPrefWidthsRecalc();
596 block->setNeedsLayoutAndPrefWidthsRecalc(); 596 block->setNeedsLayoutAndPrefWidthsRecalc();
597 post->setNeedsLayoutAndPrefWidthsRecalc(); 597 post->setNeedsLayoutAndPrefWidthsRecalc();
598 } 598 }
599 599
600 RenderObject* RenderBlock::splitAnonymousBlocksAroundChild(RenderObject* beforeC hild) 600 RenderObject* RenderBlock::splitAnonymousBlocksAroundChild(RenderObject* beforeC hild)
601 { 601 {
602 if (beforeChild->isTablePart())
603 beforeChild = splitTablePartsAroundChild(beforeChild);
604
602 while (beforeChild->parent() != this) { 605 while (beforeChild->parent() != this) {
603 RenderBlock* blockToSplit = toRenderBlock(beforeChild->parent()); 606 RenderBlock* blockToSplit = toRenderBlock(beforeChild->parent());
604 if (blockToSplit->firstChild() != beforeChild) { 607 if (blockToSplit->firstChild() != beforeChild) {
605 // We have to split the parentBlock into two blocks. 608 // We have to split the parentBlock into two blocks.
606 RenderBlock* post = createAnonymousBlockWithSameTypeAs(blockToSplit) ; 609 RenderBlock* post = createAnonymousBlockWithSameTypeAs(blockToSplit) ;
607 post->setChildrenInline(blockToSplit->childrenInline()); 610 post->setChildrenInline(blockToSplit->childrenInline());
608 RenderBlock* parentBlock = toRenderBlock(blockToSplit->parent()); 611 RenderBlock* parentBlock = toRenderBlock(blockToSplit->parent());
609 parentBlock->children()->insertChildNode(parentBlock, post, blockToS plit->nextSibling()); 612 parentBlock->children()->insertChildNode(parentBlock, post, blockToS plit->nextSibling());
610 blockToSplit->moveChildrenTo(post, beforeChild, 0, blockToSplit->has Layer()); 613 blockToSplit->moveChildrenTo(post, beforeChild, 0, blockToSplit->has Layer());
611 post->setNeedsLayoutAndPrefWidthsRecalc(); 614 post->setNeedsLayoutAndPrefWidthsRecalc();
612 blockToSplit->setNeedsLayoutAndPrefWidthsRecalc(); 615 blockToSplit->setNeedsLayoutAndPrefWidthsRecalc();
613 beforeChild = post; 616 beforeChild = post;
614 } else 617 } else
615 beforeChild = blockToSplit; 618 beforeChild = blockToSplit;
616 } 619 }
617 return beforeChild; 620 return beforeChild;
618 } 621 }
619 622
623 static void markTableForSectionAndCellRecalculation(RenderObject* child)
624 {
625 RenderObject* curr = child;
626 while (!curr->isTable()) {
627 if (curr->isTableSection())
628 toRenderTableSection(curr)->setNeedsCellRecalc();
629 curr = curr->parent();
630 }
631
632 RenderTable* table = toRenderTable(curr);
633 table->setNeedsSectionRecalc();
634 table->setNeedsLayoutAndPrefWidthsRecalc();
635 }
636
637 static void moveAllTableChildrenTo(RenderObject* fromTablePart, RenderTable* toT able, RenderObject* startChild)
638 {
639 for (RenderObject* curr = startChild; curr;) {
640 // Need to store next sibling as we won't have access to it
641 // after we are removed from table.
642 RenderObject* next = curr->nextSibling();
643 fromTablePart->removeChild(curr);
644 toTable->addChild(curr);
645 if (curr->isTableSection())
646 toRenderTableSection(curr)->setNeedsCellRecalc();
647 curr->setNeedsLayoutAndPrefWidthsRecalc();
648 curr = next;
649 }
650
651 // This marks fromTable for section and cell recalculation.
652 markTableForSectionAndCellRecalculation(fromTablePart);
653
654 // startChild is now part of toTable. This marks toTable for section and cel l recalculation.
655 markTableForSectionAndCellRecalculation(startChild);
656 }
657
658 RenderObject* RenderBlock::splitTablePartsAroundChild(RenderObject* beforeChild)
659 {
660 ASSERT(beforeChild->isTablePart());
661
662 while (beforeChild->parent() != this && !beforeChild->isTable()) {
663 RenderObject* tablePartToSplit = beforeChild->parent();
664 if (tablePartToSplit->firstChild() != beforeChild) {
665 // Get our table container.
666 RenderObject* curr = tablePartToSplit;
667 while (!curr->isTable())
668 curr = curr->parent();
669 RenderTable* table = toRenderTable(curr);
670
671 // Create an anonymous table container next to our table container.
672 RenderBlock* parentBlock = toRenderBlock(table->parent());
673 RenderTable* postTable = parentBlock->createAnonymousTable();
674 parentBlock->children()->insertChildNode(parentBlock, postTable, tab le->nextSibling());
675
676 // Move all the children from beforeChild to the newly created anony mous table container.
677 moveAllTableChildrenTo(tablePartToSplit, postTable, beforeChild);
678
679 beforeChild = postTable;
680 } else
681 beforeChild = tablePartToSplit;
682 }
683 return beforeChild;
684 }
685
620 void RenderBlock::makeChildrenAnonymousColumnBlocks(RenderObject* beforeChild, R enderBlock* newBlockBox, RenderObject* newChild) 686 void RenderBlock::makeChildrenAnonymousColumnBlocks(RenderObject* beforeChild, R enderBlock* newBlockBox, RenderObject* newChild)
621 { 687 {
622 RenderBlock* pre = 0; 688 RenderBlock* pre = 0;
623 RenderBlock* post = 0; 689 RenderBlock* post = 0;
624 RenderBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable 690 RenderBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable
625 // so that we don't have to patch all of the rest of the code later on. 691 // so that we don't have to patch all of the rest of the code later on.
626 692
627 // Delete the block's line boxes before we do the split. 693 // Delete the block's line boxes before we do the split.
628 block->deleteLineBoxTree(); 694 block->deleteLineBoxTree();
629 695
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
726 if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COL UMN_GROUP) 792 if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COL UMN_GROUP)
727 || (newChild->isTableCaption()) 793 || (newChild->isTableCaption())
728 || newChild->isTableSection() 794 || newChild->isTableSection()
729 || newChild->isTableRow() 795 || newChild->isTableRow()
730 || newChild->isTableCell()) { 796 || newChild->isTableCell()) {
731 // Insert into the anonymous table. 797 // Insert into the anonymous table.
732 beforeChildAnonymousContainer->addChild(newChild, beforeChild); 798 beforeChildAnonymousContainer->addChild(newChild, beforeChild);
733 return; 799 return;
734 } 800 }
735 801
736 // Go on to insert before the anonymous table. 802 beforeChild = splitTablePartsAroundChild(beforeChild);
737 beforeChild = beforeChildAnonymousContainer;
738 } 803 }
739 804
740 // Check for a spanning element in columns. 805 // Check for a spanning element in columns.
741 RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild) ; 806 RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild) ;
742 if (columnsBlockAncestor) { 807 if (columnsBlockAncestor) {
743 // We are placing a column-span element inside a block. 808 // We are placing a column-span element inside a block.
744 RenderBlock* newBox = createAnonymousColumnSpanBlock(); 809 RenderBlock* newBox = createAnonymousColumnSpanBlock();
745 810
746 if (columnsBlockAncestor != this) { 811 if (columnsBlockAncestor != this) {
747 // We are nested inside a multi-column element and are being split b y the span. We have to break up 812 // We are nested inside a multi-column element and are being split b y the span. We have to break up
(...skipping 6365 matching lines...) Expand 10 before | Expand all | Expand 10 after
7113 } 7178 }
7114 7179
7115 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 7180 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
7116 { 7181 {
7117 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY()); 7182 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY());
7118 } 7183 }
7119 7184
7120 #endif 7185 #endif
7121 7186
7122 } // namespace WebCore 7187 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/WebCore/rendering/RenderBlock.h ('k') | Source/WebCore/rendering/RenderObject.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698