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

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: Created 6 years 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 718 matching lines...) Expand 10 before | Expand all | Expand 10 after
729 { 729 {
730 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan(); 730 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan();
731 } 731 }
732 732
733 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) 733 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
734 { 734 {
735 sizingData.itemsSortedByIncreasingSpan.shrink(0); 735 sizingData.itemsSortedByIncreasingSpan.shrink(0);
736 HashSet<RenderBox*> itemsSet; 736 HashSet<RenderBox*> itemsSet;
737 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 737 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
738 GridIterator iterator(m_grid, direction, trackIndex); 738 GridIterator iterator(m_grid, direction, trackIndex);
739 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
739 while (RenderBox* gridItem = iterator.nextGridItem()) { 740 while (RenderBox* gridItem = iterator.nextGridItem()) {
740 if (itemsSet.add(gridItem).isNewEntry) { 741 if (itemsSet.add(gridItem).isNewEntry) {
741 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m); 742 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m);
742 // We should not include items spanning more than one track that span tracks with flexible sizing functions. 743 if (integerSpanForDirection(coordinate, direction) == 1) {
743 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction)) 744 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d irection, coordinate, *gridItem, track, sizingData.columnTracks);
745 } else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, d irection)) {
744 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction)); 746 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction));
747 }
745 } 748 }
746 } 749 }
747 } 750 }
748 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); 751 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end());
749 752
750 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); 753 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
751 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { 754 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
752 GridItemWithSpan itemWithSpan = *it; 755 GridItemWithSpan itemWithSpan = *it;
753 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrac kSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); 756 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrac kSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth);
754 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize ::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth); 757 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMinTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::usedBreadth, &GridTrack::growUsedBreadth, &GridTrackSize ::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth);
755 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth ); 758 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMaxTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth );
756 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth); 759 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::maxBreadthIfNotInfinite, &GridTrack::growMaxBreadth);
757 } 760 }
758 761
759 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 762 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
760 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 763 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
761 if (track.m_maxBreadth == infinity) 764 if (track.m_maxBreadth == infinity)
762 track.m_maxBreadth = track.m_usedBreadth; 765 track.m_maxBreadth = track.m_usedBreadth;
763 } 766 }
764 } 767 }
765 768
769 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridCoordinate& coordinate, RenderBox& gri dItem, GridTrack& track, Vector<GridTrack>& columnTracks)
770 {
771 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
772 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
773
774 if (trackSize.hasMinContentMinTrackBreadth())
775 track.m_usedBreadth = std::max(track.m_usedBreadth, minContentForChild(g ridItem, direction, columnTracks));
776 else if (trackSize.hasMaxContentMinTrackBreadth())
777 track.m_usedBreadth = std::max(track.m_usedBreadth, maxContentForChild(g ridItem, direction, columnTracks));
778
779 if (trackSize.hasMinContentMaxTrackBreadth())
780 track.m_maxBreadth = std::max(track.m_maxBreadth, minContentForChild(gri dItem, direction, columnTracks));
781 else if (trackSize.hasMaxContentMaxTrackBreadth())
782 track.m_maxBreadth = std::max(track.m_maxBreadth, maxContentForChild(gri dItem, direction, columnTracks));
783 }
784
766 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction) 785 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction)
767 { 786 {
768 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); 787 const GridCoordinate coordinate = gridItemWithSpan.coordinate();
769 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; 788 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
770 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; 789 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
771 790
772 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); 791 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0);
773 sizingData.filteredTracks.shrink(0); 792 sizingData.filteredTracks.shrink(0);
774 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { 793 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
775 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() ); 794 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() );
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
1678 if (isOutOfFlowPositioned()) 1697 if (isOutOfFlowPositioned())
1679 return "RenderGrid (positioned)"; 1698 return "RenderGrid (positioned)";
1680 if (isAnonymous()) 1699 if (isAnonymous())
1681 return "RenderGrid (generated)"; 1700 return "RenderGrid (generated)";
1682 if (isRelPositioned()) 1701 if (isRelPositioned())
1683 return "RenderGrid (relative positioned)"; 1702 return "RenderGrid (relative positioned)";
1684 return "RenderGrid"; 1703 return "RenderGrid";
1685 } 1704 }
1686 1705
1687 } // namespace blink 1706 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698