Index: Source/core/layout/TableLayoutAlgorithmAuto.cpp |
diff --git a/Source/core/layout/TableLayoutAlgorithmAuto.cpp b/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
index 450fe6fef269d70eccea5fa2f7b1842b9087220a..22354b5fffd07e5fb63355f58f2a2a3ca6e1c9fb 100644 |
--- a/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
+++ b/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
@@ -63,16 +63,11 @@ void TableLayoutAlgorithmAuto::recalcColumn(unsigned effCol) |
if (current.inColSpan || !cell) |
continue; |
+ columnLayout.columnHasNoCells = false; |
- bool cellHasContent = cell->children()->firstChild() || cell->style()->hasBorder() || cell->style()->hasPadding() || cell->style()->hasBackground(); |
- if (cellHasContent) |
+ if (cell->maxPreferredLogicalWidth()) |
columnLayout.emptyCellsOnly = false; |
- // A cell originates in this column. Ensure we have |
- // a min/max width of at least 1px for this column now. |
- columnLayout.minLogicalWidth = std::max<int>(columnLayout.minLogicalWidth, cellHasContent ? 1 : 0); |
- columnLayout.maxLogicalWidth = std::max<int>(columnLayout.maxLogicalWidth, 1); |
- |
if (cell->colSpan() == 1) { |
columnLayout.minLogicalWidth = std::max<int>(cell->minPreferredLogicalWidth(), columnLayout.minLogicalWidth); |
if (cell->maxPreferredLogicalWidth() > columnLayout.maxLogicalWidth) { |
@@ -120,6 +115,9 @@ void TableLayoutAlgorithmAuto::recalcColumn(unsigned effCol) |
break; |
} |
} else if (!effCol || section->primaryCellAt(i, effCol - 1) != cell) { |
+ // If a cell originates in this spanning column ensure we have a min/max width of at least 1px for it. |
+ columnLayout.minLogicalWidth = std::max<int>(columnLayout.minLogicalWidth, cell->maxPreferredLogicalWidth() ? 1 : 0); |
+ |
// This spanning cell originates in this column. Insert the cell into spanning cells list. |
insertSpanCell(cell); |
} |
@@ -373,13 +371,13 @@ int TableLayoutAlgorithmAuto::calcEffectiveLogicalWidth() |
int totalWidth = 0; |
for (unsigned pos = effCol; pos < lastCol; ++pos) { |
if (!m_layoutStruct[pos].effectiveLogicalWidth.hasPercent()) |
- totalWidth += m_layoutStruct[pos].effectiveMaxLogicalWidth; |
+ totalWidth += m_layoutStruct[pos].clampedEffectiveMaxLogicalWidth(); |
} |
for (unsigned pos = effCol; pos < lastCol && totalWidth > 0; ++pos) { |
if (!m_layoutStruct[pos].effectiveLogicalWidth.hasPercent()) { |
float percent = percentMissing * static_cast<float>(m_layoutStruct[pos].effectiveMaxLogicalWidth) / totalWidth; |
- totalWidth -= m_layoutStruct[pos].effectiveMaxLogicalWidth; |
+ totalWidth -= m_layoutStruct[pos].clampedEffectiveMaxLogicalWidth(); |
percentMissing -= percent; |
if (percent > 0) |
m_layoutStruct[pos].effectiveLogicalWidth.setValue(Percent, percent); |
@@ -538,7 +536,7 @@ void TableLayoutAlgorithmAuto::layout() |
break; |
case Fixed: |
numFixed++; |
- totalFixed += m_layoutStruct[i].effectiveMaxLogicalWidth; |
+ totalFixed += m_layoutStruct[i].clampedEffectiveMaxLogicalWidth(); |
// fall through |
break; |
case Auto: |
@@ -546,7 +544,7 @@ void TableLayoutAlgorithmAuto::layout() |
numAutoEmptyCellsOnly++; |
} else { |
numAuto++; |
- totalAuto += m_layoutStruct[i].effectiveMaxLogicalWidth; |
+ totalAuto += m_layoutStruct[i].clampedEffectiveMaxLogicalWidth(); |
allocAuto += cellLogicalWidth; |
} |
break; |
@@ -594,13 +592,17 @@ void TableLayoutAlgorithmAuto::layout() |
} |
} |
- // Give each auto width column its share of the available width. |
+ // Give each auto width column its share of the available width, non-empty columns then empty columns. |
if (available > 0 && numAuto) { |
available += allocAuto; |
distributeWidthToColumns<float, Auto, NonEmptyCells, InitialWidth, StartToEnd>(available, totalAuto); |
} |
+ if (available > 0 && numAutoEmptyCellsOnly) { |
+ unsigned total = numAutoEmptyCellsOnly; |
+ distributeWidthToColumns<unsigned, Auto, EmptyCells, InitialWidth, StartToEnd>(available, total); |
+ } |
- // Any remaining available width expands fixed width, percent width and non-empty auto width columns, in that order. |
+ // Any remaining available width expands fixed width, percent width, and non-empty auto width columns, in that order. |
if (available > 0 && numFixed) |
distributeWidthToColumns<float, Fixed, AllCells, ExtraWidth, StartToEnd>(available, totalFixed); |
@@ -643,6 +645,10 @@ void TableLayoutAlgorithmAuto::distributeWidthToColumns(int& available, Total& t |
const Length& logicalWidth = m_layoutStruct[i].effectiveLogicalWidth; |
if (cellsToProcess == NonEmptyCells && logicalWidth.isAuto() && m_layoutStruct[i].emptyCellsOnly) |
continue; |
+ // When allocating width to columns with nothing but empty cells we avoid |
+ // columns that exist only to flesh out a colspan and have no actual cells. |
+ if (cellsToProcess == EmptyCells && logicalWidth.isAuto() && (!m_layoutStruct[i].emptyCellsOnly || m_layoutStruct[i].columnHasNoCells)) |
+ continue; |
if (distributionMode != LeftoverWidth && logicalWidth.type() != lengthType) |
continue; |
@@ -651,7 +657,7 @@ void TableLayoutAlgorithmAuto::distributeWidthToColumns(int& available, Total& t |
if (lengthType == Percent) |
factor = logicalWidth.percent(); |
else if (lengthType == Auto || lengthType == Fixed) |
- factor = m_layoutStruct[i].effectiveMaxLogicalWidth; |
+ factor = m_layoutStruct[i].clampedEffectiveMaxLogicalWidth(); |
} |
int newWidth = available * factor / total; |