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

Side by Side Diff: Source/core/rendering/RenderGrid.cpp

Issue 802243003: [CSS Grid Layout] Incorrect sizing of tracks with non-spanning items (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Rebased + Test fixes Created 5 years, 11 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) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 750 matching lines...) Expand 10 before | Expand all | Expand 10 after
761 { 761 {
762 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan(); 762 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan();
763 } 763 }
764 764
765 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) 765 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
766 { 766 {
767 sizingData.itemsSortedByIncreasingSpan.shrink(0); 767 sizingData.itemsSortedByIncreasingSpan.shrink(0);
768 HashSet<RenderBox*> itemsSet; 768 HashSet<RenderBox*> itemsSet;
769 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 769 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
770 GridIterator iterator(m_grid, direction, trackIndex); 770 GridIterator iterator(m_grid, direction, trackIndex);
771 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
771 while (RenderBox* gridItem = iterator.nextGridItem()) { 772 while (RenderBox* gridItem = iterator.nextGridItem()) {
772 if (itemsSet.add(gridItem).isNewEntry) { 773 if (itemsSet.add(gridItem).isNewEntry) {
773 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m); 774 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m);
774 // We should not include items spanning more than one track that span tracks with flexible sizing functions. 775 if (integerSpanForDirection(coordinate, direction) == 1) {
775 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction)) 776 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d irection, coordinate, *gridItem, track, sizingData.columnTracks);
777 } else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, d irection)) {
776 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction)); 778 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction));
779 }
777 } 780 }
778 } 781 }
779 } 782 }
780 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); 783 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end());
781 784
782 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); 785 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
783 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { 786 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
784 GridItemWithSpan itemWithSpan = *it; 787 GridItemWithSpan itemWithSpan = *it;
785 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize: :hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); 788 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize: :hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
786 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasM axContentMinTrackBreadthAndMaxContentMaxTrackBreadth); 789 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize::hasM axContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
787 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLim it); 790 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLim it);
788 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit); 791 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit);
789 } 792 }
790 793
791 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 794 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
792 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 795 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
793 if (track.growthLimitIsInfinite()) 796 if (track.growthLimitIsInfinite())
794 track.setGrowthLimit(track.baseSize()); 797 track.setGrowthLimit(track.baseSize());
795 } 798 }
796 } 799 }
797 800
801 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridCoordinate& coordinate, RenderBox& gri dItem, GridTrack& track, Vector<GridTrack>& columnTracks)
802 {
803 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
804 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
805
806 if (trackSize.hasMinContentMinTrackBreadth())
807 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks)));
808 else if (trackSize.hasMaxContentMinTrackBreadth())
809 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks)));
810
811 if (trackSize.hasMinContentMaxTrackBreadth())
812 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, columnTracks)));
813 else if (trackSize.hasMaxContentMaxTrackBreadth())
814 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, columnTracks)));
815 }
816
798 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction) 817 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction)
799 { 818 {
800 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); 819 const GridCoordinate coordinate = gridItemWithSpan.coordinate();
Julien - ping for review 2015/01/14 09:59:28 Shouldn't we put an ASSERT that no item spanning a
svillar 2015/01/14 10:11:56 Acknowledged.
801 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; 820 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
802 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; 821 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
803 822
804 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); 823 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0);
805 sizingData.filteredTracks.shrink(0); 824 sizingData.filteredTracks.shrink(0);
806 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { 825 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
807 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() ); 826 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() );
808 if (!(trackSize.*filterFunction)()) 827 if (!(trackSize.*filterFunction)())
809 continue; 828 continue;
810 829
(...skipping 904 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 if (isOutOfFlowPositioned()) 1734 if (isOutOfFlowPositioned())
1716 return "RenderGrid (positioned)"; 1735 return "RenderGrid (positioned)";
1717 if (isAnonymous()) 1736 if (isAnonymous())
1718 return "RenderGrid (generated)"; 1737 return "RenderGrid (generated)";
1719 if (isRelPositioned()) 1738 if (isRelPositioned())
1720 return "RenderGrid (relative positioned)"; 1739 return "RenderGrid (relative positioned)";
1721 return "RenderGrid"; 1740 return "RenderGrid";
1722 } 1741 }
1723 1742
1724 } // namespace blink 1743 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698