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

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

Issue 9568032: Merge 108127 (Closed) Base URL: http://svn.webkit.org/repository/webkit/branches/chromium/963/
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 575 matching lines...) Expand 10 before | Expand all | Expand 10 after
586 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images) 586 // Always just do a full layout in order to ensure that line boxes (especial ly wrappers for images)
587 // get deleted properly. Because objects moves from the pre block into the post block, we want to 587 // get deleted properly. Because objects moves from the pre block into the post block, we want to
588 // make new line boxes instead of leaving the old line boxes around. 588 // make new line boxes instead of leaving the old line boxes around.
589 pre->setNeedsLayoutAndPrefWidthsRecalc(); 589 pre->setNeedsLayoutAndPrefWidthsRecalc();
590 block->setNeedsLayoutAndPrefWidthsRecalc(); 590 block->setNeedsLayoutAndPrefWidthsRecalc();
591 post->setNeedsLayoutAndPrefWidthsRecalc(); 591 post->setNeedsLayoutAndPrefWidthsRecalc();
592 } 592 }
593 593
594 RenderObject* RenderBlock::splitAnonymousBlocksAroundChild(RenderObject* beforeC hild) 594 RenderObject* RenderBlock::splitAnonymousBlocksAroundChild(RenderObject* beforeC hild)
595 { 595 {
596 if (beforeChild->isTablePart())
597 beforeChild = splitTablePartsAroundChild(beforeChild);
598
596 while (beforeChild->parent() != this) { 599 while (beforeChild->parent() != this) {
597 RenderBlock* blockToSplit = toRenderBlock(beforeChild->parent()); 600 RenderBlock* blockToSplit = toRenderBlock(beforeChild->parent());
598 if (blockToSplit->firstChild() != beforeChild) { 601 if (blockToSplit->firstChild() != beforeChild) {
599 // We have to split the parentBlock into two blocks. 602 // We have to split the parentBlock into two blocks.
600 RenderBlock* post = createAnonymousBlockWithSameTypeAs(blockToSplit) ; 603 RenderBlock* post = createAnonymousBlockWithSameTypeAs(blockToSplit) ;
601 post->setChildrenInline(blockToSplit->childrenInline()); 604 post->setChildrenInline(blockToSplit->childrenInline());
602 RenderBlock* parentBlock = toRenderBlock(blockToSplit->parent()); 605 RenderBlock* parentBlock = toRenderBlock(blockToSplit->parent());
603 parentBlock->children()->insertChildNode(parentBlock, post, blockToS plit->nextSibling()); 606 parentBlock->children()->insertChildNode(parentBlock, post, blockToS plit->nextSibling());
604 blockToSplit->moveChildrenTo(post, beforeChild, 0, blockToSplit->has Layer()); 607 blockToSplit->moveChildrenTo(post, beforeChild, 0, blockToSplit->has Layer());
605 post->setNeedsLayoutAndPrefWidthsRecalc(); 608 post->setNeedsLayoutAndPrefWidthsRecalc();
606 blockToSplit->setNeedsLayoutAndPrefWidthsRecalc(); 609 blockToSplit->setNeedsLayoutAndPrefWidthsRecalc();
607 beforeChild = post; 610 beforeChild = post;
608 } else 611 } else
609 beforeChild = blockToSplit; 612 beforeChild = blockToSplit;
610 } 613 }
611 return beforeChild; 614 return beforeChild;
612 } 615 }
613 616
617 static void markTableForSectionAndCellRecalculation(RenderObject* child)
618 {
619 RenderObject* curr = child;
620 while (!curr->isTable()) {
621 if (curr->isTableSection())
622 toRenderTableSection(curr)->setNeedsCellRecalc();
623 curr = curr->parent();
624 }
625
626 RenderTable* table = toRenderTable(curr);
627 table->setNeedsSectionRecalc();
628 table->setNeedsLayoutAndPrefWidthsRecalc();
629 }
630
631 static void moveAllTableChildrenTo(RenderObject* fromTablePart, RenderTable* toT able, RenderObject* startChild)
632 {
633 for (RenderObject* curr = startChild; curr;) {
634 // Need to store next sibling as we won't have access to it
635 // after we are removed from table.
636 RenderObject* next = curr->nextSibling();
637 fromTablePart->removeChild(curr);
638 toTable->addChild(curr);
639 if (curr->isTableSection())
640 toRenderTableSection(curr)->setNeedsCellRecalc();
641 curr->setNeedsLayoutAndPrefWidthsRecalc();
642 curr = next;
643 }
644
645 // This marks fromTable for section and cell recalculation.
646 markTableForSectionAndCellRecalculation(fromTablePart);
647
648 // startChild is now part of toTable. This marks toTable for section and cel l recalculation.
649 markTableForSectionAndCellRecalculation(startChild);
650 }
651
652 RenderObject* RenderBlock::splitTablePartsAroundChild(RenderObject* beforeChild)
653 {
654 ASSERT(beforeChild->isTablePart());
655
656 while (beforeChild->parent() != this && !beforeChild->isTable()) {
657 RenderObject* tablePartToSplit = beforeChild->parent();
658 if (tablePartToSplit->firstChild() != beforeChild) {
659 // Get our table container.
660 RenderObject* curr = tablePartToSplit;
661 while (!curr->isTable())
662 curr = curr->parent();
663 RenderTable* table = toRenderTable(curr);
664
665 // Create an anonymous table container next to our table container.
666 RenderBlock* parentBlock = toRenderBlock(table->parent());
667 RenderTable* postTable = parentBlock->createAnonymousTable();
668 parentBlock->children()->insertChildNode(parentBlock, postTable, tab le->nextSibling());
669
670 // Move all the children from beforeChild to the newly created anony mous table container.
671 moveAllTableChildrenTo(tablePartToSplit, postTable, beforeChild);
672
673 beforeChild = postTable;
674 } else
675 beforeChild = tablePartToSplit;
676 }
677 return beforeChild;
678 }
679
614 void RenderBlock::makeChildrenAnonymousColumnBlocks(RenderObject* beforeChild, R enderBlock* newBlockBox, RenderObject* newChild) 680 void RenderBlock::makeChildrenAnonymousColumnBlocks(RenderObject* beforeChild, R enderBlock* newBlockBox, RenderObject* newChild)
615 { 681 {
616 RenderBlock* pre = 0; 682 RenderBlock* pre = 0;
617 RenderBlock* post = 0; 683 RenderBlock* post = 0;
618 RenderBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable 684 RenderBlock* block = this; // Eventually block will not just be |this|, but will also be a block nested inside |this|. Assign to a variable
619 // so that we don't have to patch all of the rest of the code later on. 685 // so that we don't have to patch all of the rest of the code later on.
620 686
621 // Delete the block's line boxes before we do the split. 687 // Delete the block's line boxes before we do the split.
622 block->deleteLineBoxTree(); 688 block->deleteLineBoxTree();
623 689
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COL UMN_GROUP) 786 if ((newChild->isTableCol() && newChild->style()->display() == TABLE_COL UMN_GROUP)
721 || (newChild->isTableCaption()) 787 || (newChild->isTableCaption())
722 || newChild->isTableSection() 788 || newChild->isTableSection()
723 || newChild->isTableRow() 789 || newChild->isTableRow()
724 || newChild->isTableCell()) { 790 || newChild->isTableCell()) {
725 // Insert into the anonymous table. 791 // Insert into the anonymous table.
726 beforeChildAnonymousContainer->addChild(newChild, beforeChild); 792 beforeChildAnonymousContainer->addChild(newChild, beforeChild);
727 return; 793 return;
728 } 794 }
729 795
730 // Go on to insert before the anonymous table. 796 beforeChild = splitTablePartsAroundChild(beforeChild);
731 beforeChild = beforeChildAnonymousContainer;
732 } 797 }
733 798
734 // Check for a spanning element in columns. 799 // Check for a spanning element in columns.
735 RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild) ; 800 RenderBlock* columnsBlockAncestor = columnsBlockForSpanningElement(newChild) ;
736 if (columnsBlockAncestor) { 801 if (columnsBlockAncestor) {
737 // We are placing a column-span element inside a block. 802 // We are placing a column-span element inside a block.
738 RenderBlock* newBox = createAnonymousColumnSpanBlock(); 803 RenderBlock* newBox = createAnonymousColumnSpanBlock();
739 804
740 if (columnsBlockAncestor != this) { 805 if (columnsBlockAncestor != this) {
741 // We are nested inside a multi-column element and are being split b y the span. We have to break up 806 // We are nested inside a multi-column element and are being split b y the span. We have to break up
(...skipping 6340 matching lines...) Expand 10 before | Expand all | Expand 10 after
7082 } 7147 }
7083 7148
7084 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject) 7149 String ValueToString<RenderBlock::FloatingObject*>::string(const RenderBlock::Fl oatingObject* floatingObject)
7085 { 7150 {
7086 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY()); 7151 return String::format("%p (%dx%d %dx%d)", floatingObject, floatingObject->x( ), floatingObject->y(), floatingObject->maxX(), floatingObject->maxY());
7087 } 7152 }
7088 7153
7089 #endif 7154 #endif
7090 7155
7091 } // namespace WebCore 7156 } // 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