tawasuyu

tawasuyu/taffy

A high performance rust-powered UI layout library

Rust 717HTML 669Markdown 12TOML 62372 Definiciones

⎇ a3f94c2748ff655b3ab42444640d8e69e917aaab tests/hand_written/overlarge_grids.rs Rust · 184 líneas · 6.9 KB Historia Quién tocó qué crudo

Clamp CSS grids at 10000 tracks in each dimension a3f94c274 · Nico Burns ·

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}