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

Unified Diff: Source/core/rendering/RenderGrid.cpp

Issue 26557002: Fix the preferred logical widths code to work with spanning grid items (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/rendering/RenderGrid.cpp
diff --git a/Source/core/rendering/RenderGrid.cpp b/Source/core/rendering/RenderGrid.cpp
index d7abeb6d63f9b34fd733bef1cf2f15af38dcf111..2cce82505055306e7aedd4857cd5c8b1df6705cc 100644
--- a/Source/core/rendering/RenderGrid.cpp
+++ b/Source/core/rendering/RenderGrid.cpp
@@ -302,13 +302,13 @@ void RenderGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, Layo
{
const_cast<RenderGrid*>(this)->placeItemsOnGrid();
- // FIXME: This is an inefficient way to fill our sizes as it will try every grid areas, when we would
- // only want to account for fixed grid tracks and grid items. Also this will be incorrect if we have spanning
- // grid items.
- for (size_t i = 0; i < gridColumnCount(); ++i) {
- const GridTrackSize& trackSize = gridTrackSize(ForColumns, i);
- LayoutUnit minTrackBreadth = computePreferredTrackWidth(trackSize.minTrackBreadth(), i);
- LayoutUnit maxTrackBreadth = computePreferredTrackWidth(trackSize.maxTrackBreadth(), i);
+ GridSizingData sizingData(gridColumnCount(), gridRowCount());
+ LayoutUnit availableLogicalSpace = 0;
+ const_cast<RenderGrid*>(this)->computedUsedBreadthOfGridTracks(ForColumns, sizingData, availableLogicalSpace);
+
+ for (size_t i = 0; i < sizingData.columnTracks.size(); ++i) {
+ LayoutUnit minTrackBreadth = sizingData.columnTracks[i].m_usedBreadth;
+ LayoutUnit maxTrackBreadth = sizingData.columnTracks[i].m_maxBreadth;
maxTrackBreadth = std::max(maxTrackBreadth, minTrackBreadth);
minLogicalWidth += minTrackBreadth;
@@ -337,44 +337,14 @@ void RenderGrid::computePreferredLogicalWidths()
clearPreferredLogicalWidthsDirty();
}
-LayoutUnit RenderGrid::computePreferredTrackWidth(const GridLength& gridLength, size_t trackIndex) const
+void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, GridSizingData& sizingData)
{
- if (gridLength.isFlex())
- return 0;
-
- const Length& length = gridLength.length();
-
- if (length.isFixed()) {
- // Grid areas don't have borders, margins or paddings so we don't need to account for them.
- return length.intValue();
- }
-
- if (length.isMinContent()) {
- LayoutUnit minContentSize = 0;
- GridIterator iterator(m_grid, ForColumns, trackIndex);
- while (RenderBox* gridItem = iterator.nextGridItem())
- minContentSize = std::max(minContentSize, gridItem->minPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(gridItem));
-
- return minContentSize;
- }
-
- if (length.isMaxContent()) {
- LayoutUnit maxContentSize = 0;
- GridIterator iterator(m_grid, ForColumns, trackIndex);
- while (RenderBox* gridItem = iterator.nextGridItem())
- maxContentSize = std::max(maxContentSize, gridItem->maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(gridItem));
-
- return maxContentSize;
- }
-
- // FIXME: css3-sizing mentions that we should resolve "definite sizes"
- // (including <percentage> and calc()) but we don't do it elsewhere.
- return 0;
+ LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogicalWidth() : availableLogicalHeight(IncludeMarginBorderPadding);
+ computedUsedBreadthOfGridTracks(direction, sizingData, availableLogicalSpace);
}
-void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, GridSizingData& sizingData)
+void RenderGrid::computedUsedBreadthOfGridTracks(TrackSizingDirection direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
{
- LayoutUnit availableLogicalSpace = (direction == ForColumns) ? availableLogicalWidth() : availableLogicalHeight(IncludeMarginBorderPadding);
Vector<GridTrack>& tracks = (direction == ForColumns) ? sizingData.columnTracks : sizingData.rowTracks;
sizingData.contentSizedTracksIndex.shrink(0);
for (size_t i = 0; i < tracks.size(); ++i) {
@@ -560,7 +530,7 @@ LayoutUnit RenderGrid::minContentForChild(RenderBox* child, TrackSizingDirection
if (direction == ForColumns) {
// FIXME: It's unclear if we should return the intrinsic width or the preferred width.
// See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
- return child->minPreferredLogicalWidth();
+ return child->minPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(child);
}
return logicalContentHeightForChild(child, columnTracks);
@@ -576,7 +546,7 @@ LayoutUnit RenderGrid::maxContentForChild(RenderBox* child, TrackSizingDirection
if (direction == ForColumns) {
// FIXME: It's unclear if we should return the intrinsic width or the preferred width.
// See http://lists.w3.org/Archives/Public/www-style/2013Jan/0245.html
- return child->maxPreferredLogicalWidth();
+ return child->maxPreferredLogicalWidth() + marginIntrinsicLogicalWidthForChild(child);
}
return logicalContentHeightForChild(child, columnTracks);
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698