OLD | NEW |
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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 // layout of the grid, for that reason we don't need to mark the grid as dirty | 90 // layout of the grid, for that reason we don't need to mark the grid as dirty |
91 // when they are removed. | 91 // when they are removed. |
92 if (child->IsOutOfFlowPositioned()) | 92 if (child->IsOutOfFlowPositioned()) |
93 return; | 93 return; |
94 | 94 |
95 // The grid needs to be recomputed as it might contain auto-placed items that | 95 // The grid needs to be recomputed as it might contain auto-placed items that |
96 // will change their position. | 96 // will change their position. |
97 DirtyGrid(); | 97 DirtyGrid(); |
98 } | 98 } |
99 | 99 |
100 StyleSelfAlignmentData LayoutGrid::SelfAlignmentForChild( | |
101 GridAxis axis, | |
102 const LayoutBox& child, | |
103 const ComputedStyle* style) const { | |
104 return axis == kGridRowAxis ? JustifySelfForChild(child, style) | |
105 : AlignSelfForChild(child, style); | |
106 } | |
107 | |
108 bool LayoutGrid::SelfAlignmentChangedToStretch(GridAxis axis, | |
109 const ComputedStyle& old_style, | |
110 const ComputedStyle& new_style, | |
111 const LayoutBox& child) const { | |
112 return SelfAlignmentForChild(axis, child, &old_style).GetPosition() != | |
113 kItemPositionStretch && | |
114 SelfAlignmentForChild(axis, child, &new_style).GetPosition() == | |
115 kItemPositionStretch; | |
116 } | |
117 | |
118 bool LayoutGrid::SelfAlignmentChangedFromStretch(GridAxis axis, | |
119 const ComputedStyle& old_style, | |
120 const ComputedStyle& new_style, | |
121 const LayoutBox& child) const { | |
122 return SelfAlignmentForChild(axis, child, &old_style).GetPosition() == | |
123 kItemPositionStretch && | |
124 SelfAlignmentForChild(axis, child, &new_style).GetPosition() != | |
125 kItemPositionStretch; | |
126 } | |
127 | |
128 void LayoutGrid::StyleDidChange(StyleDifference diff, | 100 void LayoutGrid::StyleDidChange(StyleDifference diff, |
129 const ComputedStyle* old_style) { | 101 const ComputedStyle* old_style) { |
130 LayoutBlock::StyleDidChange(diff, old_style); | 102 LayoutBlock::StyleDidChange(diff, old_style); |
131 if (!old_style) | 103 if (!old_style) |
132 return; | 104 return; |
133 | 105 |
134 const ComputedStyle& new_style = StyleRef(); | |
135 if (old_style && | |
136 old_style->ResolvedAlignItems(SelfAlignmentNormalBehavior(this)) | |
137 .GetPosition() == kItemPositionStretch && | |
138 diff.NeedsFullLayout()) { | |
139 // Style changes on the grid container implying stretching (to-stretch) or | |
140 // shrinking (from-stretch) require the affected items to be laid out again. | |
141 // These logic only applies to 'stretch' since the rest of the alignment | |
142 // values don't change the size of the box. | |
143 // In any case, the items' overrideSize will be cleared and recomputed (if | |
144 // necessary) as part of the Grid layout logic, triggered by this style | |
145 // change. | |
146 for (LayoutBox* child = FirstInFlowChildBox(); child; | |
147 child = child->NextInFlowSiblingBox()) { | |
148 if (SelfAlignmentChangedToStretch(kGridRowAxis, *old_style, new_style, | |
149 *child) || | |
150 SelfAlignmentChangedFromStretch(kGridRowAxis, *old_style, new_style, | |
151 *child) || | |
152 SelfAlignmentChangedToStretch(kGridColumnAxis, *old_style, new_style, | |
153 *child) || | |
154 SelfAlignmentChangedFromStretch(kGridColumnAxis, *old_style, | |
155 new_style, *child)) { | |
156 child->SetNeedsLayout(LayoutInvalidationReason::kGridChanged); | |
157 } | |
158 } | |
159 } | |
160 | |
161 // FIXME: The following checks could be narrowed down if we kept track of | 106 // FIXME: The following checks could be narrowed down if we kept track of |
162 // which type of grid items we have: | 107 // which type of grid items we have: |
163 // - explicit grid size changes impact negative explicitely positioned and | 108 // - explicit grid size changes impact negative explicitely positioned and |
164 // auto-placed grid items. | 109 // auto-placed grid items. |
165 // - named grid lines only impact grid items with named grid lines. | 110 // - named grid lines only impact grid items with named grid lines. |
166 // - auto-flow changes only impacts auto-placed children. | 111 // - auto-flow changes only impacts auto-placed children. |
167 | 112 |
168 if (ExplicitGridDidResize(*old_style) || | 113 if (ExplicitGridDidResize(*old_style) || |
169 NamedGridLinesDefinitionDidChange(*old_style) || | 114 NamedGridLinesDefinitionDidChange(*old_style) || |
170 old_style->GetGridAutoFlow() != StyleRef().GetGridAutoFlow() || | 115 old_style->GetGridAutoFlow() != StyleRef().GetGridAutoFlow() || |
(...skipping 1404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1575 // performed before children are laid out, so we can't use the child cached | 1520 // performed before children are laid out, so we can't use the child cached |
1576 // values. Hence, we need to compute margins in order to determine the | 1521 // values. Hence, we need to compute margins in order to determine the |
1577 // available height before stretching. | 1522 // available height before stretching. |
1578 return grid_area_breadth_for_child - | 1523 return grid_area_breadth_for_child - |
1579 (child.NeedsLayout() | 1524 (child.NeedsLayout() |
1580 ? ComputeMarginLogicalSizeForChild(kBlockDirection, child) | 1525 ? ComputeMarginLogicalSizeForChild(kBlockDirection, child) |
1581 : MarginLogicalHeightForChild(child)); | 1526 : MarginLogicalHeightForChild(child)); |
1582 } | 1527 } |
1583 | 1528 |
1584 StyleSelfAlignmentData LayoutGrid::AlignSelfForChild( | 1529 StyleSelfAlignmentData LayoutGrid::AlignSelfForChild( |
1585 const LayoutBox& child, | 1530 const LayoutBox& child) const { |
1586 const ComputedStyle* style) const { | 1531 if (!child.IsAnonymous()) { |
1587 if (!style) | 1532 return child.StyleRef().ResolvedAlignSelf( |
1588 style = Style(); | 1533 SelfAlignmentNormalBehavior(&child)); |
| 1534 } |
| 1535 // All the 'auto' values has been solved by the StyleAdjuster, but it's |
| 1536 // possible that some grid items generate Anonymous boxes, which need to be |
| 1537 // solved during layout. |
1589 return child.StyleRef().ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child), | 1538 return child.StyleRef().ResolvedAlignSelf(SelfAlignmentNormalBehavior(&child), |
1590 style); | 1539 Style()); |
1591 } | 1540 } |
1592 | 1541 |
1593 StyleSelfAlignmentData LayoutGrid::JustifySelfForChild( | 1542 StyleSelfAlignmentData LayoutGrid::JustifySelfForChild( |
1594 const LayoutBox& child, | 1543 const LayoutBox& child) const { |
1595 const ComputedStyle* style) const { | 1544 if (!child.IsAnonymous()) { |
1596 if (!style) | 1545 return child.StyleRef().ResolvedJustifySelf( |
1597 style = Style(); | 1546 SelfAlignmentNormalBehavior(&child)); |
| 1547 } |
| 1548 // All the 'auto' values has been solved by the StyleAdjuster, but it's |
| 1549 // possible that some grid items generate Anonymous boxes, which need to be |
| 1550 // solved during layout. |
1598 return child.StyleRef().ResolvedJustifySelf( | 1551 return child.StyleRef().ResolvedJustifySelf( |
1599 SelfAlignmentNormalBehavior(&child), style); | 1552 SelfAlignmentNormalBehavior(&child), Style()); |
1600 } | 1553 } |
1601 | 1554 |
1602 GridTrackSizingDirection LayoutGrid::FlowAwareDirectionForChild( | 1555 GridTrackSizingDirection LayoutGrid::FlowAwareDirectionForChild( |
1603 const LayoutBox& child, | 1556 const LayoutBox& child, |
1604 GridTrackSizingDirection direction) const { | 1557 GridTrackSizingDirection direction) const { |
1605 return !IsOrthogonalChild(child) | 1558 return !IsOrthogonalChild(child) |
1606 ? direction | 1559 ? direction |
1607 : (direction == kForColumns ? kForRows : kForColumns); | 1560 : (direction == kForColumns ? kForRows : kForColumns); |
1608 } | 1561 } |
1609 | 1562 |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1817 GridAxis baseline_axis) const { | 1770 GridAxis baseline_axis) const { |
1818 return IsHorizontalGridAxis(baseline_axis) && | 1771 return IsHorizontalGridAxis(baseline_axis) && |
1819 ((child.StyleRef().IsFlippedBlocksWritingMode() && | 1772 ((child.StyleRef().IsFlippedBlocksWritingMode() && |
1820 !StyleRef().IsFlippedBlocksWritingMode()) || | 1773 !StyleRef().IsFlippedBlocksWritingMode()) || |
1821 (child.StyleRef().IsFlippedLinesWritingMode() && | 1774 (child.StyleRef().IsFlippedLinesWritingMode() && |
1822 StyleRef().IsFlippedBlocksWritingMode())); | 1775 StyleRef().IsFlippedBlocksWritingMode())); |
1823 } | 1776 } |
1824 | 1777 |
1825 bool LayoutGrid::IsBaselineAlignmentForChild(const LayoutBox& child, | 1778 bool LayoutGrid::IsBaselineAlignmentForChild(const LayoutBox& child, |
1826 GridAxis baseline_axis) const { | 1779 GridAxis baseline_axis) const { |
1827 ItemPosition align = | 1780 bool is_column_axis_baseline = baseline_axis == kGridColumnAxis; |
1828 SelfAlignmentForChild(baseline_axis, child).GetPosition(); | 1781 ItemPosition align = is_column_axis_baseline |
1829 bool has_auto_margins = baseline_axis == kGridColumnAxis | 1782 ? AlignSelfForChild(child).GetPosition() |
| 1783 : JustifySelfForChild(child).GetPosition(); |
| 1784 bool has_auto_margins = is_column_axis_baseline |
1830 ? HasAutoMarginsInColumnAxis(child) | 1785 ? HasAutoMarginsInColumnAxis(child) |
1831 : HasAutoMarginsInRowAxis(child); | 1786 : HasAutoMarginsInRowAxis(child); |
1832 return IsBaselinePosition(align) && !has_auto_margins; | 1787 return IsBaselinePosition(align) && !has_auto_margins; |
1833 } | 1788 } |
1834 | 1789 |
1835 const BaselineGroup& LayoutGrid::GetBaselineGroupForChild( | 1790 const BaselineGroup& LayoutGrid::GetBaselineGroupForChild( |
1836 const LayoutBox& child, | 1791 const LayoutBox& child, |
1837 GridAxis baseline_axis) const { | 1792 GridAxis baseline_axis) const { |
1838 DCHECK(IsBaselineAlignmentForChild(child, baseline_axis)); | 1793 DCHECK(IsBaselineAlignmentForChild(child, baseline_axis)); |
1839 auto& grid = track_sizing_algorithm_.GetGrid(); | 1794 auto& grid = track_sizing_algorithm_.GetGrid(); |
1840 bool is_column_axis_baseline = baseline_axis == kGridColumnAxis; | 1795 bool is_column_axis_baseline = baseline_axis == kGridColumnAxis; |
1841 bool is_row_axis_context = is_column_axis_baseline; | 1796 bool is_row_axis_context = is_column_axis_baseline; |
1842 const auto& span = is_row_axis_context | 1797 const auto& span = is_row_axis_context |
1843 ? grid.GridItemSpan(child, kForRows) | 1798 ? grid.GridItemSpan(child, kForRows) |
1844 : grid.GridItemSpan(child, kForColumns); | 1799 : grid.GridItemSpan(child, kForColumns); |
1845 auto& contexts_map = is_row_axis_context ? row_axis_alignment_context_ | 1800 auto& contexts_map = is_row_axis_context ? row_axis_alignment_context_ |
1846 : col_axis_alignment_context_; | 1801 : col_axis_alignment_context_; |
1847 auto* context = contexts_map.at(span.StartLine()); | 1802 auto* context = contexts_map.at(span.StartLine()); |
1848 DCHECK(context); | 1803 DCHECK(context); |
1849 ItemPosition align = | 1804 ItemPosition align = is_column_axis_baseline |
1850 SelfAlignmentForChild(baseline_axis, child).GetPosition(); | 1805 ? AlignSelfForChild(child).GetPosition() |
| 1806 : JustifySelfForChild(child).GetPosition(); |
1851 return context->GetSharedGroup(child, align); | 1807 return context->GetSharedGroup(child, align); |
1852 } | 1808 } |
1853 | 1809 |
1854 LayoutUnit LayoutGrid::MarginOverForChild(const LayoutBox& child, | 1810 LayoutUnit LayoutGrid::MarginOverForChild(const LayoutBox& child, |
1855 GridAxis axis) const { | 1811 GridAxis axis) const { |
1856 return IsHorizontalGridAxis(axis) ? child.MarginRight() : child.MarginTop(); | 1812 return IsHorizontalGridAxis(axis) ? child.MarginRight() : child.MarginTop(); |
1857 } | 1813 } |
1858 | 1814 |
1859 LayoutUnit LayoutGrid::MarginUnderForChild(const LayoutBox& child, | 1815 LayoutUnit LayoutGrid::MarginUnderForChild(const LayoutBox& child, |
1860 GridAxis axis) const { | 1816 GridAxis axis) const { |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1958 bool is_column_axis_baseline = baseline_axis == kGridColumnAxis; | 1914 bool is_column_axis_baseline = baseline_axis == kGridColumnAxis; |
1959 bool is_row_axis_context = is_column_axis_baseline; | 1915 bool is_row_axis_context = is_column_axis_baseline; |
1960 const auto& span = is_row_axis_context | 1916 const auto& span = is_row_axis_context |
1961 ? grid.GridItemSpan(child, kForRows) | 1917 ? grid.GridItemSpan(child, kForRows) |
1962 : grid.GridItemSpan(child, kForColumns); | 1918 : grid.GridItemSpan(child, kForColumns); |
1963 auto& contexts_map = is_row_axis_context ? row_axis_alignment_context_ | 1919 auto& contexts_map = is_row_axis_context ? row_axis_alignment_context_ |
1964 : col_axis_alignment_context_; | 1920 : col_axis_alignment_context_; |
1965 auto add_result = contexts_map.insert(span.StartLine(), nullptr); | 1921 auto add_result = contexts_map.insert(span.StartLine(), nullptr); |
1966 | 1922 |
1967 // Looking for a compatible baseline-sharing group. | 1923 // Looking for a compatible baseline-sharing group. |
1968 ItemPosition align = | 1924 ItemPosition align = is_column_axis_baseline |
1969 SelfAlignmentForChild(baseline_axis, child).GetPosition(); | 1925 ? AlignSelfForChild(child).GetPosition() |
| 1926 : JustifySelfForChild(child).GetPosition(); |
1970 if (add_result.is_new_entry) { | 1927 if (add_result.is_new_entry) { |
1971 add_result.stored_value->value = | 1928 add_result.stored_value->value = |
1972 WTF::MakeUnique<BaselineContext>(child, align, ascent, descent); | 1929 WTF::MakeUnique<BaselineContext>(child, align, ascent, descent); |
1973 } else { | 1930 } else { |
1974 auto* context = add_result.stored_value->value.get(); | 1931 auto* context = add_result.stored_value->value.get(); |
1975 context->UpdateSharedGroup(child, align, ascent, descent); | 1932 context->UpdateSharedGroup(child, align, ascent, descent); |
1976 } | 1933 } |
1977 } | 1934 } |
1978 | 1935 |
1979 LayoutUnit LayoutGrid::ColumnAxisBaselineOffsetForChild( | 1936 LayoutUnit LayoutGrid::ColumnAxisBaselineOffsetForChild( |
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2431 if (direction == kForRows) | 2388 if (direction == kForRows) |
2432 return grid.NumTracks(kForRows); | 2389 return grid.NumTracks(kForRows); |
2433 | 2390 |
2434 return grid.NumTracks(kForRows) | 2391 return grid.NumTracks(kForRows) |
2435 ? grid.NumTracks(kForColumns) | 2392 ? grid.NumTracks(kForColumns) |
2436 : GridPositionsResolver::ExplicitGridColumnCount( | 2393 : GridPositionsResolver::ExplicitGridColumnCount( |
2437 StyleRef(), grid.AutoRepeatTracks(kForColumns)); | 2394 StyleRef(), grid.AutoRepeatTracks(kForColumns)); |
2438 } | 2395 } |
2439 | 2396 |
2440 } // namespace blink | 2397 } // namespace blink |
OLD | NEW |