Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp b/third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
| index 0ff2aad54ee239d5a6080cad371f6bc07eecb043..56982e17914c4269a2a5b02ca5f0c345de42f13b 100644 |
| --- a/third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
| +++ b/third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp |
| @@ -177,8 +177,13 @@ void TableLayoutAlgorithmAuto::fullRecalc() |
| recalcColumn(i); |
| } |
| +static bool shouldScaleColumnsForParent(LayoutTable* table) |
| +{ |
| + return !table->containingBlock()->isTableCell(); |
|
dgrogan
2016/04/28 01:04:31
This is the naive first cut. It doesn't even imple
mstensho (USE GERRIT)
2016/04/28 09:18:05
I see. This approach should in theory not cause an
|
| +} |
| + |
| // FIXME: This needs to be adapted for vertical writing modes. |
| -static bool shouldScaleColumns(LayoutTable* table) |
| +static bool shouldScaleColumnsForSelf(LayoutTable* table) |
| { |
| // A special case. If this table is not fixed width and contained inside |
| // a cell, then don't bloat the maxwidth by examining percentage growth. |
| @@ -215,9 +220,26 @@ void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt |
| int spanMaxLogicalWidth = calcEffectiveLogicalWidth(); |
| minWidth = LayoutUnit(); |
| maxWidth = LayoutUnit(); |
| + |
| + for (size_t i = 0; i < m_layoutStruct.size(); ++i) { |
| + minWidth += m_layoutStruct[i].effectiveMinLogicalWidth; |
| + maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth; |
| + } |
| + if (shouldScaleColumnsForParent(m_table)) |
| + maxWidth = std::max(maxWidth, scaledWidthFromPercentColumns()); |
| + maxWidth = LayoutUnit(std::max(maxWidth.floor(), spanMaxLogicalWidth)); |
| +} |
| + |
| +LayoutUnit TableLayoutAlgorithmAuto::scaledWidthFromPercentColumns() |
|
dgrogan
2016/04/28 01:04:31
Ignore that this is a separate function for now. I
|
| +{ |
| + // Normally, scale all columns to satisfy this from CSS2.2: |
| + // "A percentage value for a column width is relative to the table width. |
| + // If the table has 'width: auto', a percentage represents a constraint on the column's width" |
| + if (!shouldScaleColumnsForSelf(m_table)) |
| + return LayoutUnit(0); |
| + |
| float maxPercent = 0; |
| float maxNonPercent = 0; |
| - bool scaleColumns = shouldScaleColumns(m_table); |
| // We substitute 0 percent by (epsilon / percentScaleFactor) percent in two places below to avoid division by zero. |
| // FIXME: Handle the 0% cases properly. |
| @@ -225,27 +247,19 @@ void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt |
| float remainingPercent = 100; |
| for (size_t i = 0; i < m_layoutStruct.size(); ++i) { |
| - minWidth += m_layoutStruct[i].effectiveMinLogicalWidth; |
| - maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth; |
| - if (scaleColumns) { |
| - if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) { |
| - float percent = std::min(static_cast<float>(m_layoutStruct[i].effectiveLogicalWidth.percent()), remainingPercent); |
| - float logicalWidth = static_cast<float>(m_layoutStruct[i].effectiveMaxLogicalWidth) * 100 / std::max(percent, epsilon); |
| - maxPercent = std::max(logicalWidth, maxPercent); |
| - remainingPercent -= percent; |
| - } else { |
| - maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth; |
| - } |
| + if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) { |
| + float percent = std::min(static_cast<float>(m_layoutStruct[i].effectiveLogicalWidth.percent()), remainingPercent); |
| + float logicalWidth = static_cast<float>(m_layoutStruct[i].effectiveMaxLogicalWidth) * 100 / std::max(percent, epsilon); |
| + maxPercent = std::max(logicalWidth, maxPercent); |
| + remainingPercent -= percent; |
| + } else { |
| + maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth; |
| } |
| } |
| - if (scaleColumns) { |
| - maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon); |
| - maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxNonPercent, static_cast<float>(tableMaxWidth)))); |
| - maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxPercent, static_cast<float>(tableMaxWidth)))); |
| - } |
| - |
| - maxWidth = LayoutUnit(std::max(maxWidth.floor(), spanMaxLogicalWidth)); |
| + maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon); |
| + LayoutUnit maxWidth = LayoutUnit(std::min(maxNonPercent, static_cast<float>(tableMaxWidth))); |
| + return std::max(maxWidth, LayoutUnit(std::min(maxPercent, static_cast<float>(tableMaxWidth)))); |
| } |
| void TableLayoutAlgorithmAuto::applyPreferredLogicalWidthQuirks(LayoutUnit& minWidth, LayoutUnit& maxWidth) const |