Changeset 180142 in webkit
- Timestamp:
- Feb 16, 2015 4:00:17 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r180138 r180142 1 2015-02-13 Sergio Villar Senin <svillar@igalia.com> 2 3 [CSS Grid Layout] Invalid initialization of track sizes with non spanning grid items 4 https://bugs.webkit.org/show_bug.cgi?id=140763 5 6 Reviewed by Antti Koivisto. 7 8 * fast/css-grid-layout/grid-content-sized-columns-resolution-expected.txt: 9 * fast/css-grid-layout/grid-content-sized-columns-resolution.html: 10 * fast/css-grid-layout/grid-initialize-span-one-items-expected.txt: Added. 11 * fast/css-grid-layout/grid-initialize-span-one-items.html: Added. 12 1 13 2015-02-15 Filip Pizlo <fpizlo@apple.com> 2 14 -
trunk/LayoutTests/fast/css-grid-layout/grid-content-sized-columns-resolution-expected.txt
r180003 r180142 14 14 Check that items are processed by ascending span to compute track breadths forbidding extra space distribution. 15 15 PASS window.getComputedStyle(gridMinContentFixedAndAutoUnsortedConstrained, '').getPropertyValue('-webkit-grid-template-columns') is "0px 40px" 16 PASS window.getComputedStyle(gridAutoAndAutoUnsortedConstrained, '').getPropertyValue('-webkit-grid-template-columns') is " 5px 35px"16 PASS window.getComputedStyle(gridAutoAndAutoUnsortedConstrained, '').getPropertyValue('-webkit-grid-template-columns') is "10px 30px" 17 17 PASS window.getComputedStyle(gridMinContentAndMinContentFixedUnsortedConstrained, '').getPropertyValue('-webkit-grid-template-columns') is "0px 40px" 18 18 PASS window.getComputedStyle(gridMaxContentAndMinContentUnsortedConstrained, '').getPropertyValue('-webkit-grid-template-columns') is "0px 70px" … … 28 28 Check that items are processed by ascending span to compute track breadths allowing extra space distribution. 29 29 PASS window.getComputedStyle(gridMinContentFixedAndAutoUnsorted, '').getPropertyValue('-webkit-grid-template-columns') is "15px 90px" 30 PASS window.getComputedStyle(gridAutoAndAutoUnsorted, '').getPropertyValue('-webkit-grid-template-columns') is " 30px 60px"30 PASS window.getComputedStyle(gridAutoAndAutoUnsorted, '').getPropertyValue('-webkit-grid-template-columns') is "60px 30px" 31 31 PASS window.getComputedStyle(gridMinContentAndMinContentFixedUnsorted, '').getPropertyValue('-webkit-grid-template-columns') is "0px 40px" 32 32 PASS window.getComputedStyle(gridMaxContentAndMinContentUnsorted, '').getPropertyValue('-webkit-grid-template-columns') is "0px 70px" -
trunk/LayoutTests/fast/css-grid-layout/grid-content-sized-columns-resolution.html
r180003 r180142 317 317 debug("Check that items are processed by ascending span to compute track breadths forbidding extra space distribution."); 318 318 testGridColumnsValues("gridMinContentFixedAndAutoUnsortedConstrained", "0px 40px"); 319 testGridColumnsValues("gridAutoAndAutoUnsortedConstrained", " 5px 35px");319 testGridColumnsValues("gridAutoAndAutoUnsortedConstrained", "10px 30px"); 320 320 testGridColumnsValues("gridMinContentAndMinContentFixedUnsortedConstrained", "0px 40px"); 321 321 testGridColumnsValues("gridMaxContentAndMinContentUnsortedConstrained", "0px 70px"); … … 332 332 debug("Check that items are processed by ascending span to compute track breadths allowing extra space distribution."); 333 333 testGridColumnsValues("gridMinContentFixedAndAutoUnsorted", "15px 90px"); 334 testGridColumnsValues("gridAutoAndAutoUnsorted", " 30px 60px");334 testGridColumnsValues("gridAutoAndAutoUnsorted", "60px 30px"); 335 335 testGridColumnsValues("gridMinContentAndMinContentFixedUnsorted", "0px 40px"); 336 336 testGridColumnsValues("gridMaxContentAndMinContentUnsorted", "0px 70px"); -
trunk/Source/WebCore/ChangeLog
r180141 r180142 1 2015-02-13 Sergio Villar Senin <svillar@igalia.com> 2 3 [CSS Grid Layout] Invalid initialization of track sizes with non spanning grid items 4 https://bugs.webkit.org/show_bug.cgi?id=140763 5 6 Reviewed by Antti Koivisto. 7 8 Content sized tracks with non-spanning grid items were not 9 properly sized because the growth limit was sometimes infinity 10 (-1) after calling resolveContentBasedTrackSizingFunctions() when 11 it should not. This patch adds an special initialization phase for 12 non-spanning grid items as the new track sizing algorithm 13 describes. 14 15 Granted, that was handled in the old algorithm in 16 distributeSpaceToTracks() as a special case. The problem is that 17 it regressed after the optimization added in r173868 because that 18 method is no longer called when the space to distribute is 0. 19 20 That's why we could fix this by allowing calls to 21 distributeSpaceToTracks() with spaceToDistribute>=0 but by fixing 22 it with an explicit initialization our implementation becomes 23 closer to the new algorithm and the initialization is now explicit 24 in the code instead of a side effect of calling 25 distributeSpaceToTracks() with no space to be distributed. It also 26 brings a slight performance improvement as we save sorts and hash 27 lookups. 28 29 I also took the change to add caching to several GridTrackSize 30 methods that were hot on the profiler (each one accounted for ~1% 31 of the total time, now they account for ~0.3% each). 32 33 Test: fast/css-grid-layout/grid-initialize-span-one-items.html 34 35 * rendering/RenderGrid.cpp: 36 (WebCore::GridItemWithSpan::span): New helper method for ASSERTs. 37 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctions): 38 Exclude non spanning grid items from the calls to 39 resolveContentBasedTrackSizingFunctionsForItems(). 40 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems): 41 New method to resolve track sizes only using non-spanning grid 42 items. 43 (WebCore::RenderGrid::resolveContentBasedTrackSizingFunctionsForItems): 44 Ensure that it isn't called for non-spanning grid items. 45 * rendering/RenderGrid.h: 46 * rendering/style/GridTrackSize.h: 47 (WebCore::GridTrackSize::GridTrackSize): Cache return values. 48 (WebCore::GridTrackSize::setLength): Ditto. 49 (WebCore::GridTrackSize::setMinMax): Ditto. 50 (WebCore::GridTrackSize::cacheMinMaxTrackBreadthTypes): New method 51 that caches the return values for hasXXXTrackBreadth() methods. 52 (WebCore::GridTrackSize::hasMinOrMaxContentMinTrackBreadth): Use 53 the cached return value. 54 (WebCore::GridTrackSize::hasMaxContentMaxTrackBreadth): Ditto. 55 (WebCore::GridTrackSize::hasMinContentMaxTrackBreadth): Ditto. 56 (WebCore::GridTrackSize::hasMinOrMaxContentMaxTrackBreadth): Ditto. 57 (WebCore::GridTrackSize::hasMaxContentMinTrackBreadth): Ditto. 58 (WebCore::GridTrackSize::hasMinContentMinTrackBreadth): Ditto. 59 (WebCore::GridTrackSize::hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth): 60 Ditto. 61 (WebCore::GridTrackSize::hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth): 62 Ditto. 63 1 64 2015-02-16 Milan Crha <mcrha@redhat.com> 2 65 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r180050 r180142 585 585 RenderBox& gridItem() const { return m_gridItem; } 586 586 GridCoordinate coordinate() const { return m_coordinate; } 587 #if !ASSERT_DISABLED 588 size_t span() const { return m_span; } 589 #endif 587 590 588 591 bool operator<(const GridItemWithSpan other) const … … 620 623 for (auto trackIndex : sizingData.contentSizedTracksIndex) { 621 624 GridIterator iterator(m_grid, direction, trackIndex); 625 GridTrack& track = (direction == ForColumns) ? sizingData.columnTracks[trackIndex] : sizingData.rowTracks[trackIndex]; 622 626 623 627 while (RenderBox* gridItem = iterator.nextGridItem()) { 624 628 if (itemsSet.add(gridItem).isNewEntry) { 625 629 const GridCoordinate& coordinate = cachedGridCoordinate(*gridItem); 626 // We should not include items spanning more than one track that span tracks with flexible sizing functions. 627 if (integerSpanForDirection(coordinate, direction) == 1 || !spanningItemCrossesFlexibleSizedTracks(coordinate, direction)) 630 if (integerSpanForDirection(coordinate, direction) == 1) 631 resolveContentBasedTrackSizingFunctionsForNonSpanningItems(direction, coordinate, *gridItem, track, sizingData.columnTracks); 632 else if (!spanningItemCrossesFlexibleSizedTracks(coordinate, direction)) 628 633 sizingData.itemsSortedByIncreasingSpan.append(GridItemWithSpan(*gridItem, coordinate, direction)); 629 634 } … … 646 651 } 647 652 653 void RenderGrid::resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection direction, const GridCoordinate& coordinate, RenderBox& gridItem, GridTrack& track, Vector<GridTrack>& columnTracks) 654 { 655 const GridResolvedPosition trackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; 656 GridTrackSize trackSize = gridTrackSize(direction, trackPosition.toInt()); 657 658 if (trackSize.hasMinContentMinTrackBreadth()) 659 track.setBaseSize(std::max(track.baseSize(), minContentForChild(gridItem, direction, columnTracks))); 660 else if (trackSize.hasMaxContentMinTrackBreadth()) 661 track.setBaseSize(std::max(track.baseSize(), maxContentForChild(gridItem, direction, columnTracks))); 662 663 if (trackSize.hasMinContentMaxTrackBreadth()) 664 track.setGrowthLimit(std::max(track.growthLimit(), minContentForChild(gridItem, direction, columnTracks))); 665 else if (trackSize.hasMaxContentMaxTrackBreadth()) 666 track.setGrowthLimit(std::max(track.growthLimit(), maxContentForChild(gridItem, direction, columnTracks))); 667 } 668 648 669 void RenderGrid::resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection direction, GridSizingData& sizingData, GridItemWithSpan& gridItemWithSpan, FilterFunction filterFunction, SizingFunction sizingFunction, AccumulatorGetter trackGetter, AccumulatorGrowFunction trackGrowthFunction, FilterFunction growAboveMaxBreadthFilterFunction) 649 670 { 671 ASSERT(gridItemWithSpan.span() > 1); 650 672 const GridCoordinate& coordinate = gridItemWithSpan.coordinate(); 651 673 const GridResolvedPosition initialTrackPosition = (direction == ForColumns) ? coordinate.columns.resolvedInitialPosition : coordinate.rows.resolvedInitialPosition; -
trunk/Source/WebCore/rendering/RenderGrid.h
r180003 r180142 92 92 typedef void (GridTrack::* AccumulatorGrowFunction)(LayoutUnit); 93 93 typedef bool (GridTrackSize::* FilterFunction)() const; 94 void resolveContentBasedTrackSizingFunctionsForNonSpanningItems(GridTrackSizingDirection, const GridCoordinate&, RenderBox& gridItem, GridTrack&, Vector<GridTrack>& columnTracks); 94 95 void resolveContentBasedTrackSizingFunctionsForItems(GridTrackSizingDirection, GridSizingData&, GridItemWithSpan&, FilterFunction, SizingFunction, AccumulatorGetter, AccumulatorGrowFunction, FilterFunction growAboveMaxBreadthFilterFunction = nullptr); 95 96 void distributeSpaceToTracks(Vector<GridTrack*>&, Vector<unsigned>* growAboveMaxBreadthTrackIndexes, AccumulatorGetter, AccumulatorGrowFunction, GridSizingData&, LayoutUnit& availableLogicalSpace); -
trunk/Source/WebCore/rendering/style/GridTrackSize.h
r180140 r180142 52 52 , m_maxTrackBreadth(length) 53 53 { 54 cacheMinMaxTrackBreadthTypes(); 54 55 } 55 56 … … 59 60 , m_maxTrackBreadth(maxTrackBreadth) 60 61 { 62 cacheMinMaxTrackBreadthTypes(); 61 63 } 62 64 … … 98 100 } 99 101 100 bool hasMinOrMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && (minTrackBreadth().length().isMinContent() || minTrackBreadth().length().isMaxContent()); } 101 bool hasMaxContentMinTrackBreadth() const { return minTrackBreadth().isLength() && minTrackBreadth().length().isMaxContent(); } 102 bool hasMinOrMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && (maxTrackBreadth().length().isMinContent() || maxTrackBreadth().length().isMaxContent()); } 103 bool hasMaxContentMaxTrackBreadth() const { return maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent(); } 104 bool hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth() const { return minTrackBreadth().isLength() && minTrackBreadth().length().isMinContent() && hasMinOrMaxContentMaxTrackBreadth(); } 105 bool hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth() const { return hasMaxContentMinTrackBreadth() && hasMaxContentMaxTrackBreadth(); } 102 void cacheMinMaxTrackBreadthTypes() 103 { 104 m_minTrackBreadthIsMinContent = minTrackBreadth().isLength() && minTrackBreadth().length().isMinContent(); 105 m_minTrackBreadthIsMaxContent = minTrackBreadth().isLength() && minTrackBreadth().length().isMaxContent(); 106 m_maxTrackBreadthIsMaxContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMaxContent(); 107 m_maxTrackBreadthIsMinContent = maxTrackBreadth().isLength() && maxTrackBreadth().length().isMinContent(); 108 } 106 109 110 bool hasMinOrMaxContentMinTrackBreadth() const { return m_minTrackBreadthIsMaxContent || m_minTrackBreadthIsMinContent; } 111 bool hasMaxContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMaxContent; } 112 bool hasMinContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMinContent; } 113 bool hasMinOrMaxContentMaxTrackBreadth() const { return m_maxTrackBreadthIsMaxContent || m_maxTrackBreadthIsMinContent; } 114 bool hasMaxContentMinTrackBreadth() const { return m_minTrackBreadthIsMaxContent; } 115 bool hasMinContentMinTrackBreadth() const { return m_minTrackBreadthIsMinContent; } 116 bool hasMinContentMinTrackBreadthAndMinOrMaxContentMaxTrackBreadth() const { return m_minTrackBreadthIsMinContent && hasMinOrMaxContentMaxTrackBreadth(); } 117 bool hasMaxContentMinTrackBreadthAndMaxContentMaxTrackBreadth() const { return m_minTrackBreadthIsMaxContent && m_maxTrackBreadthIsMaxContent; } 107 118 108 119 private: … … 110 121 GridLength m_minTrackBreadth; 111 122 GridLength m_maxTrackBreadth; 123 bool m_minTrackBreadthIsMaxContent; 124 bool m_minTrackBreadthIsMinContent; 125 bool m_maxTrackBreadthIsMaxContent; 126 bool m_maxTrackBreadthIsMinContent; 112 127 }; 113 128
Note: See TracChangeset
for help on using the changeset viewer.