⎇ a3f94c2748ff655b3ab42444640d8e69e917aaab
tests/hand_written/overlarge_grids.rs
Historia
Quién tocó qué
crudo
Clamp CSS grids at 10000 tracks in each dimension
1//! Tests for grids which exceed the limits described at
2//! <https://www.w3.org/TR/css-grid-1/#overlarge-grids>
3//!
4//! Test cases are derived from Servo bug reports:
5//! - <https://github.com/servo/servo/issues/45949>
6//! - <https://github.com/servo/servo/issues/45939>
7//! - <https://github.com/servo/servo/issues/45938>
8//! - <https://github.com/servo/servo/issues/46081>
9#![cfg(feature = "grid")]
10
11use taffy::prelude::*;
12use taffy::style::{GridAutoFlow, RepetitionCount};
13
14/// <https://github.com/servo/servo/issues/45949>
15///
16/// `grid-template: 90px / repeat(32768, fit-content(512px)) fit-content(100%)`
17///
18/// An explicit track count greater than `i16::MAX` previously caused a subtract with overflow in
19/// `OriginZeroLine::implied_positive_implicit_tracks`.
20#[test]
21fn explicit_grid_huge_repeat_count() {
22 let mut tree: TaffyTree<()> = TaffyTree::new();
23 let child = tree.new_leaf(Style::default()).unwrap();
24 let node = tree
25 .new_with_children(
26 Style {
27 display: Display::Grid,
28 grid_template_rows: vec![length(90.0)],
29 grid_template_columns: vec![repeat(32768, vec![fit_content(length(512.0))]), fit_content(percent(1.0))],
30 ..Default::default()
31 },
32 &[child],
33 )
34 .unwrap();
35 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
36}
37
38/// A repeat count and track count whose product overflows `u16`
39#[test]
40fn explicit_grid_repeat_count_track_count_product_overflow() {
41 let mut tree: TaffyTree<()> = TaffyTree::new();
42 let child = tree.new_leaf(Style::default()).unwrap();
43 let node = tree
44 .new_with_children(
45 Style {
46 display: Display::Grid,
47 grid_template_columns: vec![repeat(40000, vec![length(10.0), length(10.0)])],
48 ..Default::default()
49 },
50 &[child],
51 )
52 .unwrap();
53 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
54}
55
56/// <https://github.com/servo/servo/issues/46081>
57///
58/// `grid-template-columns: repeat(auto-fill, 0em)` with a definite container size.
59///
60/// Zero-sized tracks previously resulted in an infinite number of repetitions, which caused
61/// an add with overflow when computing the repetition count.
62#[test]
63fn auto_fill_zero_sized_tracks() {
64 let mut tree: TaffyTree<()> = TaffyTree::new();
65 let child = tree.new_leaf(Style::default()).unwrap();
66 let node = tree
67 .new_with_children(
68 Style {
69 display: Display::Grid,
70 size: Size { width: length(200.0), height: auto() },
71 grid_template_columns: vec![repeat(RepetitionCount::AutoFill, vec![length(0.0)])],
72 ..Default::default()
73 },
74 &[child],
75 )
76 .unwrap();
77 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
78}
79
80/// Tiny (but non-zero) sized tracks in a large container can also produce more repetitions than
81/// fit in the 10000 track limit
82#[test]
83fn auto_fill_tiny_tracks_huge_container() {
84 let mut tree: TaffyTree<()> = TaffyTree::new();
85 let child = tree.new_leaf(Style::default()).unwrap();
86 let node = tree
87 .new_with_children(
88 Style {
89 display: Display::Grid,
90 size: Size { width: length(100_000.0), height: auto() },
91 grid_template_columns: vec![repeat(RepetitionCount::AutoFill, vec![length(1.0)])],
92 ..Default::default()
93 },
94 &[child],
95 )
96 .unwrap();
97 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
98}
99
100/// <https://github.com/servo/servo/issues/45939>
101///
102/// A large negative `grid-row-start` (as produced by Servo wrapping `45983` to `i16`) combined
103/// with `grid-auto-flow: column` and auto-placed items with definite column positions previously
104/// caused a panic in `OriginZeroLine::into_track_vec_index`.
105#[test]
106fn auto_flow_column_with_large_row_start() {
107 let mut tree: TaffyTree<()> = TaffyTree::new();
108 let column_start_child = Style { grid_column: Line { start: line(7), end: auto() }, ..Default::default() };
109 let row_start_child = Style { grid_row: Line { start: line(-19553), end: auto() }, ..Default::default() };
110 let children = [
111 tree.new_leaf(column_start_child.clone()).unwrap(),
112 tree.new_leaf(column_start_child.clone()).unwrap(),
113 tree.new_leaf(column_start_child.clone()).unwrap(),
114 tree.new_leaf(row_start_child).unwrap(),
115 ];
116 let node = tree
117 .new_with_children(
118 Style { display: Display::Grid, grid_auto_flow: GridAutoFlow::Column, ..Default::default() },
119 &children,
120 )
121 .unwrap();
122 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
123}
124
125/// <https://github.com/servo/servo/issues/45938>
126///
127/// As above, but with explicit grid columns and items with both a large row-start and
128/// a definite column position.
129#[test]
130fn auto_flow_column_with_explicit_columns_and_large_row_start() {
131 let mut tree: TaffyTree<()> = TaffyTree::new();
132 let column_start = Line { start: line(7), end: auto() };
133 let child1 = Style { grid_column: column_start.clone(), ..Default::default() };
134 let child2 = Style {
135 grid_column: column_start.clone(),
136 grid_row: Line { start: line(-19553), end: auto() },
137 ..Default::default()
138 };
139 let children = [
140 tree.new_leaf(child1.clone()).unwrap(),
141 tree.new_leaf(child1.clone()).unwrap(),
142 tree.new_leaf(child1.clone()).unwrap(),
143 tree.new_leaf(child2).unwrap(),
144 ];
145 let node = tree
146 .new_with_children(
147 Style {
148 display: Display::Grid,
149 grid_auto_flow: GridAutoFlow::Column,
150 grid_template_rows: vec![auto()],
151 grid_template_columns: vec![
152 fit_content(length(80.0)),
153 fit_content(length(80.0)),
154 minmax(max_content(), auto()),
155 ],
156 ..Default::default()
157 },
158 &children,
159 )
160 .unwrap();
161 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
162}
163
164/// Definitely placed items with extreme positive and negative line numbers
165#[test]
166fn definite_placement_with_extreme_line_numbers() {
167 let mut tree: TaffyTree<()> = TaffyTree::new();
168 let children = [
169 tree.new_leaf(Style {
170 grid_column: Line { start: line(32767), end: auto() },
171 grid_row: Line { start: line(-32768), end: auto() },
172 ..Default::default()
173 })
174 .unwrap(),
175 tree.new_leaf(Style {
176 grid_column: Line { start: span(10000), end: line(-32768) },
177 grid_row: Line { start: line(32767), end: span(10000) },
178 ..Default::default()
179 })
180 .unwrap(),
181 ];
182 let node = tree.new_with_children(Style { display: Display::Grid, ..Default::default() }, &children).unwrap();
183 tree.compute_layout(node, Size::MAX_CONTENT).unwrap();
184}