| Index: third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
|
| index f270e13e05b6a15b3a7af3e52312c814d022abd2..c97a0a3d38f0b19e81f2fcf038e722652b9cd6f7 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutTableSection.cpp
|
| @@ -4,7 +4,8 @@
|
| * (C) 1998 Waldo Bastian (bastian@kde.org)
|
| * (C) 1999 Lars Knoll (knoll@kde.org)
|
| * (C) 1999 Antti Koivisto (koivisto@kde.org)
|
| - * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc. All rights reserved.
|
| + * Copyright (C) 2003, 2004, 2005, 2006, 2008, 2009, 2010, 2013 Apple Inc.
|
| + * All rights reserved.
|
| * Copyright (C) 2006 Alexey Proskuryakov (ap@nypop.com)
|
| *
|
| * This library is free software; you can redistribute it and/or
|
| @@ -41,7 +42,8 @@ namespace blink {
|
|
|
| using namespace HTMLNames;
|
|
|
| -// This variable is used to balance the memory consumption vs the paint invalidation time on big tables.
|
| +// This variable is used to balance the memory consumption vs the paint
|
| +// invalidation time on big tables.
|
| static unsigned gMinTableSizeToUseFastPaintPathWithOverflowingCell = 75 * 75;
|
|
|
| static inline void setRowLogicalHeightToRowStyleLogicalHeight(
|
| @@ -168,8 +170,8 @@ void LayoutTableSection::addChild(LayoutObject* child,
|
| }
|
| }
|
|
|
| - // If beforeChild is inside an anonymous cell/row, insert into the cell or into
|
| - // the anonymous row containing it, if there is one.
|
| + // If beforeChild is inside an anonymous cell/row, insert into the cell or
|
| + // into the anonymous row containing it, if there is one.
|
| LayoutObject* lastBox = last;
|
| while (lastBox && lastBox->parent()->isAnonymous() &&
|
| !lastBox->isTableRow())
|
| @@ -249,9 +251,10 @@ static inline void checkThatVectorIsDOMOrdered(
|
| }
|
|
|
| void LayoutTableSection::addCell(LayoutTableCell* cell, LayoutTableRow* row) {
|
| - // We don't insert the cell if we need cell recalc as our internal columns' representation
|
| - // will have drifted from the table's representation. Also recalcCells will call addCell
|
| - // at a later time after sync'ing our columns' with the table's.
|
| + // We don't insert the cell if we need cell recalc as our internal columns'
|
| + // representation will have drifted from the table's representation. Also
|
| + // recalcCells will call addCell at a later time after sync'ing our columns'
|
| + // with the table's.
|
| if (needsCellRecalc())
|
| return;
|
|
|
| @@ -263,7 +266,8 @@ void LayoutTableSection::addCell(LayoutTableCell* cell, LayoutTableRow* row) {
|
| unsigned insertionRow = row->rowIndex();
|
|
|
| // ### mozilla still seems to do the old HTML way, even for strict DTD
|
| - // (see the annotation on table cell layouting in the CSS specs and the testcase below:
|
| + // (see the annotation on table cell layouting in the CSS specs and the
|
| + // testcase below:
|
| // <TABLE border>
|
| // <TR><TD>1 <TD rowspan="2">2 <TD>3 <TD>4
|
| // <TR><TD colspan="2">5
|
| @@ -354,7 +358,8 @@ void LayoutTableSection::populateSpanningRowsHeightFromCell(
|
| spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing -=
|
| borderSpacingForRow(actualRow);
|
| }
|
| - // We don't span the following row so its border-spacing (if any) should be included.
|
| + // We don't span the following row so its border-spacing (if any) should be
|
| + // included.
|
| spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing +=
|
| borderSpacingForRow(rowIndex + rowSpan - 1);
|
| }
|
| @@ -372,8 +377,9 @@ void LayoutTableSection::distributeExtraRowSpanHeightToPercentRows(
|
| float percent = std::min(totalPercent, 100.0f);
|
| const int tableHeight = m_rowPos[m_grid.size()] + extraRowSpanningHeight;
|
|
|
| - // Our algorithm matches Firefox. Extra spanning height would be distributed Only in first percent height rows
|
| - // those total percent is 100. Other percent rows would be uneffected even extra spanning height is remain.
|
| + // Our algorithm matches Firefox. Extra spanning height would be distributed
|
| + // Only in first percent height rows those total percent is 100. Other percent
|
| + // rows would be uneffected even extra spanning height is remain.
|
| int accumulatedPositionIncrease = 0;
|
| for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
|
| if (percent > 0 && extraRowSpanningHeight > 0) {
|
| @@ -404,18 +410,20 @@ static void updatePositionIncreasedWithRowHeight(
|
| // (and trigger asserts) in some layout tests.
|
| double proportionalPositionIncrease =
|
| remainder + (extraHeight * double(rowHeight)) / totalHeight;
|
| - // The epsilon is to push any values that are close to a whole number but aren't due to floating point imprecision.
|
| - // The epsilons are not accumulated, any that aren't necessary are lost in the cast to int.
|
| + // The epsilon is to push any values that are close to a whole number but
|
| + // aren't due to floating point imprecision. The epsilons are not accumulated,
|
| + // any that aren't necessary are lost in the cast to int.
|
| int positionIncreaseInt = proportionalPositionIncrease + 0.000001;
|
| accumulatedPositionIncrease += positionIncreaseInt;
|
| remainder = proportionalPositionIncrease - positionIncreaseInt;
|
| }
|
|
|
| -// This is mainly used to distribute whole extra rowspanning height in percent rows when all spanning rows are
|
| -// percent rows.
|
| -// Distributing whole extra rowspanning height in percent rows based on the ratios of percent because this method works
|
| -// same as percent distribution when only percent rows are present and percent is 100. Also works perfectly fine when
|
| -// percent is not equal to 100.
|
| +// This is mainly used to distribute whole extra rowspanning height in percent
|
| +// rows when all spanning rows are percent rows.
|
| +// Distributing whole extra rowspanning height in percent rows based on the
|
| +// ratios of percent because this method works same as percent distribution when
|
| +// only percent rows are present and percent is 100. Also works perfectly fine
|
| +// when percent is not equal to 100.
|
| void LayoutTableSection::distributeWholeExtraRowSpanHeightToPercentRows(
|
| LayoutTableCell* cell,
|
| float totalPercent,
|
| @@ -457,8 +465,9 @@ void LayoutTableSection::distributeExtraRowSpanHeightToAutoRows(
|
| int accumulatedPositionIncrease = 0;
|
| double remainder = 0;
|
|
|
| - // Aspect ratios of auto rows should not change otherwise table may look different than user expected.
|
| - // So extra height distributed in auto spanning rows based on their weight in spanning cell.
|
| + // Aspect ratios of auto rows should not change otherwise table may look
|
| + // different than user expected. So extra height distributed in auto spanning
|
| + // rows based on their weight in spanning cell.
|
| for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
|
| if (m_grid[row].logicalHeight.isAuto()) {
|
| updatePositionIncreasedWithRowHeight(
|
| @@ -486,8 +495,9 @@ void LayoutTableSection::distributeExtraRowSpanHeightToRemainingRows(
|
| int accumulatedPositionIncrease = 0;
|
| double remainder = 0;
|
|
|
| - // Aspect ratios of the rows should not change otherwise table may look different than user expected.
|
| - // So extra height distribution in remaining spanning rows based on their weight in spanning cell.
|
| + // Aspect ratios of the rows should not change otherwise table may look
|
| + // different than user expected. So extra height distribution in remaining
|
| + // spanning rows based on their weight in spanning cell.
|
| for (unsigned row = rowIndex; row < (rowIndex + rowSpan); row++) {
|
| if (!m_grid[row].logicalHeight.isPercentOrCalc()) {
|
| updatePositionIncreasedWithRowHeight(
|
| @@ -509,23 +519,26 @@ static bool cellIsFullyIncludedInOtherCell(const LayoutTableCell* cell1,
|
| (cell2->rowIndex() + cell2->rowSpan()));
|
| }
|
|
|
| -// To avoid unneeded extra height distributions, we apply the following sorting algorithm:
|
| +// To avoid unneeded extra height distributions, we apply the following sorting
|
| +// algorithm:
|
| static bool compareRowSpanCellsInHeightDistributionOrder(
|
| const LayoutTableCell* cell1,
|
| const LayoutTableCell* cell2) {
|
| - // Sorting bigger height cell first if cells are at same index with same span because we will skip smaller
|
| - // height cell to distribute it's extra height.
|
| + // Sorting bigger height cell first if cells are at same index with same span
|
| + // because we will skip smaller height cell to distribute it's extra height.
|
| if (cell1->rowIndex() == cell2->rowIndex() &&
|
| cell1->rowSpan() == cell2->rowSpan())
|
| return (cell1->logicalHeightForRowSizing() >
|
| cell2->logicalHeightForRowSizing());
|
| - // Sorting inner most cell first because if inner spanning cell'e extra height is distributed then outer
|
| - // spanning cell's extra height will adjust accordingly. In reverse order, there is more chances that outer
|
| - // spanning cell's height will exceed than defined by user.
|
| + // Sorting inner most cell first because if inner spanning cell'e extra height
|
| + // is distributed then outer spanning cell's extra height will adjust
|
| + // accordingly. In reverse order, there is more chances that outer spanning
|
| + // cell's height will exceed than defined by user.
|
| if (cellIsFullyIncludedInOtherCell(cell1, cell2))
|
| return true;
|
| - // Sorting lower row index first because first we need to apply the extra height of spanning cell which
|
| - // comes first in the table so lower rows's position would increment in sequence.
|
| + // Sorting lower row index first because first we need to apply the extra
|
| + // height of spanning cell which comes first in the table so lower rows's
|
| + // position would increment in sequence.
|
| if (!cellIsFullyIncludedInOtherCell(cell2, cell1))
|
| return (cell1->rowIndex() < cell2->rowIndex());
|
|
|
| @@ -561,10 +574,11 @@ unsigned LayoutTableSection::calcRowHeightHavingOnlySpanningCells(
|
| const unsigned cellRowIndex = cell->rowIndex();
|
| const unsigned cellRowSpan = cell->rowSpan();
|
|
|
| - // As we are going from the top of the table to the bottom to calculate the row
|
| - // heights for rows that only contain spanning cells and all previous rows are
|
| - // processed we only need to find the number of rows with spanning cells from the
|
| - // current cell to the end of the current cells spanning height.
|
| + // As we are going from the top of the table to the bottom to calculate the
|
| + // row heights for rows that only contain spanning cells and all previous
|
| + // rows are processed we only need to find the number of rows with spanning
|
| + // cells from the current cell to the end of the current cells spanning
|
| + // height.
|
| unsigned startRowForSpanningCellCount = std::max(cellRowIndex, row);
|
| unsigned endRow = cellRowIndex + cellRowSpan;
|
| unsigned spanningCellsRowsCountHavingZeroHeight =
|
| @@ -622,13 +636,15 @@ void LayoutTableSection::updateRowsHeightHavingOnlySpanningCells(
|
| spanningRowsHeight.totalRowsHeight += accumulatedPositionIncrease;
|
| }
|
|
|
| -// Distribute rowSpan cell height in rows those comes in rowSpan cell based on the ratio of row's height if
|
| -// 1. RowSpan cell height is greater than the total height of rows in rowSpan cell
|
| +// Distribute rowSpan cell height in rows those comes in rowSpan cell based on
|
| +// the ratio of row's height if 1 RowSpan cell height is greater than the total
|
| +// height of rows in rowSpan cell.
|
| void LayoutTableSection::distributeRowSpanHeightToRows(
|
| SpanningLayoutTableCells& rowSpanCells) {
|
| ASSERT(rowSpanCells.size());
|
|
|
| - // 'rowSpanCells' list is already sorted based on the cells rowIndex in ascending order
|
| + // 'rowSpanCells' list is already sorted based on the cells rowIndex in
|
| + // ascending order
|
| // Arrange row spanning cell in the order in which we need to process first.
|
| std::sort(rowSpanCells.begin(), rowSpanCells.end(),
|
| compareRowSpanCellsInHeightDistributionOrder);
|
| @@ -639,7 +655,8 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
|
|
| Vector<int> rowsCountWithOnlySpanningCells;
|
|
|
| - // At this stage, Height of the rows are zero for the one containing only spanning cells.
|
| + // At this stage, Height of the rows are zero for the one containing only
|
| + // spanning cells.
|
| int count = 0;
|
| for (unsigned row = 0; row < m_grid.size(); row++) {
|
| if (rowHasOnlySpanningCells(row))
|
| @@ -657,15 +674,16 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
| unsigned spanningCellEndIndex = rowIndex + rowSpan;
|
| unsigned lastSpanningCellEndIndex = lastRowIndex + lastRowSpan;
|
|
|
| - // Only the highest spanning cell will distribute its extra height in a row if more than one spanning cell
|
| - // is present at the same level.
|
| + // Only the highest spanning cell will distribute its extra height in a row
|
| + // if more than one spanning cell is present at the same level.
|
| if (rowIndex == lastRowIndex && rowSpan == lastRowSpan)
|
| continue;
|
|
|
| int originalBeforePosition = m_rowPos[spanningCellEndIndex];
|
|
|
| - // When 2 spanning cells are ending at same row index then while extra height distribution of first spanning
|
| - // cell updates position of the last row so getting the original position of the last row in second spanning
|
| + // When 2 spanning cells are ending at same row index then while extra
|
| + // height distribution of first spanning cell updates position of the last
|
| + // row so getting the original position of the last row in second spanning
|
| // cell need to reduce the height changed by first spanning cell.
|
| if (spanningCellEndIndex == lastSpanningCellEndIndex)
|
| originalBeforePosition -= extraHeightToPropagate;
|
| @@ -683,18 +701,20 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
|
|
| populateSpanningRowsHeightFromCell(cell, spanningRowsHeight);
|
|
|
| - // Here we are handling only row(s) who have only rowspanning cells and do not have any empty cell.
|
| + // Here we are handling only row(s) who have only rowspanning cells and do
|
| + // not have any empty cell.
|
| if (spanningRowsHeight.isAnyRowWithOnlySpanningCells)
|
| updateRowsHeightHavingOnlySpanningCells(cell, spanningRowsHeight,
|
| extraHeightToPropagate,
|
| rowsCountWithOnlySpanningCells);
|
|
|
| - // This code handle row(s) that have rowspanning cell(s) and at least one empty cell.
|
| - // Such rows are not handled below and end up having a height of 0. That would mean
|
| - // content overlapping if one of their cells has any content. To avoid the problem, we
|
| - // add all the remaining spanning cells' height to the last spanned row.
|
| - // This means that we could grow a row past its 'height' or break percentage spreading
|
| - // however this is better than overlapping content.
|
| + // This code handle row(s) that have rowspanning cell(s) and at least one
|
| + // empty cell. Such rows are not handled below and end up having a height of
|
| + // 0. That would mean content overlapping if one of their cells has any
|
| + // content. To avoid the problem, we add all the remaining spanning cells'
|
| + // height to the last spanned row. This means that we could grow a row past
|
| + // its 'height' or break percentage spreading however this is better than
|
| + // overlapping content.
|
| // FIXME: Is there a better algorithm?
|
| if (!spanningRowsHeight.totalRowsHeight) {
|
| if (spanningRowsHeight.spanningCellHeightIgnoringBorderSpacing)
|
| @@ -714,15 +734,18 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
| continue;
|
| }
|
|
|
| - // Below we are handling only row(s) who have at least one visible cell without rowspan value.
|
| + // Below we are handling only row(s) who have at least one visible cell
|
| + // without rowspan value.
|
| float totalPercent = 0;
|
| int totalAutoRowsHeight = 0;
|
| int totalRemainingRowsHeight = spanningRowsHeight.totalRowsHeight;
|
|
|
| - // FIXME: Inner spanning cell height should not change if it have fixed height when it's parent spanning cell
|
| - // is distributing it's extra height in rows.
|
| + // FIXME: Inner spanning cell height should not change if it have fixed
|
| + // height when it's parent spanning cell is distributing it's extra height
|
| + //in rows.
|
|
|
| - // Calculate total percentage, total auto rows height and total rows height except percent rows.
|
| + // Calculate total percentage, total auto rows height and total rows height
|
| + // except percent rows.
|
| for (unsigned row = rowIndex; row < spanningCellEndIndex; row++) {
|
| // TODO(alancutter): Make this work correctly for calc lengths.
|
| if (m_grid[row].logicalHeight.isPercent()) {
|
| @@ -740,7 +763,8 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
|
|
| if (totalPercent < 100 && !totalAutoRowsHeight &&
|
| !totalRemainingRowsHeight) {
|
| - // Distributing whole extra rowspanning height in percent row when only non-percent rows height is 0.
|
| + // Distributing whole extra rowspanning height in percent row when only
|
| + // non-percent rows height is 0.
|
| distributeWholeExtraRowSpanHeightToPercentRows(
|
| cell, totalPercent, extraRowSpanningHeight,
|
| spanningRowsHeight.rowHeight);
|
| @@ -764,7 +788,8 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
| }
|
|
|
| if (extraHeightToPropagate) {
|
| - // Apply changed height by rowSpan cells to rows present at the end of the table
|
| + // Apply changed height by rowSpan cells to rows present at the end of the
|
| + // table
|
| for (unsigned row = lastRowIndex + lastRowSpan + 1; row <= m_grid.size();
|
| row++)
|
| m_rowPos[row] += extraHeightToPropagate;
|
| @@ -772,16 +797,17 @@ void LayoutTableSection::distributeRowSpanHeightToRows(
|
| }
|
|
|
| // Find out the baseline of the cell
|
| -// If the cell's baseline is more than the row's baseline then the cell's baseline become the row's baseline
|
| -// and if the row's baseline goes out of the row's boundaries then adjust row height accordingly.
|
| +// If the cell's baseline is more than the row's baseline then the cell's
|
| +// baseline become the row's baseline and if the row's baseline goes out of the
|
| +// row's boundaries then adjust row height accordingly.
|
| void LayoutTableSection::updateBaselineForCell(LayoutTableCell* cell,
|
| unsigned row,
|
| int& baselineDescent) {
|
| if (!cell->isBaselineAligned())
|
| return;
|
|
|
| - // Ignoring the intrinsic padding as it depends on knowing the row's baseline, which won't be accurate
|
| - // until the end of this function.
|
| + // Ignoring the intrinsic padding as it depends on knowing the row's baseline,
|
| + // which won't be accurate until the end of this function.
|
| int baselinePosition =
|
| cell->cellBaselinePosition() - cell->intrinsicPaddingBefore();
|
| if (baselinePosition >
|
| @@ -811,14 +837,15 @@ int LayoutTableSection::calcRowLogicalHeight() {
|
|
|
| LayoutTableCell* cell;
|
|
|
| - // We may have to forcefully lay out cells here, in which case we need a layout
|
| - // state. Technically, we should also push state for the row, but since rows don't push a
|
| - // coordinate transform, that's not necessary.
|
| + // We may have to forcefully lay out cells here, in which case we need a
|
| + // layout state. Technically, we should also push state for the row, but since
|
| + // rows don't push a coordinate transform, that's not necessary.
|
| LayoutState state(*this, locationOffset());
|
|
|
| m_rowPos.resize(m_grid.size() + 1);
|
|
|
| - // We ignore the border-spacing on any non-top section as it is already included in the previous section's last row position.
|
| + // We ignore the border-spacing on any non-top section as it is already
|
| + // included in the previous section's last row position.
|
| if (this == table()->topSection())
|
| m_rowPos[0] = table()->vBorderSpacing();
|
| else
|
| @@ -834,15 +861,16 @@ int LayoutTableSection::calcRowLogicalHeight() {
|
| int baselineDescent = 0;
|
|
|
| if (m_grid[r].logicalHeight.isSpecified()) {
|
| - // Our base size is the biggest logical height from our cells' styles (excluding row spanning cells).
|
| + // Our base size is the biggest logical height from our cells' styles
|
| + // (excluding row spanning cells).
|
| m_rowPos[r + 1] = std::max(
|
| m_rowPos[r] +
|
| minimumValueForLength(m_grid[r].logicalHeight, LayoutUnit())
|
| .round(),
|
| 0);
|
| } else {
|
| - // Non-specified lengths are ignored because the row already accounts for the cells
|
| - // intrinsic logical height.
|
| + // Non-specified lengths are ignored because the row already accounts for
|
| + // the cells intrinsic logical height.
|
| m_rowPos[r + 1] = std::max(m_rowPos[r], 0);
|
| }
|
|
|
| @@ -858,7 +886,8 @@ int LayoutTableSection::calcRowLogicalHeight() {
|
| continue;
|
|
|
| if (cell->rowSpan() > 1) {
|
| - // For row spanning cells, we only handle them for the first row they span. This ensures we take their baseline into account.
|
| + // For row spanning cells, we only handle them for the first row they
|
| + // span. This ensures we take their baseline into account.
|
| if (lastRowSpanCell != cell && cell->rowIndex() == r) {
|
| #if ENABLE(ASSERT)
|
| ASSERT(!uniqueCells.contains(cell));
|
| @@ -880,7 +909,8 @@ int LayoutTableSection::calcRowLogicalHeight() {
|
| m_rowPos[r + 1] = std::max(
|
| m_rowPos[r + 1], m_rowPos[r] + cell->logicalHeightForRowSizing());
|
|
|
| - // Find out the baseline. The baseline is set on the first row in a rowSpan.
|
| + // Find out the baseline. The baseline is set on the first row in a
|
| + // rowSpan.
|
| if (cell->rowIndex() == r)
|
| updateBaselineForCell(cell, r, baselineDescent);
|
| }
|
| @@ -905,8 +935,9 @@ void LayoutTableSection::layout() {
|
| RELEASE_ASSERT(!needsCellRecalc());
|
| ASSERT(!table()->needsSectionRecalc());
|
|
|
| - // addChild may over-grow m_grid but we don't want to throw away the memory too early as addChild
|
| - // can be called in a loop (e.g during parsing). Doing it now ensures we have a stable-enough structure.
|
| + // addChild may over-grow m_grid but we don't want to throw away the memory
|
| + // too early as addChild can be called in a loop (e.g during parsing). Doing
|
| + // it now ensures we have a stable-enough structure.
|
| m_grid.shrinkToFit();
|
|
|
| LayoutState state(*this, locationOffset());
|
| @@ -917,8 +948,9 @@ void LayoutTableSection::layout() {
|
| for (unsigned r = 0; r < m_grid.size(); ++r) {
|
| Row& row = m_grid[r].row;
|
| unsigned cols = row.size();
|
| - // First, propagate our table layout's information to the cells. This will mark the row as needing layout
|
| - // if there was a column logical width change.
|
| + // First, propagate our table layout's information to the cells. This will
|
| + // mark the row as needing layout if there was a column logical width
|
| + // change.
|
| for (unsigned startColumn = 0; startColumn < cols; ++startColumn) {
|
| CellStruct& current = row[startColumn];
|
| LayoutTableCell* cell = current.primaryCell();
|
| @@ -987,7 +1019,8 @@ void LayoutTableSection::distributeExtraLogicalHeightToAutoRows(
|
| int totalLogicalHeightAdded = 0;
|
| for (unsigned r = 0; r < m_grid.size(); ++r) {
|
| if (autoRowsCount > 0 && m_grid[r].logicalHeight.isAuto()) {
|
| - // Recomputing |extraLogicalHeightForRow| guarantees that we properly ditribute round |extraLogicalHeight|.
|
| + // Recomputing |extraLogicalHeightForRow| guarantees that we properly
|
| + // ditribute round |extraLogicalHeight|.
|
| int extraLogicalHeightForRow = extraLogicalHeight / autoRowsCount;
|
| totalLogicalHeightAdded += extraLogicalHeightForRow;
|
| extraLogicalHeight -= extraLogicalHeightForRow;
|
| @@ -1065,7 +1098,8 @@ void LayoutTableSection::layoutRows() {
|
|
|
| LayoutAnalyzer::Scope analyzer(*this);
|
|
|
| - // FIXME: Changing the height without a layout can change the overflow so it seems wrong.
|
| + // FIXME: Changing the height without a layout can change the overflow so it
|
| + // seems wrong.
|
|
|
| unsigned totalRows = m_grid.size();
|
|
|
| @@ -1078,9 +1112,9 @@ void LayoutTableSection::layoutRows() {
|
|
|
| if (isPaginated) {
|
| LayoutTableSection* header = table()->header();
|
| - // If we're a table header nested inside a table cell then we want to repeat on each
|
| - // page, but below the header we're nested inside. Note we don't try to match the padding
|
| - // on the cell on each repeated header.
|
| + // If we're a table header nested inside a table cell then we want to repeat
|
| + // on each page, but below the header we're nested inside. Note we don't try
|
| + // to match the padding on the cell on each repeated header.
|
| if (header && header == this)
|
| setOffsetForRepeatingHeader(
|
| view()->layoutState()->heightOffsetForTableHeaders());
|
| @@ -1108,16 +1142,16 @@ void LayoutTableSection::layoutRows() {
|
| AssociateWithLatterPage) ==
|
| pageLogicalHeightForOffset(LayoutUnit(m_rowPos[r]));
|
| if (paginationStrutOnRow || rowIsAtTopOfColumn) {
|
| - // If there isn't room for at least one content row on a page with a header group, then
|
| - // we won't repeat the header on each page.
|
| + // If there isn't room for at least one content row on a page with a
|
| + // header group, then we won't repeat the header on each page.
|
| if (!r && table()->header() &&
|
| table()->sectionAbove(this) == table()->header() &&
|
| table()->header()->getPaginationBreakability() != AllowAnyBreaks)
|
| state.setHeightOffsetForTableHeaders(
|
| state.heightOffsetForTableHeaders() -
|
| table()->header()->logicalHeight());
|
| - // If we have a header group we will paint it at the top of each page, move the rows
|
| - // down to accomodate it.
|
| + // If we have a header group we will paint it at the top of each page,
|
| + // move the rows down to accomodate it.
|
| paginationStrutOnRow += state.heightOffsetForTableHeaders().toInt();
|
| for (unsigned rowIndex = r; rowIndex <= totalRows; rowIndex++)
|
| m_rowPos[rowIndex] += paginationStrutOnRow;
|
| @@ -1155,9 +1189,12 @@ void LayoutTableSection::layoutRows() {
|
| // FIXME: Make pagination work with vertical tables.
|
| if (view()->layoutState()->pageLogicalHeight() &&
|
| cell->logicalHeight() != rHeight) {
|
| - // FIXME: Pagination might have made us change size. For now just shrink or grow the cell to fit without doing a relayout.
|
| - // We'll also do a basic increase of the row height to accommodate the cell if it's bigger, but this isn't quite right
|
| - // either. It's at least stable though and won't result in an infinite # of relayouts that may never stabilize.
|
| + // FIXME: Pagination might have made us change size. For now just shrink
|
| + // or grow the cell to fit without doing a relayout.
|
| + // We'll also do a basic increase of the row height to accommodate the
|
| + // cell if it's bigger, but this isn't quite right either. It's at least
|
| + // stable though and won't result in an infinite # of relayouts that may
|
| + // never stabilize.
|
| LayoutUnit oldLogicalHeight = cell->logicalHeight();
|
| rowHeightIncreaseForPagination =
|
| std::max<int>(rowHeightIncreaseForPagination,
|
| @@ -1168,9 +1205,10 @@ void LayoutTableSection::layoutRows() {
|
|
|
| LayoutSize childOffset(cell->location() - oldCellRect.location());
|
| if (childOffset.width() || childOffset.height()) {
|
| - // If the child moved, we have to issue paint invalidations to it as well as any floating/positioned
|
| - // descendants. An exception is if we need a layout. In this case, we know we're going to
|
| - // issue paint invalidations ourselves (and the child) anyway.
|
| + // If the child moved, we have to issue paint invalidations to it as
|
| + // well as any floating/positioned descendants. An exception is if we
|
| + // need a layout. In this case, we know we're going to issue paint
|
| + // invalidations ourselves (and the child) anyway.
|
| if (!table()->selfNeedsLayout())
|
| cell->setMayNeedPaintInvalidation();
|
| }
|
| @@ -1202,8 +1240,9 @@ void LayoutTableSection::layoutRows() {
|
| int LayoutTableSection::paginationStrutForRow(LayoutTableRow* row,
|
| LayoutUnit logicalOffset) const {
|
| DCHECK(row);
|
| - // Even if the row allows us to break-inside, we will want to put a strut on the row if we have a header
|
| - // group that wants to appear at the top of each page.
|
| + // Even if the row allows us to break-inside, we will want to put a strut on
|
| + // the row if we have a header group that wants to appear at the top of each
|
| + // page.
|
| bool tableHeaderForcesStrut =
|
| table()->header()
|
| ? table()->header()->getPaginationBreakability() != AllowAnyBreaks
|
| @@ -1235,8 +1274,8 @@ int LayoutTableSection::paginationStrutForRow(LayoutTableRow* row,
|
| logicalOffset, remainingLogicalHeight, rowLogicalHeight);
|
| if (paginationStrut == remainingLogicalHeight &&
|
| remainingLogicalHeight == pageLogicalHeight) {
|
| - // Don't break if we were at the top of a page, and we failed to fit the content
|
| - // completely. No point in leaving a page completely blank.
|
| + // Don't break if we were at the top of a page, and we failed to fit the
|
| + // content completely. No point in leaving a page completely blank.
|
| return 0;
|
| }
|
| // Table layout parts only work on integers, so we have to round. Round up, to
|
| @@ -1282,9 +1321,11 @@ void LayoutTableSection::computeOverflowFromCells(unsigned totalRows,
|
| !m_forceSlowPaintPathWithOverflowingCell) {
|
| m_overflowingCells.add(cell);
|
| if (m_overflowingCells.size() > maxAllowedOverflowingCellsCount) {
|
| - // We need to set m_forcesSlowPaintPath only if there is a least one overflowing cells as the hit testing code rely on this information.
|
| + // We need to set m_forcesSlowPaintPath only if there is a least one
|
| + // overflowing cells as the hit testing code rely on this information.
|
| m_forceSlowPaintPathWithOverflowingCell = true;
|
| - // The slow path does not make any use of the overflowing cells info, don't hold on to the memory.
|
| + // The slow path does not make any use of the overflowing cells info,
|
| + // don't hold on to the memory.
|
| m_overflowingCells.clear();
|
| }
|
| }
|
| @@ -1366,11 +1407,10 @@ int LayoutTableSection::calcBlockDirectionOuterBorder(
|
| if (current.inColSpan || !current.hasCells())
|
| continue;
|
| const ComputedStyle& primaryCellStyle = current.primaryCell()->styleRef();
|
| - const BorderValue& cb =
|
| - side == BorderBefore
|
| - ? primaryCellStyle.borderBefore()
|
| - : primaryCellStyle
|
| - .borderAfter(); // FIXME: Make this work with perpendicular and flipped cells.
|
| + // FIXME: Make this work with perpendicular and flipped cells.
|
| + const BorderValue& cb = side == BorderBefore
|
| + ? primaryCellStyle.borderBefore()
|
| + : primaryCellStyle.borderAfter();
|
| // FIXME: Don't repeat for the same col group
|
| LayoutTableCol* col =
|
| table()->colElementAtAbsoluteColumn(c).innermostColOrColGroup();
|
| @@ -1437,11 +1477,9 @@ int LayoutTableSection::calcInlineDirectionOuterBorder(
|
| const ComputedStyle& primaryCellStyle = current.primaryCell()->styleRef();
|
| const ComputedStyle& primaryCellParentStyle =
|
| current.primaryCell()->parent()->styleRef();
|
| - const BorderValue& cb =
|
| - side == BorderStart
|
| - ? primaryCellStyle.borderStart()
|
| - : primaryCellStyle
|
| - .borderEnd(); // FIXME: Make this work with perpendicular and flipped cells.
|
| + // FIXME: Make this work with perpendicular and flipped cells.
|
| + const BorderValue& cb = side == BorderStart ? primaryCellStyle.borderStart()
|
| + : primaryCellStyle.borderEnd();
|
| const BorderValue& rb = side == BorderStart
|
| ? primaryCellParentStyle.borderStart()
|
| : primaryCellParentStyle.borderEnd();
|
| @@ -1506,7 +1544,8 @@ LayoutRect LayoutTableSection::logicalRectForWritingModeAndDirection(
|
| tableAlignedRect = tableAlignedRect.transposedRect();
|
|
|
| const Vector<int>& columnPos = table()->effectiveColumnPositions();
|
| - // FIXME: The table's direction should determine our row's direction, not the section's (see bug 96691).
|
| + // FIXME: The table's direction should determine our row's direction, not the
|
| + // section's (see bug 96691).
|
| if (!style()->isLeftToRightDirection())
|
| tableAlignedRect.setX(columnPos[columnPos.size() - 1] -
|
| tableAlignedRect.maxX());
|
| @@ -1523,8 +1562,8 @@ CellSpan LayoutTableSection::dirtiedRows(const LayoutRect& damageRect) const {
|
|
|
| CellSpan coveredRows = spannedRows(damageRect);
|
|
|
| - // To issue paint invalidations for the border we might need to paint invalidate the first
|
| - // or last row even if they are not spanned themselves.
|
| + // To issue paint invalidations for the border we might need to paint
|
| + // invalidate the first or last row even if they are not spanned themselves.
|
| RELEASE_ASSERT(coveredRows.start() < m_rowPos.size());
|
| if (coveredRows.start() == m_rowPos.size() - 1 &&
|
| m_rowPos[m_rowPos.size() - 1] + table()->outerBorderAfter() >=
|
| @@ -1549,8 +1588,9 @@ CellSpan LayoutTableSection::dirtiedEffectiveColumns(
|
| CellSpan coveredColumns = spannedEffectiveColumns(damageRect);
|
|
|
| const Vector<int>& columnPos = table()->effectiveColumnPositions();
|
| - // To issue paint invalidations for the border we might need to paint invalidate the first
|
| - // or last column even if they are not spanned themselves.
|
| + // To issue paint invalidations for the border we might need to paint
|
| + // invalidate the first or last column even if they are not spanned
|
| + // themselves.
|
| RELEASE_ASSERT(coveredColumns.start() < columnPos.size());
|
| if (coveredColumns.start() == columnPos.size() - 1 &&
|
| columnPos[columnPos.size() - 1] + table()->outerBorderEnd() >=
|
| @@ -1572,9 +1612,9 @@ CellSpan LayoutTableSection::spannedRows(const LayoutRect& flippedRect) const {
|
| std::upper_bound(m_rowPos.begin(), m_rowPos.end(), flippedRect.y()) -
|
| m_rowPos.begin();
|
|
|
| + // After all rows.
|
| if (nextRow == m_rowPos.size())
|
| - return CellSpan(m_rowPos.size() - 1,
|
| - m_rowPos.size() - 1); // After all rows.
|
| + return CellSpan(m_rowPos.size() - 1, m_rowPos.size() - 1);
|
|
|
| unsigned startRow = nextRow > 0 ? nextRow - 1 : 0;
|
|
|
| @@ -1598,10 +1638,10 @@ CellSpan LayoutTableSection::spannedEffectiveColumns(
|
| const Vector<int>& columnPos = table()->effectiveColumnPositions();
|
|
|
| // Find the first column that starts after rect left.
|
| - // lower_bound doesn't handle the edge between two cells properly as it would wrongly return the
|
| - // cell on the logical top/left.
|
| - // upper_bound on the other hand properly returns the cell on the logical bottom/right, which also
|
| - // matches the behavior of other browsers.
|
| + // lower_bound doesn't handle the edge between two cells properly as it would
|
| + // wrongly return the cell on the logical top/left.
|
| + // upper_bound on the other hand properly returns the cell on the logical
|
| + // bottom/right, which also matches the behavior of other browsers.
|
| unsigned nextColumn =
|
| std::upper_bound(columnPos.begin(), columnPos.end(), flippedRect.x()) -
|
| columnPos.begin();
|
| @@ -1629,9 +1669,9 @@ CellSpan LayoutTableSection::spannedEffectiveColumns(
|
|
|
| void LayoutTableSection::recalcCells() {
|
| ASSERT(m_needsCellRecalc);
|
| - // We reset the flag here to ensure that |addCell| works. This is safe to do as
|
| - // fillRowsWithDefaultStartingAtPosition makes sure we match the table's columns
|
| - // representation.
|
| + // We reset the flag here to ensure that |addCell| works. This is safe to do
|
| + // as fillRowsWithDefaultStartingAtPosition makes sure we match the table's
|
| + // columns representation.
|
| m_needsCellRecalc = false;
|
|
|
| m_cCol = 0;
|
| @@ -1657,7 +1697,8 @@ void LayoutTableSection::recalcCells() {
|
| setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::Unknown);
|
| }
|
|
|
| -// FIXME: This function could be made O(1) in certain cases (like for the non-most-constrainive cells' case).
|
| +// FIXME: This function could be made O(1) in certain cases (like for the
|
| +// non-most-constrainive cells' case).
|
| void LayoutTableSection::rowLogicalHeightChanged(LayoutTableRow* row) {
|
| if (needsCellRecalc())
|
| return;
|
| @@ -1768,10 +1809,10 @@ bool LayoutTableSection::nodeAtPoint(HitTestResult& result,
|
|
|
| if (hasOverflowingCell()) {
|
| for (LayoutTableRow* row = lastRow(); row; row = row->previousRow()) {
|
| - // FIXME: We have to skip over inline flows, since they can show up inside table rows
|
| - // at the moment (a demoted inline <form> for example). If we ever implement a
|
| - // table-specific hit-test method (which we should do for performance reasons anyway),
|
| - // then we can remove this check.
|
| + // FIXME: We have to skip over inline flows, since they can show up inside
|
| + // table rows at the moment (a demoted inline <form> for example). If we
|
| + // ever implement a table-specific hit-test method (which we should do for
|
| + // performance reasons anyway), then we can remove this check.
|
| if (!row->hasSelfPaintingLayer()) {
|
| LayoutPoint childPoint =
|
| flipForWritingModeForChild(row, adjustedLocation);
|
| @@ -1844,7 +1885,8 @@ void LayoutTableSection::setLogicalPositionForCell(
|
| LayoutPoint cellLocation(0, m_rowPos[cell->rowIndex()]);
|
| int horizontalBorderSpacing = table()->hBorderSpacing();
|
|
|
| - // FIXME: The table's direction should determine our row's direction, not the section's (see bug 96691).
|
| + // FIXME: The table's direction should determine our row's direction, not the
|
| + // section's (see bug 96691).
|
| if (!style()->isLeftToRightDirection())
|
| cellLocation.setX(LayoutUnit(
|
| table()->effectiveColumnPositions()[table()->numEffectiveColumns()] -
|
| @@ -1867,15 +1909,15 @@ void LayoutTableSection::relayoutCellIfFlexed(LayoutTableCell& cell,
|
| // This will cause these children to grow to fill the cell.
|
| // FIXME: There is still more work to do here to fully match WinIE (should
|
| // it become necessary to do so). In quirks mode, WinIE behaves like we
|
| - // do, but it will clip the cells that spill out of the table section. In
|
| + // do, but it will clip the cells that spill out of the table section.
|
| // strict mode, Mozilla and WinIE both regrow the table to accommodate the
|
| // new height of the cell (thus letting the percentages cause growth one
|
| - // time only). We may also not be handling row-spanning cells correctly.
|
| + // time only). We may also not be handling row-spanning cells correctly.
|
| //
|
| - // Note also the oddity where replaced elements always flex, and yet
|
| - // blocks/tables do not necessarily flex. WinIE is crazy and inconsistent,
|
| - // and we can't hope to match the behavior perfectly, but we'll continue to
|
| - // refine it as we discover new bugs. :)
|
| + // Note also the oddity where replaced elements always flex, and yet blocks/
|
| + // tables do not necessarily flex. WinIE is crazy and inconsistent, and we
|
| + // can't hope to match the behavior perfectly, but we'll continue to refine it
|
| + // as we discover new bugs. :)
|
| bool cellChildrenFlex = false;
|
| bool flexAllChildren = cell.style()->logicalHeight().isFixed() ||
|
| (!table()->style()->logicalHeight().isAuto() &&
|
| @@ -1933,8 +1975,9 @@ bool LayoutTableSection::isRepeatingHeaderGroup() const {
|
| if (logicalHeight() > pageHeight)
|
| return false;
|
|
|
| - // If the first row of the section after the header group doesn't fit on the page, then
|
| - // don't repeat the header on each page. See https://drafts.csswg.org/css-tables-3/#repeated-headers
|
| + // If the first row of the section after the header group doesn't fit on the
|
| + // page, then don't repeat the header on each page.
|
| + // See https://drafts.csswg.org/css-tables-3/#repeated-headers
|
| LayoutTableSection* sectionBelow = table()->sectionBelow(this);
|
| if (sectionBelow && sectionBelow->firstRow() &&
|
| sectionBelow->firstRow()->paginationStrut())
|
| @@ -1949,9 +1992,12 @@ bool LayoutTableSection::mapToVisualRectInAncestorSpace(
|
| VisualRectFlags flags) const {
|
| if (ancestor == this)
|
| return true;
|
| - // Repeating table headers are painted once per fragmentation page/column. This does not go through the regular fragmentation machinery,
|
| - // so we need special code to expand the invalidation rect to contain all positions of the header in all columns.
|
| - // Note that this is in flow thread coordinates, not visual coordinates. The enclosing LayoutFlowThread will convert to visual coordinates.
|
| + // Repeating table headers are painted once per fragmentation page/column.
|
| + // This does not go through the regular fragmentation machinery, so we need
|
| + // special code to expand the invalidation rect to contain all positions of
|
| + // the header in all columns.
|
| + // Note that this is in flow thread coordinates, not visual coordinates. The
|
| + // enclosing LayoutFlowThread will convert to visual coordinates.
|
| if (table()->header() == this && isRepeatingHeaderGroup())
|
| rect.setHeight(table()->logicalHeight());
|
| return LayoutTableBoxComponent::mapToVisualRectInAncestorSpace(ancestor, rect,
|
|
|