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, |