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

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: Patch for landing v3 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
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | Source/core/rendering/style/GridTrackSize.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 711 matching lines...) Expand 10 before | Expand all | Expand 10 after
722 GridItemWithSpan(RenderBox& gridItem, const GridCoordinate& coordinate, Grid TrackSizingDirection direction) 722 GridItemWithSpan(RenderBox& gridItem, const GridCoordinate& coordinate, Grid TrackSizingDirection direction)
723 : m_gridItem(gridItem) 723 : m_gridItem(gridItem)
724 , m_coordinate(coordinate) 724 , m_coordinate(coordinate)
725 { 725 {
726 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi nate.columns; 726 const GridSpan& span = (direction == ForRows) ? coordinate.rows : coordi nate.columns;
727 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi on.toInt() + 1; 727 m_span = span.resolvedFinalPosition.toInt() - span.resolvedInitialPositi on.toInt() + 1;
728 } 728 }
729 729
730 RenderBox& gridItem() const { return *m_gridItem; } 730 RenderBox& gridItem() const { return *m_gridItem; }
731 GridCoordinate coordinate() const { return m_coordinate; } 731 GridCoordinate coordinate() const { return m_coordinate; }
732 #if ENABLE(ASSERT)
733 size_t span() const { return m_span; }
734 #endif
732 735
733 bool operator<(const GridItemWithSpan other) const { return m_span < other.m _span; } 736 bool operator<(const GridItemWithSpan other) const { return m_span < other.m _span; }
734 737
735 void trace(Visitor* visitor) 738 void trace(Visitor* visitor)
736 { 739 {
737 visitor->trace(m_gridItem); 740 visitor->trace(m_gridItem);
738 } 741 }
739 742
740 private: 743 private:
741 RawPtrWillBeMember<RenderBox> m_gridItem; 744 RawPtrWillBeMember<RenderBox> m_gridItem;
(...skipping 19 matching lines...) Expand all
761 { 764 {
762 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan(); 765 return (direction == ForRows) ? coordinate.rows.integerSpan() : coordinate.c olumns.integerSpan();
763 } 766 }
764 767
765 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace) 768 void RenderGrid::resolveContentBasedTrackSizingFunctions(GridTrackSizingDirectio n direction, GridSizingData& sizingData, LayoutUnit& availableLogicalSpace)
766 { 769 {
767 sizingData.itemsSortedByIncreasingSpan.shrink(0); 770 sizingData.itemsSortedByIncreasingSpan.shrink(0);
768 HashSet<RenderBox*> itemsSet; 771 HashSet<RenderBox*> itemsSet;
769 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 772 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
770 GridIterator iterator(m_grid, direction, trackIndex); 773 GridIterator iterator(m_grid, direction, trackIndex);
774 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
771 while (RenderBox* gridItem = iterator.nextGridItem()) { 775 while (RenderBox* gridItem = iterator.nextGridItem()) {
772 if (itemsSet.add(gridItem).isNewEntry) { 776 if (itemsSet.add(gridItem).isNewEntry) {
773 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m); 777 const GridCoordinate& coordinate = cachedGridCoordinate(*gridIte m);
774 // We should not include items spanning more than one track that span tracks with flexible sizing functions. 778 if (integerSpanForDirection(coordinate, direction) == 1) {
775 if (integerSpanForDirection(coordinate, direction) == 1 || !span ningItemCrossesFlexibleSizedTracks(coordinate, direction)) 779 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(d irection, coordinate, *gridItem, track, sizingData.columnTracks);
780 } else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, d irection)) {
776 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction)); 781 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSp an(*gridItem, coordinate, direction));
782 }
777 } 783 }
778 } 784 }
779 } 785 }
780 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end()); 786 std::sort(sizingData.itemsSortedByIncreasingSpan.begin(), sizingData.itemsSo rtedByIncreasingSpan.end());
781 787
782 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end(); 788 Vector<GridItemWithSpan>::iterator end = sizingData.itemsSortedByIncreasingS pan.end();
783 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) { 789 for (Vector<GridItemWithSpan>::iterator it = sizingData.itemsSortedByIncreas ingSpan.begin(); it != end; ++it) {
784 GridItemWithSpan itemWithSpan = *it; 790 GridItemWithSpan itemWithSpan = *it;
785 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMinOrMaxContentMinTrackBreadth, &RenderGrid::min ContentForChild, &GridTrack::baseSize, &GridTrack::growBaseSize, &GridTrackSize: :hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth); 791 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); 792 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); 793 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); 794 resolveContentBasedTrackSizingFunctionsForItems(direction, sizingData, i temWithSpan, &GridTrackSize::hasMaxContentMaxTrackBreadth, &RenderGrid::maxConte ntForChild, &GridTrack::growthLimitIfNotInfinite, &GridTrack::growGrowthLimit);
789 } 795 }
790 796
791 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) { 797 for (const auto& trackIndex : sizingData.contentSizedTracksIndex) {
792 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex]; 798 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[t rackIndex] : sizingData.rowTracks[trackIndex];
793 if (track.growthLimitIsInfinite()) 799 if (track.growthLimitIsInfinite())
794 track.setGrowthLimit(track.baseSize()); 800 track.setGrowthLimit(track.baseSize());
795 } 801 }
796 } 802 }
797 803
804 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(Grid TrackSizingDirection direction, const GridCoordinate& coordinate, RenderBox& gri dItem, GridTrack& track, Vector<GridTrack>& columnTracks)
805 {
806 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coord inate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition;
807 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt());
808
809 if (trackSize.hasMinContentMinTrackBreadth())
810 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem , direction, columnTracks)));
811 else if (trackSize.hasMaxContentMinTrackBreadth())
812 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem , direction, columnTracks)));
813
814 if (trackSize.hasMinContentMaxTrackBreadth())
815 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gr idItem, direction, columnTracks)));
816 else if (trackSize.hasMaxContentMaxTrackBreadth())
817 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gr idItem, direction, columnTracks)));
818 }
819
798 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction) 820 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizing Direction direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithS pan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGe tter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction gr owAboveMaxBreadthFilterFunction)
799 { 821 {
822 ASSERT(gridItemWithSpan.span() > 1);
800 const GridCoordinate coordinate = gridItemWithSpan.coordinate(); 823 const GridCoordinate coordinate = gridItemWithSpan.coordinate();
801 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition; 824 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPo sition;
802 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ; 825 const GridResolvedPosition finalTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedFinalPosition : coordinate.rows.resolvedFinalPosition ;
803 826
804 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0); 827 sizingData.growAboveMaxBreadthTrackIndexes.shrink(0);
805 sizingData.filteredTracks.shrink(0); 828 sizingData.filteredTracks.shrink(0);
806 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) { 829 for (GridResolvedPosition trackPosition = initialTrackPosition; trackPositio n <= finalTrackPosition; ++trackPosition) {
807 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() ); 830 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt() );
808 if (!(trackSize.*filterFunction)()) 831 if (!(trackSize.*filterFunction)())
809 continue; 832 continue;
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after
1715 if (isOutOfFlowPositioned()) 1738 if (isOutOfFlowPositioned())
1716 return "RenderGrid (positioned)"; 1739 return "RenderGrid (positioned)";
1717 if (isAnonymous()) 1740 if (isAnonymous())
1718 return "RenderGrid (generated)"; 1741 return "RenderGrid (generated)";
1719 if (isRelPositioned()) 1742 if (isRelPositioned())
1720 return "RenderGrid (relative positioned)"; 1743 return "RenderGrid (relative positioned)";
1721 return "RenderGrid"; 1744 return "RenderGrid";
1722 } 1745 }
1723 1746
1724 } // namespace blink 1747 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderGrid.h ('k') | Source/core/rendering/style/GridTrackSize.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698