Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(325)

Side by Side Diff: third_party/WebKit/Source/core/layout/TableLayoutAlgorithmAuto.cpp

Issue 1921973005: [css tables] Don't pass table width increase due to % columns to parents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: move variables around Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 2002 Lars Knoll (knoll@kde.org)
3 * (C) 2002 Dirk Mueller (mueller@kde.org) 3 * (C) 2002 Dirk Mueller (mueller@kde.org)
4 * Copyright (C) 2003, 2006, 2008, 2010 Apple Inc. All rights reserved. 4 * Copyright (C) 2003, 2006, 2008, 2010 Apple Inc. All rights reserved.
5 * 5 *
6 * This library is free software; you can redistribute it and/or 6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public 7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either 8 * License as published by the Free Software Foundation; either
9 * version 2 of the License. 9 * version 2 of the License.
10 * 10 *
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 208
209 void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt h, LayoutUnit& maxWidth) 209 void TableLayoutAlgorithmAuto::computeIntrinsicLogicalWidths(LayoutUnit& minWidt h, LayoutUnit& maxWidth)
210 { 210 {
211 TextAutosizer::TableLayoutScope textAutosizerTableLayoutScope(m_table); 211 TextAutosizer::TableLayoutScope textAutosizerTableLayoutScope(m_table);
212 212
213 fullRecalc(); 213 fullRecalc();
214 214
215 int spanMaxLogicalWidth = calcEffectiveLogicalWidth(); 215 int spanMaxLogicalWidth = calcEffectiveLogicalWidth();
216 minWidth = LayoutUnit(); 216 minWidth = LayoutUnit();
217 maxWidth = LayoutUnit(); 217 maxWidth = LayoutUnit();
218
219 for (size_t i = 0; i < m_layoutStruct.size(); ++i) {
220 minWidth += m_layoutStruct[i].effectiveMinLogicalWidth;
221 maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth;
222 }
223
224 maxWidth = LayoutUnit(std::max(maxWidth.floor(), spanMaxLogicalWidth));
225 }
226
227 LayoutUnit TableLayoutAlgorithmAuto::scaledWidthFromPercentColumns()
228 {
229 // Normally, scale all columns to satisfy this from CSS2.2:
230 // "A percentage value for a column width is relative to the table width.
231 // If the table has 'width: auto', a percentage represents a constraint on t he column's width"
232 if (!shouldScaleColumns(m_table))
233 return LayoutUnit(0);
234
218 float maxPercent = 0; 235 float maxPercent = 0;
219 float maxNonPercent = 0; 236 float maxNonPercent = 0;
220 bool scaleColumns = shouldScaleColumns(m_table);
221 237
222 // We substitute 0 percent by (epsilon / percentScaleFactor) percent in two places below to avoid division by zero. 238 // We substitute 0 percent by (epsilon / percentScaleFactor) percent in two places below to avoid division by zero.
223 // FIXME: Handle the 0% cases properly. 239 // FIXME: Handle the 0% cases properly.
224 const float epsilon = 1 / 128.0f; 240 const float epsilon = 1 / 128.0f;
225 241
226 float remainingPercent = 100; 242 float remainingPercent = 100;
227 for (size_t i = 0; i < m_layoutStruct.size(); ++i) { 243 for (size_t i = 0; i < m_layoutStruct.size(); ++i) {
228 minWidth += m_layoutStruct[i].effectiveMinLogicalWidth; 244 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) {
dgrogan 2016/04/27 03:14:05 Your excerpt was instrumental in my understanding
229 maxWidth += m_layoutStruct[i].effectiveMaxLogicalWidth; 245 float percent = std::min(static_cast<float>(m_layoutStruct[i].effect iveLogicalWidth.percent()), remainingPercent);
230 if (scaleColumns) { 246 float logicalWidth = static_cast<float>(m_layoutStruct[i].effectiveM axLogicalWidth) * 100 / std::max(percent, epsilon);
231 if (m_layoutStruct[i].effectiveLogicalWidth.hasPercent()) { 247 maxPercent = std::max(logicalWidth, maxPercent);
232 float percent = std::min(static_cast<float>(m_layoutStruct[i].ef fectiveLogicalWidth.percent()), remainingPercent); 248 remainingPercent -= percent;
233 float logicalWidth = static_cast<float>(m_layoutStruct[i].effect iveMaxLogicalWidth) * 100 / std::max(percent, epsilon); 249 } else {
234 maxPercent = std::max(logicalWidth, maxPercent); 250 maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth;
235 remainingPercent -= percent;
236 } else {
237 maxNonPercent += m_layoutStruct[i].effectiveMaxLogicalWidth;
238 }
239 } 251 }
240 } 252 }
241 253
242 if (scaleColumns) { 254 maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon);
243 maxNonPercent = maxNonPercent * 100 / std::max(remainingPercent, epsilon ); 255 LayoutUnit maxWidth = LayoutUnit(std::min(maxNonPercent, static_cast<float>( tableMaxWidth)));
244 maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxNonPercent, static_ cast<float>(tableMaxWidth)))); 256 return std::max(maxWidth, LayoutUnit(std::min(maxPercent, static_cast<float> (tableMaxWidth))));
245 maxWidth = std::max(maxWidth, LayoutUnit(std::min(maxPercent, static_cas t<float>(tableMaxWidth))));
246 }
247
248 maxWidth = LayoutUnit(std::max(maxWidth.floor(), spanMaxLogicalWidth));
249 } 257 }
250 258
251 void TableLayoutAlgorithmAuto::applyPreferredLogicalWidthQuirks(LayoutUnit& minW idth, LayoutUnit& maxWidth) const 259 void TableLayoutAlgorithmAuto::applyPreferredLogicalWidthQuirks(LayoutUnit& minW idth, LayoutUnit& maxWidth) const
252 { 260 {
253 Length tableLogicalWidth = m_table->style()->logicalWidth(); 261 Length tableLogicalWidth = m_table->style()->logicalWidth();
254 if (tableLogicalWidth.isFixed() && tableLogicalWidth.isPositive()) { 262 if (tableLogicalWidth.isFixed() && tableLogicalWidth.isPositive()) {
255 // |minWidth| is the result of measuring the intrinsic content's size. K eep it to 263 // |minWidth| is the result of measuring the intrinsic content's size. K eep it to
256 // make sure we are *never* smaller than the actual content. 264 // make sure we are *never* smaller than the actual content.
257 LayoutUnit minContentWidth = minWidth; 265 LayoutUnit minContentWidth = minWidth;
258 // FIXME: This line looks REALLY suspicious as it could allow the minimu m 266 // FIXME: This line looks REALLY suspicious as it could allow the minimu m
(...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after
694 int reduce = available * minMaxDiff / logicalWidthBeyondMin; 702 int reduce = available * minMaxDiff / logicalWidthBeyondMin;
695 m_layoutStruct[i].computedLogicalWidth += reduce; 703 m_layoutStruct[i].computedLogicalWidth += reduce;
696 available -= reduce; 704 available -= reduce;
697 logicalWidthBeyondMin -= minMaxDiff; 705 logicalWidthBeyondMin -= minMaxDiff;
698 if (available >= 0) 706 if (available >= 0)
699 break; 707 break;
700 } 708 }
701 } 709 }
702 } 710 }
703 } // namespace blink 711 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698