Changeset 209601 in webkit
- Timestamp:
- Dec 9, 2016 2:32:22 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r209599 r209601 1 2016-12-01 Sergio Villar Senin <svillar@igalia.com> 2 3 [css-grid] Pass Grid as argument to items' placement methods 4 https://bugs.webkit.org/show_bug.cgi?id=165250 5 6 Reviewed by Darin Adler. 7 8 In order to constify computeIntrinsicLogicalWidths() it is required to constify 9 placeItemsOnGrid() first, which is the base method of the grid items' positioning logic. The 10 first step is to constify all the methods invoked by the latter, which basically means to 11 pass the Grid as argument to all of them instead of directly using the m_grid attribute from 12 RenderGrid. As this is an intermediate step, a new const_cast<> was required in the 13 intrinsic size computation. However it will be promptly removed after the const-ification of 14 placeItemsOnGrid(). 15 16 After this, only the methods used by the track sizing algorithm will directly access 17 m_grid. All those would get a reference to the Grid via GridSizingData, but that's a matter 18 of a follow up patch. 19 20 Apart from that, m_gridIsDirty was removed because it was always too confusing. It was 21 replaced by Grid's m_needsItemsPlacement which is much more concise. The clearGrid() call 22 was indeed only forcing a new placement of the grid items. 23 24 No new tests as this is a refactoring. 25 26 * rendering/RenderGrid.cpp: 27 (WebCore::RenderGrid::Grid::setNeedsItemsPlacement): New method to flag the Grid whenever 28 grid items' placement algorithm needs to be run. 29 (WebCore::RenderGrid::canPerformSimplifiedLayout): 30 (WebCore::RenderGrid::layoutBlock): 31 (WebCore::RenderGrid::computeIntrinsicLogicalWidths): 32 (WebCore::RenderGrid::computeEmptyTracksForAutoRepeat): 33 (WebCore::RenderGrid::placeItemsOnGrid): 34 (WebCore::RenderGrid::populateExplicitGridAndOrderIterator): Constified. Got Grid as 35 argument. 36 (WebCore::RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid): Ditto. 37 (WebCore::RenderGrid::placeSpecifiedMajorAxisItemsOnGrid): Ditto. 38 (WebCore::RenderGrid::placeAutoMajorAxisItemsOnGrid): Ditto. 39 (WebCore::RenderGrid::placeAutoMajorAxisItemOnGrid): Ditto. 40 (WebCore::RenderGrid::clearGrid): 41 (WebCore::RenderGrid::offsetAndBreadthForPositionedChild): 42 (WebCore::RenderGrid::numTracks): 43 * rendering/RenderGrid.h: 44 1 45 2016-12-09 Gavin Barraclough <barraclough@apple.com> 2 46 -
trunk/Source/WebCore/rendering/RenderGrid.cpp
r209180 r209601 149 149 } 150 150 151 void RenderGrid::Grid::setNeedsItemsPlacement(bool needsItemsPlacement) 152 { 153 m_needsItemsPlacement = needsItemsPlacement; 154 155 if (needsItemsPlacement) 156 clear(); 157 } 158 151 159 void RenderGrid::Grid::clear() 152 160 { … … 530 538 void RenderGrid::repeatTracksSizingIfNeeded(GridSizingData& sizingData, LayoutUnit availableSpaceForColumns, LayoutUnit availableSpaceForRows) 531 539 { 532 ASSERT(!m_grid IsDirty);540 ASSERT(!m_grid.needsItemsPlacement()); 533 541 ASSERT(sizingData.sizingState > GridSizingData::RowSizingFirstIteration); 534 542 … … 549 557 bool RenderGrid::canPerformSimplifiedLayout() const 550 558 { 551 // We cannot perform a simplified layout if the grid is dirty and we have552 // somepositioned items to be laid out.553 if (m_grid IsDirty&& posChildNeedsLayout())559 // We cannot perform a simplified layout if we need to position the items and we have some 560 // positioned items to be laid out. 561 if (m_grid.needsItemsPlacement() && posChildNeedsLayout()) 554 562 return false; 555 563 … … 587 595 updateLogicalWidth(); 588 596 589 placeItemsOnGrid( TrackSizing);590 591 GridSizingData sizingData(numTracks(ForColumns ), numTracks(ForRows));597 placeItemsOnGrid(m_grid, TrackSizing); 598 599 GridSizingData sizingData(numTracks(ForColumns, m_grid), numTracks(ForRows, m_grid)); 592 600 593 601 // At this point the logical width is always definite as the above call to updateLogicalWidth() … … 723 731 void RenderGrid::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const 724 732 { 725 bool wasPopulated = !m_grid IsDirty;733 bool wasPopulated = !m_grid.needsItemsPlacement(); 726 734 if (!wasPopulated) 727 const_cast<RenderGrid*>(this)->placeItemsOnGrid( IntrinsicSizeComputation);728 729 GridSizingData sizingData(numTracks(ForColumns ), numTracks(ForRows));735 const_cast<RenderGrid*>(this)->placeItemsOnGrid(const_cast<Grid&>(m_grid), IntrinsicSizeComputation); 736 737 GridSizingData sizingData(numTracks(ForColumns, m_grid), numTracks(ForRows, m_grid)); 730 738 sizingData.setAvailableSpace(std::nullopt); 731 739 sizingData.setFreeSpace(ForColumns, std::nullopt); … … 1682 1690 1683 1691 1684 std::unique_ptr<RenderGrid::OrderedTrackIndexSet> RenderGrid::computeEmptyTracksForAutoRepeat(Grid TrackSizingDirection direction) const1692 std::unique_ptr<RenderGrid::OrderedTrackIndexSet> RenderGrid::computeEmptyTracksForAutoRepeat(Grid& grid, GridTrackSizingDirection direction) const 1685 1693 { 1686 1694 bool isRowAxis = direction == ForColumns; … … 1691 1699 std::unique_ptr<OrderedTrackIndexSet> emptyTrackIndexes; 1692 1700 unsigned insertionPoint = isRowAxis ? style().gridAutoRepeatColumnsInsertionPoint() : style().gridAutoRepeatRowsInsertionPoint(); 1693 unsigned firstAutoRepeatTrack = insertionPoint + std::abs( m_grid.smallestTrackStart(direction));1694 unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + m_grid.autoRepeatTracks(direction);1701 unsigned firstAutoRepeatTrack = insertionPoint + std::abs(grid.smallestTrackStart(direction)); 1702 unsigned lastAutoRepeatTrack = firstAutoRepeatTrack + grid.autoRepeatTracks(direction); 1695 1703 1696 1704 if (!m_grid.hasGridItems()) { … … 1700 1708 } else { 1701 1709 for (unsigned trackIndex = firstAutoRepeatTrack; trackIndex < lastAutoRepeatTrack; ++trackIndex) { 1702 GridIterator iterator( m_grid, direction, trackIndex);1710 GridIterator iterator(grid, direction, trackIndex); 1703 1711 if (!iterator.nextGridItem()) { 1704 1712 if (!emptyTrackIndexes) … … 1711 1719 } 1712 1720 1713 void RenderGrid::placeItemsOnGrid( SizingOperation sizingOperation)1714 { 1715 ASSERT( m_gridIsDirty);1716 ASSERT(! m_grid.hasGridItems());1721 void RenderGrid::placeItemsOnGrid(Grid& grid, SizingOperation sizingOperation) 1722 { 1723 ASSERT(grid.needsItemsPlacement()); 1724 ASSERT(!grid.hasGridItems()); 1717 1725 1718 1726 unsigned autoRepeatColumns = computeAutoRepeatTracksCount(ForColumns, sizingOperation); 1719 1727 unsigned autoRepeatRows = computeAutoRepeatTracksCount(ForRows, sizingOperation); 1720 m_grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns); 1721 1722 populateExplicitGridAndOrderIterator(); 1723 m_gridIsDirty = false; 1724 bool hasAnyOrthogonalGridItem = false; 1728 grid.setAutoRepeatTracks(autoRepeatRows, autoRepeatColumns); 1729 1730 populateExplicitGridAndOrderIterator(grid); 1725 1731 1726 1732 Vector<RenderBox*> autoMajorAxisAutoGridItems; 1727 1733 Vector<RenderBox*> specifiedMajorAxisAutoGridItems; 1728 for (RenderBox* child = m_grid.orderIterator().first(); child; child = m_grid.orderIterator().next()) { 1734 bool hasAnyOrthogonalGridItem = false; 1735 for (auto* child = grid.orderIterator().first(); child; child = grid.orderIterator().next()) { 1729 1736 if (child->isOutOfFlowPositioned()) 1730 1737 continue; … … 1732 1739 hasAnyOrthogonalGridItem = hasAnyOrthogonalGridItem || isOrthogonalChild(*child); 1733 1740 1734 GridArea area = m_grid.gridItemArea(*child);1741 GridArea area = grid.gridItemArea(*child); 1735 1742 if (!area.rows.isIndefinite()) 1736 area.rows.translate(std::abs( m_grid.smallestTrackStart(ForRows)));1743 area.rows.translate(std::abs(grid.smallestTrackStart(ForRows))); 1737 1744 if (!area.columns.isIndefinite()) 1738 area.columns.translate(std::abs( m_grid.smallestTrackStart(ForColumns)));1745 area.columns.translate(std::abs(grid.smallestTrackStart(ForColumns))); 1739 1746 1740 1747 if (area.rows.isIndefinite() || area.columns.isIndefinite()) { 1741 m_grid.setGridItemArea(*child, area);1748 grid.setGridItemArea(*child, area); 1742 1749 bool majorAxisDirectionIsForColumns = autoPlacementMajorAxisDirection() == ForColumns; 1743 1750 if ((majorAxisDirectionIsForColumns && area.columns.isIndefinite()) … … 1748 1755 continue; 1749 1756 } 1750 m_grid.insert(*child, { area.rows, area.columns });1751 } 1752 m_grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem);1757 grid.insert(*child, { area.rows, area.columns }); 1758 } 1759 grid.setHasAnyOrthogonalGridItem(hasAnyOrthogonalGridItem); 1753 1760 1754 1761 #if ENABLE(ASSERT) 1755 if ( m_grid.hasGridItems()) {1756 ASSERT( m_grid.numTracks(ForRows) >= GridPositionsResolver::explicitGridRowCount(style(), m_grid.autoRepeatTracks(ForRows)));1757 ASSERT( m_grid.numTracks(ForColumns) >= GridPositionsResolver::explicitGridColumnCount(style(), m_grid.autoRepeatTracks(ForColumns)));1762 if (grid.hasGridItems()) { 1763 ASSERT(grid.numTracks(ForRows) >= GridPositionsResolver::explicitGridRowCount(style(), grid.autoRepeatTracks(ForRows))); 1764 ASSERT(grid.numTracks(ForColumns) >= GridPositionsResolver::explicitGridColumnCount(style(), grid.autoRepeatTracks(ForColumns))); 1758 1765 } 1759 1766 #endif 1760 1767 1761 placeSpecifiedMajorAxisItemsOnGrid( specifiedMajorAxisAutoGridItems);1762 placeAutoMajorAxisItemsOnGrid( autoMajorAxisAutoGridItems);1768 placeSpecifiedMajorAxisItemsOnGrid(grid, specifiedMajorAxisAutoGridItems); 1769 placeAutoMajorAxisItemsOnGrid(grid, autoMajorAxisAutoGridItems); 1763 1770 1764 1771 // Compute collapsible tracks for auto-fit. 1765 m_grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(ForColumns)); 1766 m_grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(ForRows)); 1772 grid.setAutoRepeatEmptyColumns(computeEmptyTracksForAutoRepeat(grid, ForColumns)); 1773 grid.setAutoRepeatEmptyRows(computeEmptyTracksForAutoRepeat(grid, ForRows)); 1774 1775 grid.setNeedsItemsPlacement(false); 1767 1776 1768 1777 #if ENABLE(ASSERT) 1769 for ( RenderBox* child = m_grid.orderIterator().first(); child; child = m_grid.orderIterator().next()) {1778 for (auto* child = grid.orderIterator().first(); child; child = grid.orderIterator().next()) { 1770 1779 if (child->isOutOfFlowPositioned()) 1771 1780 continue; 1772 1781 1773 GridArea area = m_grid.gridItemArea(*child);1782 GridArea area = grid.gridItemArea(*child); 1774 1783 ASSERT(area.rows.isTranslatedDefinite() && area.columns.isTranslatedDefinite()); 1775 1784 } … … 1777 1786 } 1778 1787 1779 void RenderGrid::populateExplicitGridAndOrderIterator( )1780 { 1781 OrderIteratorPopulator populator( m_grid.orderIterator());1788 void RenderGrid::populateExplicitGridAndOrderIterator(Grid& grid) const 1789 { 1790 OrderIteratorPopulator populator(grid.orderIterator()); 1782 1791 int smallestRowStart = 0; 1783 1792 int smallestColumnStart = 0; 1784 unsigned autoRepeatRows = m_grid.autoRepeatTracks(ForRows);1785 unsigned autoRepeatColumns = m_grid.autoRepeatTracks(ForColumns);1793 unsigned autoRepeatRows = grid.autoRepeatTracks(ForRows); 1794 unsigned autoRepeatColumns = grid.autoRepeatTracks(ForColumns); 1786 1795 unsigned maximumRowIndex = GridPositionsResolver::explicitGridRowCount(style(), autoRepeatRows); 1787 1796 unsigned maximumColumnIndex = GridPositionsResolver::explicitGridColumnCount(style(), autoRepeatColumns); … … 1813 1822 } 1814 1823 1815 m_grid.setGridItemArea(*child, { rowPositions, columnPositions });1816 } 1817 1818 m_grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart);1819 m_grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart));1820 } 1821 1822 std::unique_ptr<GridArea> RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( const RenderBox& gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan& specifiedPositions) const1824 grid.setGridItemArea(*child, { rowPositions, columnPositions }); 1825 } 1826 1827 grid.setSmallestTracksStart(smallestRowStart, smallestColumnStart); 1828 grid.ensureGridSize(maximumRowIndex + std::abs(smallestRowStart), maximumColumnIndex + std::abs(smallestColumnStart)); 1829 } 1830 1831 std::unique_ptr<GridArea> RenderGrid::createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(Grid& grid, const RenderBox& gridItem, GridTrackSizingDirection specifiedDirection, const GridSpan& specifiedPositions) const 1823 1832 { 1824 1833 GridTrackSizingDirection crossDirection = specifiedDirection == ForColumns ? ForRows : ForColumns; 1825 const unsigned endOfCrossDirection = m_grid.numTracks(crossDirection);1834 const unsigned endOfCrossDirection = grid.numTracks(crossDirection); 1826 1835 unsigned crossDirectionSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, crossDirection); 1827 1836 GridSpan crossDirectionPositions = GridSpan::translatedDefiniteGridSpan(endOfCrossDirection, endOfCrossDirection + crossDirectionSpanSize); … … 1829 1838 } 1830 1839 1831 void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid( const Vector<RenderBox*>& autoGridItems)1840 void RenderGrid::placeSpecifiedMajorAxisItemsOnGrid(Grid& grid, const Vector<RenderBox*>& autoGridItems) const 1832 1841 { 1833 1842 bool isForColumns = autoPlacementMajorAxisDirection() == ForColumns; … … 1840 1849 1841 1850 for (auto& autoGridItem : autoGridItems) { 1842 GridSpan majorAxisPositions = m_grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection());1851 GridSpan majorAxisPositions = grid.gridItemSpan(*autoGridItem, autoPlacementMajorAxisDirection()); 1843 1852 ASSERT(majorAxisPositions.isTranslatedDefinite()); 1844 ASSERT( m_grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isIndefinite());1853 ASSERT(grid.gridItemSpan(*autoGridItem, autoPlacementMinorAxisDirection()).isIndefinite()); 1845 1854 unsigned minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), *autoGridItem, autoPlacementMinorAxisDirection()); 1846 1855 unsigned majorAxisInitialPosition = majorAxisPositions.startLine(); 1847 1856 1848 GridIterator iterator( m_grid, autoPlacementMajorAxisDirection(), majorAxisPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition));1857 GridIterator iterator(grid, autoPlacementMajorAxisDirection(), majorAxisPositions.startLine(), isGridAutoFlowDense ? 0 : minorAxisCursors.get(majorAxisInitialPosition)); 1849 1858 std::unique_ptr<GridArea> emptyGridArea = iterator.nextEmptyGridArea(majorAxisPositions.integerSpan(), minorAxisSpanSize); 1850 1859 if (!emptyGridArea) 1851 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions);1852 1853 m_grid.insert(*autoGridItem, *emptyGridArea);1860 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, *autoGridItem, autoPlacementMajorAxisDirection(), majorAxisPositions); 1861 1862 grid.insert(*autoGridItem, *emptyGridArea); 1854 1863 1855 1864 if (!isGridAutoFlowDense) … … 1858 1867 } 1859 1868 1860 void RenderGrid::placeAutoMajorAxisItemsOnGrid( const Vector<RenderBox*>& autoGridItems)1869 void RenderGrid::placeAutoMajorAxisItemsOnGrid(Grid& grid, const Vector<RenderBox*>& autoGridItems) const 1861 1870 { 1862 1871 AutoPlacementCursor autoPlacementCursor = {0, 0}; … … 1864 1873 1865 1874 for (auto& autoGridItem : autoGridItems) { 1866 placeAutoMajorAxisItemOnGrid( *autoGridItem, autoPlacementCursor);1875 placeAutoMajorAxisItemOnGrid(grid, *autoGridItem, autoPlacementCursor); 1867 1876 1868 1877 if (isGridAutoFlowDense) { … … 1873 1882 } 1874 1883 1875 void RenderGrid::placeAutoMajorAxisItemOnGrid( RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor)1876 { 1877 ASSERT( m_grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection()).isIndefinite());1884 void RenderGrid::placeAutoMajorAxisItemOnGrid(Grid& grid, RenderBox& gridItem, AutoPlacementCursor& autoPlacementCursor) const 1885 { 1886 ASSERT(grid.gridItemSpan(gridItem, autoPlacementMajorAxisDirection()).isIndefinite()); 1878 1887 unsigned majorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, autoPlacementMajorAxisDirection()); 1879 1888 1880 const unsigned endOfMajorAxis = m_grid.numTracks(autoPlacementMajorAxisDirection());1889 const unsigned endOfMajorAxis = grid.numTracks(autoPlacementMajorAxisDirection()); 1881 1890 unsigned majorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.second : autoPlacementCursor.first; 1882 1891 unsigned minorAxisAutoPlacementCursor = autoPlacementMajorAxisDirection() == ForColumns ? autoPlacementCursor.first : autoPlacementCursor.second; 1883 1892 1884 1893 std::unique_ptr<GridArea> emptyGridArea; 1885 GridSpan minorAxisPositions = m_grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection());1894 GridSpan minorAxisPositions = grid.gridItemSpan(gridItem, autoPlacementMinorAxisDirection()); 1886 1895 if (minorAxisPositions.isTranslatedDefinite()) { 1887 1896 // Move to the next track in major axis if initial position in minor axis is before auto-placement cursor. … … 1890 1899 1891 1900 if (majorAxisAutoPlacementCursor < endOfMajorAxis) { 1892 GridIterator iterator( m_grid, autoPlacementMinorAxisDirection(), minorAxisPositions.startLine(), majorAxisAutoPlacementCursor);1901 GridIterator iterator(grid, autoPlacementMinorAxisDirection(), minorAxisPositions.startLine(), majorAxisAutoPlacementCursor); 1893 1902 emptyGridArea = iterator.nextEmptyGridArea(minorAxisPositions.integerSpan(), majorAxisSpanSize); 1894 1903 } 1895 1904 1896 1905 if (!emptyGridArea) 1897 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid Item, autoPlacementMinorAxisDirection(), minorAxisPositions);1906 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, gridItem, autoPlacementMinorAxisDirection(), minorAxisPositions); 1898 1907 } else { 1899 1908 unsigned minorAxisSpanSize = GridPositionsResolver::spanSizeForAutoPlacedItem(style(), gridItem, autoPlacementMinorAxisDirection()); 1900 1909 1901 1910 for (unsigned majorAxisIndex = majorAxisAutoPlacementCursor; majorAxisIndex < endOfMajorAxis; ++majorAxisIndex) { 1902 GridIterator iterator( m_grid, autoPlacementMajorAxisDirection(), majorAxisIndex, minorAxisAutoPlacementCursor);1911 GridIterator iterator(grid, autoPlacementMajorAxisDirection(), majorAxisIndex, minorAxisAutoPlacementCursor); 1903 1912 emptyGridArea = iterator.nextEmptyGridArea(majorAxisSpanSize, minorAxisSpanSize); 1904 1913 … … 1906 1915 // Check that it fits in the minor axis direction, as we shouldn't grow in that direction here (it was already managed in populateExplicitGridAndOrderIterator()). 1907 1916 unsigned minorAxisFinalPositionIndex = autoPlacementMinorAxisDirection() == ForColumns ? emptyGridArea->columns.endLine() : emptyGridArea->rows.endLine(); 1908 const unsigned endOfMinorAxis = m_grid.numTracks(autoPlacementMinorAxisDirection());1917 const unsigned endOfMinorAxis = grid.numTracks(autoPlacementMinorAxisDirection()); 1909 1918 if (minorAxisFinalPositionIndex <= endOfMinorAxis) 1910 1919 break; … … 1920 1929 1921 1930 if (!emptyGridArea) 1922 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid Item, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize));1923 } 1924 1925 m_grid.insert(gridItem, *emptyGridArea);1931 emptyGridArea = createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(grid, gridItem, autoPlacementMinorAxisDirection(), GridSpan::translatedDefiniteGridSpan(0, minorAxisSpanSize)); 1932 } 1933 1934 grid.insert(gridItem, *emptyGridArea); 1926 1935 autoPlacementCursor.first = emptyGridArea->rows.startLine(); 1927 1936 autoPlacementCursor.second = emptyGridArea->columns.startLine(); … … 1940 1949 void RenderGrid::clearGrid() 1941 1950 { 1942 m_grid.clear(); 1943 m_gridIsDirty = true; 1951 m_grid.setNeedsItemsPlacement(true); 1944 1952 } 1945 1953 … … 2125 2133 GridPosition startPosition = isRowAxis ? child.style().gridItemColumnStart() : child.style().gridItemRowStart(); 2126 2134 GridPosition endPosition = isRowAxis ? child.style().gridItemColumnEnd() : child.style().gridItemRowEnd(); 2127 int lastLine = numTracks(direction );2135 int lastLine = numTracks(direction, m_grid); 2128 2136 2129 2137 bool startIsAuto = startPosition.isAuto() … … 2767 2775 } 2768 2776 2769 unsigned RenderGrid::numTracks(GridTrackSizingDirection direction ) const2777 unsigned RenderGrid::numTracks(GridTrackSizingDirection direction, const Grid& grid) const 2770 2778 { 2771 2779 // Due to limitations in our internal representation, we cannot know the number of columns from … … 2775 2783 // not stored in m_grid). 2776 2784 if (direction == ForRows) 2777 return m_grid.numTracks(ForRows);2785 return grid.numTracks(ForRows); 2778 2786 2779 2787 // FIXME: This still requires knowledge about m_grid internals. 2780 return m_grid.numTracks(ForRows) ? m_grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount(style(), m_grid.autoRepeatTracks(ForColumns));2788 return grid.numTracks(ForRows) ? grid.numTracks(ForColumns) : GridPositionsResolver::explicitGridColumnCount(style(), grid.autoRepeatTracks(ForColumns)); 2781 2789 } 2782 2790 -
trunk/Source/WebCore/rendering/RenderGrid.h
r209180 r209601 80 80 std::optional<LayoutUnit> computeIntrinsicLogicalContentHeightUsing(Length logicalHeightLength, std::optional<LayoutUnit> intrinsicContentHeight, LayoutUnit borderAndPadding) const override; 81 81 82 class Grid; 82 83 class GridIterator; 83 84 class GridSizingData; … … 92 93 93 94 typedef ListHashSet<size_t> OrderedTrackIndexSet; 94 std::unique_ptr<OrderedTrackIndexSet> computeEmptyTracksForAutoRepeat(Grid TrackSizingDirection) const;95 96 void placeItemsOnGrid( SizingOperation);97 void populateExplicitGridAndOrderIterator( );98 std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid( const RenderBox&, GridTrackSizingDirection, const GridSpan&) const;99 void placeSpecifiedMajorAxisItemsOnGrid( const Vector<RenderBox*>&);100 void placeAutoMajorAxisItemsOnGrid( const Vector<RenderBox*>&);95 std::unique_ptr<OrderedTrackIndexSet> computeEmptyTracksForAutoRepeat(Grid&, GridTrackSizingDirection) const; 96 97 void placeItemsOnGrid(Grid&, SizingOperation); 98 void populateExplicitGridAndOrderIterator(Grid&) const; 99 std::unique_ptr<GridArea> createEmptyGridAreaAtSpecifiedPositionsOutsideGrid(Grid&, const RenderBox&, GridTrackSizingDirection, const GridSpan&) const; 100 void placeSpecifiedMajorAxisItemsOnGrid(Grid&, const Vector<RenderBox*>&) const; 101 void placeAutoMajorAxisItemsOnGrid(Grid&, const Vector<RenderBox*>&) const; 101 102 typedef std::pair<unsigned, unsigned> AutoPlacementCursor; 102 void placeAutoMajorAxisItemOnGrid( RenderBox&, AutoPlacementCursor&);103 void placeAutoMajorAxisItemOnGrid(Grid&, RenderBox&, AutoPlacementCursor&) const; 103 104 GridTrackSizingDirection autoPlacementMajorAxisDirection() const; 104 105 GridTrackSizingDirection autoPlacementMinorAxisDirection() const; … … 185 186 bool spanningItemCrossesFlexibleSizedTracks(const GridSpan&, GridTrackSizingDirection, SizingOperation) const; 186 187 187 unsigned numTracks(GridTrackSizingDirection ) const;188 unsigned numTracks(GridTrackSizingDirection, const Grid&) const; 188 189 189 190 LayoutUnit translateRTLCoordinate(LayoutUnit) const; … … 235 236 OrderIterator& orderIterator() { return m_orderIterator; } 236 237 237 void shrinkToFit() { m_grid.shrinkToFit(); } 238 239 void clear(); 238 void setNeedsItemsPlacement(bool); 239 bool needsItemsPlacement() const { return m_needsItemsPlacement; }; 240 240 241 241 private: 242 242 friend class GridIterator; 243 243 244 void clear(); 245 244 246 OrderIterator m_orderIterator; 245 247 … … 251 253 252 254 bool m_hasAnyOrthogonalGridItem { false }; 255 bool m_needsItemsPlacement { true }; 253 256 254 257 GridAsMatrix m_grid; … … 269 272 std::optional<LayoutUnit> m_minContentHeight; 270 273 std::optional<LayoutUnit> m_maxContentHeight; 271 272 bool m_gridIsDirty { true };273 274 }; 274 275
Note: See TracChangeset
for help on using the changeset viewer.