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

Side by Side Diff: Source/core/layout/LayoutTableSection.cpp

Issue 899163003: Move rendering/RenderObject to layout/LayoutObject. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 10 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/layout/LayoutTableSection.h ('k') | Source/core/layout/LayoutTheme.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) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. All r ights reserved. 7 * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. All r ights reserved.
8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com) 8 * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
82 , m_cCol(0) 82 , m_cCol(0)
83 , m_cRow(0) 83 , m_cRow(0)
84 , m_outerBorderStart(0) 84 , m_outerBorderStart(0)
85 , m_outerBorderEnd(0) 85 , m_outerBorderEnd(0)
86 , m_outerBorderBefore(0) 86 , m_outerBorderBefore(0)
87 , m_outerBorderAfter(0) 87 , m_outerBorderAfter(0)
88 , m_needsCellRecalc(false) 88 , m_needsCellRecalc(false)
89 , m_forceSlowPaintPathWithOverflowingCell(false) 89 , m_forceSlowPaintPathWithOverflowingCell(false)
90 , m_hasMultipleCellLevels(false) 90 , m_hasMultipleCellLevels(false)
91 { 91 {
92 // init RenderObject attributes 92 // init LayoutObject attributes
93 setInline(false); // our object is not Inline 93 setInline(false); // our object is not Inline
94 } 94 }
95 95
96 LayoutTableSection::~LayoutTableSection() 96 LayoutTableSection::~LayoutTableSection()
97 { 97 {
98 } 98 }
99 99
100 void LayoutTableSection::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle) 100 void LayoutTableSection::styleDidChange(StyleDifference diff, const RenderStyle* oldStyle)
101 { 101 {
102 RenderBox::styleDidChange(diff, oldStyle); 102 RenderBox::styleDidChange(diff, oldStyle);
103 propagateStyleToAnonymousChildren(); 103 propagateStyleToAnonymousChildren();
104 104
105 // If border was changed, notify table. 105 // If border was changed, notify table.
106 LayoutTable* table = this->table(); 106 LayoutTable* table = this->table();
107 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() & & oldStyle && oldStyle->border() != style()->border()) 107 if (table && !table->selfNeedsLayout() && !table->normalChildNeedsLayout() & & oldStyle && oldStyle->border() != style()->border())
108 table->invalidateCollapsedBorders(); 108 table->invalidateCollapsedBorders();
109 } 109 }
110 110
111 void LayoutTableSection::willBeRemovedFromTree() 111 void LayoutTableSection::willBeRemovedFromTree()
112 { 112 {
113 RenderBox::willBeRemovedFromTree(); 113 RenderBox::willBeRemovedFromTree();
114 114
115 // Preventively invalidate our cells as we may be re-inserted into 115 // Preventively invalidate our cells as we may be re-inserted into
116 // a new table which would require us to rebuild our structure. 116 // a new table which would require us to rebuild our structure.
117 setNeedsCellRecalc(); 117 setNeedsCellRecalc();
118 } 118 }
119 119
120 void LayoutTableSection::addChild(RenderObject* child, RenderObject* beforeChild ) 120 void LayoutTableSection::addChild(LayoutObject* child, LayoutObject* beforeChild )
121 { 121 {
122 if (!child->isTableRow()) { 122 if (!child->isTableRow()) {
123 RenderObject* last = beforeChild; 123 LayoutObject* last = beforeChild;
124 if (!last) 124 if (!last)
125 last = lastRow(); 125 last = lastRow();
126 if (last && last->isAnonymous() && !last->isBeforeOrAfterContent()) { 126 if (last && last->isAnonymous() && !last->isBeforeOrAfterContent()) {
127 if (beforeChild == last) 127 if (beforeChild == last)
128 beforeChild = last->slowFirstChild(); 128 beforeChild = last->slowFirstChild();
129 last->addChild(child, beforeChild); 129 last->addChild(child, beforeChild);
130 return; 130 return;
131 } 131 }
132 132
133 if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == this) { 133 if (beforeChild && !beforeChild->isAnonymous() && beforeChild->parent() == this) {
134 RenderObject* row = beforeChild->previousSibling(); 134 LayoutObject* row = beforeChild->previousSibling();
135 if (row && row->isTableRow() && row->isAnonymous()) { 135 if (row && row->isTableRow() && row->isAnonymous()) {
136 row->addChild(child); 136 row->addChild(child);
137 return; 137 return;
138 } 138 }
139 } 139 }
140 140
141 // If beforeChild is inside an anonymous cell/row, insert into the cell or into 141 // If beforeChild is inside an anonymous cell/row, insert into the cell or into
142 // the anonymous row containing it, if there is one. 142 // the anonymous row containing it, if there is one.
143 RenderObject* lastBox = last; 143 LayoutObject* lastBox = last;
144 while (lastBox && lastBox->parent()->isAnonymous() && !lastBox->isTableR ow()) 144 while (lastBox && lastBox->parent()->isAnonymous() && !lastBox->isTableR ow())
145 lastBox = lastBox->parent(); 145 lastBox = lastBox->parent();
146 if (lastBox && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterConten t()) { 146 if (lastBox && lastBox->isAnonymous() && !lastBox->isBeforeOrAfterConten t()) {
147 lastBox->addChild(child, beforeChild); 147 lastBox->addChild(child, beforeChild);
148 return; 148 return;
149 } 149 }
150 150
151 RenderObject* row = LayoutTableRow::createAnonymousWithParentRenderer(th is); 151 LayoutObject* row = LayoutTableRow::createAnonymousWithParentRenderer(th is);
152 addChild(row, beforeChild); 152 addChild(row, beforeChild);
153 row->addChild(child); 153 row->addChild(child);
154 return; 154 return;
155 } 155 }
156 156
157 if (beforeChild) 157 if (beforeChild)
158 setNeedsCellRecalc(); 158 setNeedsCellRecalc();
159 159
160 unsigned insertionRow = m_cRow; 160 unsigned insertionRow = m_cRow;
161 ++m_cRow; 161 ++m_cRow;
(...skipping 746 matching lines...) Expand 10 before | Expand all | Expand 10 after
908 totalPercent += m_grid[r].logicalHeight.percent(); 908 totalPercent += m_grid[r].logicalHeight.percent();
909 } 909 }
910 910
911 int remainingExtraLogicalHeight = extraLogicalHeight; 911 int remainingExtraLogicalHeight = extraLogicalHeight;
912 distributeExtraLogicalHeightToPercentRows(remainingExtraLogicalHeight, total Percent); 912 distributeExtraLogicalHeightToPercentRows(remainingExtraLogicalHeight, total Percent);
913 distributeExtraLogicalHeightToAutoRows(remainingExtraLogicalHeight, autoRows Count); 913 distributeExtraLogicalHeightToAutoRows(remainingExtraLogicalHeight, autoRows Count);
914 distributeRemainingExtraLogicalHeight(remainingExtraLogicalHeight); 914 distributeRemainingExtraLogicalHeight(remainingExtraLogicalHeight);
915 return extraLogicalHeight - remainingExtraLogicalHeight; 915 return extraLogicalHeight - remainingExtraLogicalHeight;
916 } 916 }
917 917
918 static bool shouldFlexCellChild(RenderObject* cellDescendant) 918 static bool shouldFlexCellChild(LayoutObject* cellDescendant)
919 { 919 {
920 return cellDescendant->isReplaced() || (cellDescendant->isBox() && toRenderB ox(cellDescendant)->scrollsOverflow()); 920 return cellDescendant->isReplaced() || (cellDescendant->isBox() && toRenderB ox(cellDescendant)->scrollsOverflow());
921 } 921 }
922 922
923 void LayoutTableSection::layoutRows() 923 void LayoutTableSection::layoutRows()
924 { 924 {
925 #if ENABLE(ASSERT) 925 #if ENABLE(ASSERT)
926 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this); 926 SetLayoutNeededForbiddenScope layoutForbiddenScope(*this);
927 #endif 927 #endif
928 928
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
977 // time only). We may also not be handling row-spanning cells corre ctly. 977 // time only). We may also not be handling row-spanning cells corre ctly.
978 // 978 //
979 // Note also the oddity where replaced elements always flex, and yet blocks/tables do 979 // Note also the oddity where replaced elements always flex, and yet blocks/tables do
980 // not necessarily flex. WinIE is crazy and inconsistent, and we ca n't hope to 980 // not necessarily flex. WinIE is crazy and inconsistent, and we ca n't hope to
981 // match the behavior perfectly, but we'll continue to refine it as we discover new 981 // match the behavior perfectly, but we'll continue to refine it as we discover new
982 // bugs. :) 982 // bugs. :)
983 bool cellChildrenFlex = false; 983 bool cellChildrenFlex = false;
984 bool flexAllChildren = cell->style()->logicalHeight().isFixed() 984 bool flexAllChildren = cell->style()->logicalHeight().isFixed()
985 || (!table()->style()->logicalHeight().isAuto() && rHeight != ce ll->logicalHeight()); 985 || (!table()->style()->logicalHeight().isAuto() && rHeight != ce ll->logicalHeight());
986 986
987 for (RenderObject* child = cell->firstChild(); child; child = child- >nextSibling()) { 987 for (LayoutObject* child = cell->firstChild(); child; child = child- >nextSibling()) {
988 if (!child->isText() && child->style()->logicalHeight().isPercen t() 988 if (!child->isText() && child->style()->logicalHeight().isPercen t()
989 && (flexAllChildren || shouldFlexCellChild(child)) 989 && (flexAllChildren || shouldFlexCellChild(child))
990 && (!child->isTable() || toLayoutTable(child)->hasSections() )) { 990 && (!child->isTable() || toLayoutTable(child)->hasSections() )) {
991 cellChildrenFlex = true; 991 cellChildrenFlex = true;
992 break; 992 break;
993 } 993 }
994 } 994 }
995 995
996 if (!cellChildrenFlex) { 996 if (!cellChildrenFlex) {
997 if (TrackedRendererListHashSet* percentHeightDescendants = cell- >percentHeightDescendants()) { 997 if (TrackedRendererListHashSet* percentHeightDescendants = cell- >percentHeightDescendants()) {
(...skipping 544 matching lines...) Expand 10 before | Expand all | Expand 10 after
1542 CellStruct& current = cellAt(hitRow, hitColumn); 1542 CellStruct& current = cellAt(hitRow, hitColumn);
1543 1543
1544 // If the cell is empty, there's nothing to do 1544 // If the cell is empty, there's nothing to do
1545 if (!current.hasCells()) 1545 if (!current.hasCells())
1546 continue; 1546 continue;
1547 1547
1548 for (unsigned i = current.cells.size() ; i; ) { 1548 for (unsigned i = current.cells.size() ; i; ) {
1549 --i; 1549 --i;
1550 LayoutTableCell* cell = current.cells[i]; 1550 LayoutTableCell* cell = current.cells[i];
1551 LayoutPoint cellPoint = flipForWritingModeForChild(cell, adjuste dLocation); 1551 LayoutPoint cellPoint = flipForWritingModeForChild(cell, adjuste dLocation);
1552 if (static_cast<RenderObject*>(cell)->nodeAtPoint(request, resul t, locationInContainer, cellPoint, action)) { 1552 if (static_cast<LayoutObject*>(cell)->nodeAtPoint(request, resul t, locationInContainer, cellPoint, action)) {
1553 updateHitTestResult(result, locationInContainer.point() - to LayoutSize(cellPoint)); 1553 updateHitTestResult(result, locationInContainer.point() - to LayoutSize(cellPoint));
1554 return true; 1554 return true;
1555 } 1555 }
1556 } 1556 }
1557 if (!result.isRectBasedTest()) 1557 if (!result.isRectBasedTest())
1558 break; 1558 break;
1559 } 1559 }
1560 if (!result.isRectBasedTest()) 1560 if (!result.isRectBasedTest())
1561 break; 1561 break;
1562 } 1562 }
(...skipping 17 matching lines...) Expand all
1580 } 1580 }
1581 1581
1582 CollapsedBorderValue& LayoutTableSection::cachedCollapsedBorder(const LayoutTabl eCell* cell, CollapsedBorderSide side) 1582 CollapsedBorderValue& LayoutTableSection::cachedCollapsedBorder(const LayoutTabl eCell* cell, CollapsedBorderSide side)
1583 { 1583 {
1584 ASSERT(table()->collapseBorders()); 1584 ASSERT(table()->collapseBorders());
1585 HashMap<pair<const LayoutTableCell*, int>, CollapsedBorderValue>::iterator i t = m_cellsCollapsedBorders.find(std::make_pair(cell, side)); 1585 HashMap<pair<const LayoutTableCell*, int>, CollapsedBorderValue>::iterator i t = m_cellsCollapsedBorders.find(std::make_pair(cell, side));
1586 ASSERT_WITH_SECURITY_IMPLICATION(it != m_cellsCollapsedBorders.end()); 1586 ASSERT_WITH_SECURITY_IMPLICATION(it != m_cellsCollapsedBorders.end());
1587 return it->value; 1587 return it->value;
1588 } 1588 }
1589 1589
1590 LayoutTableSection* LayoutTableSection::createAnonymousWithParentRenderer(const RenderObject* parent) 1590 LayoutTableSection* LayoutTableSection::createAnonymousWithParentRenderer(const LayoutObject* parent)
1591 { 1591 {
1592 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_ROW_GROUP); 1592 RefPtr<RenderStyle> newStyle = RenderStyle::createAnonymousStyleWithDisplay( parent->style(), TABLE_ROW_GROUP);
1593 LayoutTableSection* newSection = new LayoutTableSection(0); 1593 LayoutTableSection* newSection = new LayoutTableSection(0);
1594 newSection->setDocumentForAnonymous(&parent->document()); 1594 newSection->setDocumentForAnonymous(&parent->document());
1595 newSection->setStyle(newStyle.release()); 1595 newSection->setStyle(newStyle.release());
1596 return newSection; 1596 return newSection;
1597 } 1597 }
1598 1598
1599 void LayoutTableSection::setLogicalPositionForCell(LayoutTableCell* cell, unsign ed effectiveColumn) const 1599 void LayoutTableSection::setLogicalPositionForCell(LayoutTableCell* cell, unsign ed effectiveColumn) const
1600 { 1600 {
1601 LayoutPoint cellLocation(0, m_rowPos[cell->rowIndex()]); 1601 LayoutPoint cellLocation(0, m_rowPos[cell->rowIndex()]);
1602 int horizontalBorderSpacing = table()->hBorderSpacing(); 1602 int horizontalBorderSpacing = table()->hBorderSpacing();
1603 1603
1604 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691). 1604 // FIXME: The table's direction should determine our row's direction, not th e section's (see bug 96691).
1605 if (!style()->isLeftToRightDirection()) 1605 if (!style()->isLeftToRightDirection())
1606 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing); 1606 cellLocation.setX(table()->columnPositions()[table()->numEffCols()] - ta ble()->columnPositions()[table()->colToEffCol(cell->col() + cell->colSpan())] + horizontalBorderSpacing);
1607 else 1607 else
1608 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing); 1608 cellLocation.setX(table()->columnPositions()[effectiveColumn] + horizont alBorderSpacing);
1609 1609
1610 cell->setLogicalLocation(cellLocation); 1610 cell->setLogicalLocation(cellLocation);
1611 } 1611 }
1612 1612
1613 } // namespace blink 1613 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/layout/LayoutTableSection.h ('k') | Source/core/layout/LayoutTheme.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698