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

Unified Diff: Source/core/rendering/RenderTable.cpp

Issue 196533012: Make LayoutState always be RAII (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Updated to ToT Created 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderMedia.cpp ('k') | Source/core/rendering/RenderTableRow.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderTable.cpp
diff --git a/Source/core/rendering/RenderTable.cpp b/Source/core/rendering/RenderTable.cpp
index aaf3ff9d289cd942316c282b2efa69887edaa9b9..cfa657e80a4fc59d7b7c9db4da6acbab0cc03c63 100644
--- a/Source/core/rendering/RenderTable.cpp
+++ b/Source/core/rendering/RenderTable.cpp
@@ -428,152 +428,150 @@ void RenderTable::layout()
recalcBordersInRowDirection();
LayoutRepainter repainter(*this, checkForRepaintDuringLayout());
- LayoutStateMaintainer statePusher(*this, locationOffset());
-
- setLogicalHeight(0);
-
- LayoutUnit oldLogicalWidth = logicalWidth();
- updateLogicalWidth();
-
SubtreeLayoutScope layouter(this);
- if (logicalWidth() != oldLogicalWidth) {
- for (unsigned i = 0; i < m_captions.size(); i++)
- layouter.setNeedsLayout(m_captions[i]);
- }
- // FIXME: The optimisation below doesn't work since the internal table
- // layout could have changed. we need to add a flag to the table
- // layout that tells us if something has changed in the min max
- // calculations to do it correctly.
-// if ( oldWidth != width() || columns.size() + 1 != columnPos.size() )
- m_tableLayout->layout();
-
- LayoutUnit totalSectionLogicalHeight = 0;
- LayoutUnit oldTableLogicalTop = 0;
- for (unsigned i = 0; i < m_captions.size(); i++)
- oldTableLogicalTop += m_captions[i]->logicalHeight() + m_captions[i]->marginBefore() + m_captions[i]->marginAfter();
-
- bool collapsing = collapseBorders();
-
- for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
- if (!child->needsLayout() && child->isBox())
- toRenderBox(child)->markForPaginationRelayoutIfNeeded(layouter);
- if (child->isTableSection()) {
- RenderTableSection* section = toRenderTableSection(child);
- if (m_columnLogicalWidthChanged)
- layouter.setChildNeedsLayout(section);
- section->layoutIfNeeded();
- totalSectionLogicalHeight += section->calcRowLogicalHeight();
- if (collapsing)
- section->recalcOuterBorder();
- ASSERT(!section->needsLayout());
- } else if (child->isRenderTableCol()) {
- child->layoutIfNeeded();
- ASSERT(!child->needsLayout());
- } else {
- // FIXME: We should never have other type of children (they should be wrapped in an
- // anonymous table section) but our code is too crazy and this can happen in practice.
- // Until this is fixed, let's make sure we don't leave non laid out children in the tree.
- child->layoutIfNeeded();
- }
- }
// If any table section moved vertically, we will just repaint everything from that
// section down (it is quite unlikely that any of the following sections
// did not shift).
bool sectionMoved = false;
LayoutUnit movedSectionLogicalTop = 0;
+ {
+ LayoutStateMaintainer statePusher(*this, locationOffset());
- // FIXME: Collapse caption margin.
- if (!m_captions.isEmpty()) {
- for (unsigned i = 0; i < m_captions.size(); i++) {
- if (m_captions[i]->style()->captionSide() == CAPBOTTOM)
- continue;
- layoutCaption(m_captions[i]);
- }
- if (logicalHeight() != oldTableLogicalTop) {
- sectionMoved = true;
- movedSectionLogicalTop = min(logicalHeight(), oldTableLogicalTop);
+ setLogicalHeight(0);
+
+ LayoutUnit oldLogicalWidth = logicalWidth();
+ updateLogicalWidth();
+
+ if (logicalWidth() != oldLogicalWidth) {
+ for (unsigned i = 0; i < m_captions.size(); i++)
+ layouter.setNeedsLayout(m_captions[i]);
}
- }
+ // FIXME: The optimisation below doesn't work since the internal table
+ // layout could have changed. We need to add a flag to the table
+ // layout that tells us if something has changed in the min max
+ // calculations to do it correctly.
+ // if ( oldWidth != width() || columns.size() + 1 != columnPos.size() )
+ m_tableLayout->layout();
+
+ LayoutUnit totalSectionLogicalHeight = 0;
+ LayoutUnit oldTableLogicalTop = 0;
+ for (unsigned i = 0; i < m_captions.size(); i++)
+ oldTableLogicalTop += m_captions[i]->logicalHeight() + m_captions[i]->marginBefore() + m_captions[i]->marginAfter();
- LayoutUnit borderAndPaddingBefore = borderBefore() + (collapsing ? LayoutUnit() : paddingBefore());
- LayoutUnit borderAndPaddingAfter = borderAfter() + (collapsing ? LayoutUnit() : paddingAfter());
+ bool collapsing = collapseBorders();
- setLogicalHeight(logicalHeight() + borderAndPaddingBefore);
+ for (RenderObject* child = firstChild(); child; child = child->nextSibling()) {
+ if (child->isTableSection()) {
+ RenderTableSection* section = toRenderTableSection(child);
+ if (m_columnLogicalWidthChanged)
+ layouter.setChildNeedsLayout(section);
+ section->layoutIfNeeded();
+ totalSectionLogicalHeight += section->calcRowLogicalHeight();
+ if (collapsing)
+ section->recalcOuterBorder();
+ ASSERT(!section->needsLayout());
+ } else if (child->isRenderTableCol()) {
+ child->layoutIfNeeded();
+ ASSERT(!child->needsLayout());
+ } else {
+ // FIXME: We should never have other type of children (they should be wrapped in an
+ // anonymous table section) but our code is too crazy and this can happen in practice.
+ // Until this is fixed, let's make sure we don't leave non laid out children in the tree.
+ child->layoutIfNeeded();
+ }
+ }
- if (!isOutOfFlowPositioned())
- updateLogicalHeight();
+ // FIXME: Collapse caption margin.
+ if (!m_captions.isEmpty()) {
+ for (unsigned i = 0; i < m_captions.size(); i++) {
+ if (m_captions[i]->style()->captionSide() == CAPBOTTOM)
+ continue;
+ layoutCaption(m_captions[i]);
+ }
+ if (logicalHeight() != oldTableLogicalTop) {
+ sectionMoved = true;
+ movedSectionLogicalTop = min(logicalHeight(), oldTableLogicalTop);
+ }
+ }
- LayoutUnit computedLogicalHeight = 0;
+ LayoutUnit borderAndPaddingBefore = borderBefore() + (collapsing ? LayoutUnit() : paddingBefore());
+ LayoutUnit borderAndPaddingAfter = borderAfter() + (collapsing ? LayoutUnit() : paddingAfter());
- Length logicalHeightLength = style()->logicalHeight();
- if (logicalHeightLength.isIntrinsic() || (logicalHeightLength.isSpecified() && logicalHeightLength.isPositive()))
- computedLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalHeightLength);
+ setLogicalHeight(logicalHeight() + borderAndPaddingBefore);
- Length logicalMaxHeightLength = style()->logicalMaxHeight();
- if (logicalMaxHeightLength.isIntrinsic() || (logicalMaxHeightLength.isSpecified() && !logicalMaxHeightLength.isNegative())) {
- LayoutUnit computedMaxLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalMaxHeightLength);
- computedLogicalHeight = min(computedLogicalHeight, computedMaxLogicalHeight);
- }
+ if (!isOutOfFlowPositioned())
+ updateLogicalHeight();
- Length logicalMinHeightLength = style()->logicalMinHeight();
- if (logicalMinHeightLength.isIntrinsic() || (logicalMinHeightLength.isSpecified() && !logicalMinHeightLength.isNegative())) {
- LayoutUnit computedMinLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalMinHeightLength);
- computedLogicalHeight = max(computedLogicalHeight, computedMinLogicalHeight);
- }
+ LayoutUnit computedLogicalHeight = 0;
- distributeExtraLogicalHeight(floorToInt(computedLogicalHeight - totalSectionLogicalHeight));
+ Length logicalHeightLength = style()->logicalHeight();
+ if (logicalHeightLength.isIntrinsic() || (logicalHeightLength.isSpecified() && logicalHeightLength.isPositive()))
+ computedLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalHeightLength);
- for (RenderTableSection* section = topSection(); section; section = sectionBelow(section))
- section->layoutRows();
+ Length logicalMaxHeightLength = style()->logicalMaxHeight();
+ if (logicalMaxHeightLength.isIntrinsic() || (logicalMaxHeightLength.isSpecified() && !logicalMaxHeightLength.isNegative())) {
+ LayoutUnit computedMaxLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalMaxHeightLength);
+ computedLogicalHeight = min(computedLogicalHeight, computedMaxLogicalHeight);
+ }
- if (!topSection() && computedLogicalHeight > totalSectionLogicalHeight && !document().inQuirksMode()) {
- // Completely empty tables (with no sections or anything) should at least honor specified height
- // in strict mode.
- setLogicalHeight(logicalHeight() + computedLogicalHeight);
- }
+ Length logicalMinHeightLength = style()->logicalMinHeight();
+ if (logicalMinHeightLength.isIntrinsic() || (logicalMinHeightLength.isSpecified() && !logicalMinHeightLength.isNegative())) {
+ LayoutUnit computedMinLogicalHeight = convertStyleLogicalHeightToComputedHeight(logicalMinHeightLength);
+ computedLogicalHeight = max(computedLogicalHeight, computedMinLogicalHeight);
+ }
- LayoutUnit sectionLogicalLeft = style()->isLeftToRightDirection() ? borderStart() : borderEnd();
- if (!collapsing)
- sectionLogicalLeft += style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
+ distributeExtraLogicalHeight(floorToInt(computedLogicalHeight - totalSectionLogicalHeight));
- // position the table sections
- RenderTableSection* section = topSection();
- while (section) {
- if (!sectionMoved && section->logicalTop() != logicalHeight()) {
- sectionMoved = true;
- movedSectionLogicalTop = min(logicalHeight(), section->logicalTop()) + (style()->isHorizontalWritingMode() ? section->visualOverflowRect().y() : section->visualOverflowRect().x());
+ for (RenderTableSection* section = topSection(); section; section = sectionBelow(section))
+ section->layoutRows();
+
+ if (!topSection() && computedLogicalHeight > totalSectionLogicalHeight && !document().inQuirksMode()) {
+ // Completely empty tables (with no sections or anything) should at least honor specified height
+ // in strict mode.
+ setLogicalHeight(logicalHeight() + computedLogicalHeight);
}
- section->setLogicalLocation(LayoutPoint(sectionLogicalLeft, logicalHeight()));
- setLogicalHeight(logicalHeight() + section->logicalHeight());
- section = sectionBelow(section);
- }
+ LayoutUnit sectionLogicalLeft = style()->isLeftToRightDirection() ? borderStart() : borderEnd();
+ if (!collapsing)
+ sectionLogicalLeft += style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
- setLogicalHeight(logicalHeight() + borderAndPaddingAfter);
+ // position the table sections
+ RenderTableSection* section = topSection();
+ while (section) {
+ if (!sectionMoved && section->logicalTop() != logicalHeight()) {
+ sectionMoved = true;
+ movedSectionLogicalTop = min(logicalHeight(), section->logicalTop()) + (style()->isHorizontalWritingMode() ? section->visualOverflowRect().y() : section->visualOverflowRect().x());
+ }
+ section->setLogicalLocation(LayoutPoint(sectionLogicalLeft, logicalHeight()));
- for (unsigned i = 0; i < m_captions.size(); i++) {
- if (m_captions[i]->style()->captionSide() != CAPBOTTOM)
- continue;
- layoutCaption(m_captions[i]);
- }
+ setLogicalHeight(logicalHeight() + section->logicalHeight());
+ section = sectionBelow(section);
+ }
- if (isOutOfFlowPositioned())
- updateLogicalHeight();
+ setLogicalHeight(logicalHeight() + borderAndPaddingAfter);
- // table can be containing block of positioned elements.
- // FIXME: Only pass true if width or height changed.
- layoutPositionedObjects(true);
+ for (unsigned i = 0; i < m_captions.size(); i++) {
+ if (m_captions[i]->style()->captionSide() != CAPBOTTOM)
+ continue;
+ layoutCaption(m_captions[i]);
+ }
- updateLayerTransform();
+ if (isOutOfFlowPositioned())
+ updateLogicalHeight();
- // Layout was changed, so probably borders too.
- invalidateCollapsedBorders();
+ // table can be containing block of positioned elements.
+ // FIXME: Only pass true if width or height changed.
+ layoutPositionedObjects(true);
- computeOverflow(clientLogicalBottom());
+ updateLayerTransform();
- statePusher.pop();
+ // Layout was changed, so probably borders too.
+ invalidateCollapsedBorders();
+
+ computeOverflow(clientLogicalBottom());
+ }
if (view()->layoutState()->pageLogicalHeight())
setPageLogicalOffset(view()->layoutState()->pageLogicalOffset(*this, logicalTop()));
« no previous file with comments | « Source/core/rendering/RenderMedia.cpp ('k') | Source/core/rendering/RenderTableRow.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698