| Index: third_party/WebKit/Source/core/layout/LayoutTable.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
|
| index d01f9f790e489a7b99a65cc3a06b322a53db4fa6..7e781b9589895d5fe22b902de59437fa6c56b2f3 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
|
| @@ -412,7 +412,10 @@ LayoutUnit LayoutTable::convertStyleLogicalHeightToComputedHeight(
|
| return computedLogicalHeight.clampNegativeToZero();
|
| }
|
|
|
| -void LayoutTable::layoutCaption(LayoutTableCaption& caption) {
|
| +void LayoutTable::layoutCaption(LayoutTableCaption& caption,
|
| + SubtreeLayoutScope& layouter) {
|
| + if (!caption.needsLayout())
|
| + markChildForPaginationRelayoutIfNeeded(caption, layouter);
|
| if (caption.needsLayout()) {
|
| // The margins may not be available but ensure the caption is at least
|
| // located beneath any previous sibling caption so that it does not
|
| @@ -438,6 +441,20 @@ void LayoutTable::layoutCaption(LayoutTableCaption& caption) {
|
| collapsedMarginAfterForChild(caption));
|
| }
|
|
|
| +void LayoutTable::layoutSection(LayoutTableSection& section,
|
| + SubtreeLayoutScope& layouter,
|
| + LayoutUnit logicalLeft) {
|
| + section.setLogicalLocation(LayoutPoint(logicalLeft, logicalHeight()));
|
| + if (m_columnLogicalWidthChanged)
|
| + layouter.setChildNeedsLayout(§ion);
|
| + if (!section.needsLayout())
|
| + markChildForPaginationRelayoutIfNeeded(section, layouter);
|
| + section.layoutIfNeeded();
|
| + int sectionLogicalHeight = section.calcRowLogicalHeight();
|
| + section.setLogicalHeight(LayoutUnit(sectionLogicalHeight));
|
| + setLogicalHeight(logicalHeight() + sectionLogicalHeight);
|
| +}
|
| +
|
| void LayoutTable::distributeExtraLogicalHeight(int extraLogicalHeight) {
|
| if (extraLogicalHeight <= 0)
|
| return;
|
| @@ -513,10 +530,6 @@ void LayoutTable::layout() {
|
|
|
| SubtreeLayoutScope layouter(*this);
|
|
|
| - // If any table section moved vertically, we will just issue paint
|
| - // invalidations for everything from that section down (it is quite unlikely
|
| - // that any of the following sections did not shift).
|
| - bool sectionMoved = false;
|
| {
|
| LayoutState state(*this, locationOffset());
|
| LayoutUnit oldLogicalWidth = logicalWidth();
|
| @@ -537,56 +550,68 @@ void LayoutTable::layout() {
|
| // if ( oldWidth != width() || columns.size() + 1 != columnPos.size() )
|
| m_tableLayout->layout();
|
|
|
| - LayoutUnit totalSectionLogicalHeight;
|
| - LayoutUnit oldTableLogicalTop;
|
| - for (unsigned i = 0; i < m_captions.size(); i++)
|
| - oldTableLogicalTop += m_captions[i]->logicalHeight() +
|
| - m_captions[i]->marginBefore() +
|
| - m_captions[i]->marginAfter();
|
| + // Lay out top captions.
|
| + // FIXME: Collapse caption margin.
|
| + for (unsigned i = 0; i < m_captions.size(); i++) {
|
| + if (m_captions[i]->style()->captionSide() == ECaptionSide::Bottom)
|
| + continue;
|
| + layoutCaption(*m_captions[i], layouter);
|
| + }
|
| +
|
| + LayoutTableSection* topSection = this->topSection();
|
| + LayoutTableSection* bottomSection = this->bottomSection();
|
| +
|
| + // This is the border-before edge of the "table box", relative to the "table
|
| + // wrapper box", i.e. right after all top captions.
|
| + // https://www.w3.org/TR/2011/REC-CSS2-20110607/tables.html#model
|
| + LayoutUnit tableBoxLogicalTop = logicalHeight();
|
|
|
| bool collapsing = collapseBorders();
|
| + if (collapsing) {
|
| + // Need to set up the table borders before we can position the sections.
|
| + for (LayoutTableSection* section = topSection; section;
|
| + section = sectionBelow(section))
|
| + section->recalcOuterBorder();
|
| + }
|
| +
|
| + LayoutUnit borderAndPaddingBefore =
|
| + borderBefore() + (collapsing ? LayoutUnit() : paddingBefore());
|
| + LayoutUnit borderAndPaddingAfter =
|
| + borderAfter() + (collapsing ? LayoutUnit() : paddingAfter());
|
| +
|
| + setLogicalHeight(tableBoxLogicalTop + borderAndPaddingBefore);
|
| +
|
| + LayoutUnit sectionLogicalLeft = LayoutUnit(
|
| + style()->isLeftToRightDirection() ? borderStart() : borderEnd());
|
| + if (!collapsing) {
|
| + sectionLogicalLeft +=
|
| + style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
|
| + }
|
| +
|
| + // Lay out table header group.
|
| + if (LayoutTableSection* section = header())
|
| + layoutSection(*section, layouter, sectionLogicalLeft);
|
|
|
| + // Lay out table body groups, and column groups.
|
| for (LayoutObject* child = firstChild(); child;
|
| child = child->nextSibling()) {
|
| - if (!child->needsLayout() && child->isBox())
|
| - markChildForPaginationRelayoutIfNeeded(*toLayoutBox(child), layouter);
|
| if (child->isTableSection()) {
|
| - LayoutTableSection* section = toLayoutTableSection(child);
|
| - if (m_columnLogicalWidthChanged)
|
| - layouter.setChildNeedsLayout(section);
|
| - section->layoutIfNeeded();
|
| - totalSectionLogicalHeight += section->calcRowLogicalHeight();
|
| - if (collapsing)
|
| - section->recalcOuterBorder();
|
| - ASSERT(!section->needsLayout());
|
| + if (child != header() && child != footer()) {
|
| + LayoutTableSection& section = *toLayoutTableSection(child);
|
| + layoutSection(section, layouter, sectionLogicalLeft);
|
| + }
|
| } else if (child->isLayoutTableCol()) {
|
| 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();
|
| + DCHECK(child->isTableCaption());
|
| }
|
| }
|
|
|
| - // FIXME: Collapse caption margin.
|
| - if (!m_captions.isEmpty()) {
|
| - for (unsigned i = 0; i < m_captions.size(); i++) {
|
| - if (m_captions[i]->style()->captionSide() == ECaptionSide::Bottom)
|
| - continue;
|
| - layoutCaption(*m_captions[i]);
|
| - }
|
| - sectionMoved = logicalHeight() != oldTableLogicalTop;
|
| - }
|
| -
|
| - LayoutUnit borderAndPaddingBefore =
|
| - borderBefore() + (collapsing ? LayoutUnit() : paddingBefore());
|
| - LayoutUnit borderAndPaddingAfter =
|
| - borderAfter() + (collapsing ? LayoutUnit() : paddingAfter());
|
| + // Lay out table footer.
|
| + if (LayoutTableSection* section = footer())
|
| + layoutSection(*section, layouter, sectionLogicalLeft);
|
|
|
| - setLogicalHeight(logicalHeight() + borderAndPaddingBefore);
|
| + setLogicalHeight(tableBoxLogicalTop + borderAndPaddingBefore);
|
|
|
| LayoutUnit computedLogicalHeight;
|
|
|
| @@ -616,11 +641,16 @@ void LayoutTable::layout() {
|
| std::max(computedLogicalHeight, computedMinLogicalHeight);
|
| }
|
|
|
| + LayoutUnit totalSectionLogicalHeight;
|
| + if (topSection) {
|
| + totalSectionLogicalHeight =
|
| + bottomSection->logicalBottom() - topSection->logicalTop();
|
| + }
|
| +
|
| distributeExtraLogicalHeight(
|
| floorToInt(computedLogicalHeight - totalSectionLogicalHeight));
|
|
|
| bool isPaginated = view()->layoutState()->isPaginated();
|
| - LayoutTableSection* topSection = this->topSection();
|
| LayoutUnit logicalOffset =
|
| topSection ? topSection->logicalTop() : LayoutUnit();
|
| for (LayoutTableSection* section = topSection; section;
|
| @@ -652,25 +682,12 @@ void LayoutTable::layout() {
|
| setLogicalHeight(logicalHeight() + computedLogicalHeight);
|
| }
|
|
|
| - LayoutUnit sectionLogicalLeft = LayoutUnit(
|
| - style()->isLeftToRightDirection() ? borderStart() : borderEnd());
|
| - if (!collapsing)
|
| - sectionLogicalLeft +=
|
| - style()->isLeftToRightDirection() ? paddingStart() : paddingEnd();
|
| -
|
| // position the table sections
|
| LayoutTableSection* section = topSection;
|
| while (section) {
|
| - if (!sectionMoved && section->logicalTop() != logicalHeight())
|
| - sectionMoved = true;
|
| section->setLogicalLocation(
|
| LayoutPoint(sectionLogicalLeft, logicalHeight()));
|
|
|
| - // As we may skip invalidation on the table, we need to ensure that
|
| - // sections are invalidated when they moved.
|
| - if (sectionMoved && !section->selfNeedsLayout())
|
| - section->setMayNeedPaintInvalidation();
|
| -
|
| setLogicalHeight(logicalHeight() + section->logicalHeight());
|
|
|
| section->updateLayerTransformAfterLayout();
|
| @@ -681,10 +698,11 @@ void LayoutTable::layout() {
|
|
|
| setLogicalHeight(logicalHeight() + borderAndPaddingAfter);
|
|
|
| + // Lay out bottom captions.
|
| for (unsigned i = 0; i < m_captions.size(); i++) {
|
| if (m_captions[i]->style()->captionSide() != ECaptionSide::Bottom)
|
| continue;
|
| - layoutCaption(*m_captions[i]);
|
| + layoutCaption(*m_captions[i], layouter);
|
| }
|
|
|
| updateLogicalHeight();
|
|
|