accesskit_consumer/
lib.rs
1pub(crate) mod tree;
7pub use tree::{ChangeHandler as TreeChangeHandler, State as TreeState, Tree};
8
9pub(crate) mod node;
10pub use node::Node;
11
12pub(crate) mod filters;
13pub use filters::{common_filter, common_filter_with_root_exception, FilterResult};
14
15pub(crate) mod iterators;
16
17pub(crate) mod text;
18pub use text::{
19 AttributeValue as TextAttributeValue, Position as TextPosition, Range as TextRange,
20 WeakRange as WeakTextRange,
21};
22
23#[cfg(test)]
24mod tests {
25 use accesskit::{Affine, NodeBuilder, NodeId, Rect, Role, Tree, TreeUpdate, Vec2};
26
27 use crate::FilterResult;
28
29 pub const ROOT_ID: NodeId = NodeId(0);
30 pub const PARAGRAPH_0_ID: NodeId = NodeId(1);
31 pub const LABEL_0_0_IGNORED_ID: NodeId = NodeId(2);
32 pub const PARAGRAPH_1_IGNORED_ID: NodeId = NodeId(3);
33 pub const BUTTON_1_0_HIDDEN_ID: NodeId = NodeId(4);
34 pub const CONTAINER_1_0_0_HIDDEN_ID: NodeId = NodeId(5);
35 pub const LABEL_1_1_ID: NodeId = NodeId(6);
36 pub const BUTTON_1_2_HIDDEN_ID: NodeId = NodeId(7);
37 pub const CONTAINER_1_2_0_HIDDEN_ID: NodeId = NodeId(8);
38 pub const PARAGRAPH_2_ID: NodeId = NodeId(9);
39 pub const LABEL_2_0_ID: NodeId = NodeId(10);
40 pub const PARAGRAPH_3_IGNORED_ID: NodeId = NodeId(11);
41 pub const EMPTY_CONTAINER_3_0_IGNORED_ID: NodeId = NodeId(12);
42 pub const LINK_3_1_IGNORED_ID: NodeId = NodeId(13);
43 pub const LABEL_3_1_0_ID: NodeId = NodeId(14);
44 pub const BUTTON_3_2_ID: NodeId = NodeId(15);
45 pub const EMPTY_CONTAINER_3_3_IGNORED_ID: NodeId = NodeId(16);
46
47 pub fn test_tree() -> crate::tree::Tree {
48 let root = {
49 let mut builder = NodeBuilder::new(Role::RootWebArea);
50 builder.set_children(vec![
51 PARAGRAPH_0_ID,
52 PARAGRAPH_1_IGNORED_ID,
53 PARAGRAPH_2_ID,
54 PARAGRAPH_3_IGNORED_ID,
55 ]);
56 builder.build()
57 };
58 let paragraph_0 = {
59 let mut builder = NodeBuilder::new(Role::Paragraph);
60 builder.set_children(vec![LABEL_0_0_IGNORED_ID]);
61 builder.build()
62 };
63 let label_0_0_ignored = {
64 let mut builder = NodeBuilder::new(Role::Label);
65 builder.set_name("label_0_0_ignored");
66 builder.build()
67 };
68 let paragraph_1_ignored = {
69 let mut builder = NodeBuilder::new(Role::Paragraph);
70 builder.set_transform(Affine::translate(Vec2::new(10.0, 40.0)));
71 builder.set_bounds(Rect {
72 x0: 0.0,
73 y0: 0.0,
74 x1: 800.0,
75 y1: 40.0,
76 });
77 builder.set_children(vec![
78 BUTTON_1_0_HIDDEN_ID,
79 LABEL_1_1_ID,
80 BUTTON_1_2_HIDDEN_ID,
81 ]);
82 builder.build()
83 };
84 let button_1_0_hidden = {
85 let mut builder = NodeBuilder::new(Role::Button);
86 builder.set_name("button_1_0_hidden");
87 builder.set_hidden();
88 builder.set_children(vec![CONTAINER_1_0_0_HIDDEN_ID]);
89 builder.build()
90 };
91 let container_1_0_0_hidden = {
92 let mut builder = NodeBuilder::new(Role::GenericContainer);
93 builder.set_hidden();
94 builder.build()
95 };
96 let label_1_1 = {
97 let mut builder = NodeBuilder::new(Role::Label);
98 builder.set_bounds(Rect {
99 x0: 10.0,
100 y0: 10.0,
101 x1: 90.0,
102 y1: 30.0,
103 });
104 builder.set_name("label_1_1");
105 builder.build()
106 };
107 let button_1_2_hidden = {
108 let mut builder = NodeBuilder::new(Role::Button);
109 builder.set_name("button_1_2_hidden");
110 builder.set_hidden();
111 builder.set_children(vec![CONTAINER_1_2_0_HIDDEN_ID]);
112 builder.build()
113 };
114 let container_1_2_0_hidden = {
115 let mut builder = NodeBuilder::new(Role::GenericContainer);
116 builder.set_hidden();
117 builder.build()
118 };
119 let paragraph_2 = {
120 let mut builder = NodeBuilder::new(Role::Paragraph);
121 builder.set_children(vec![LABEL_2_0_ID]);
122 builder.build()
123 };
124 let label_2_0 = {
125 let mut builder = NodeBuilder::new(Role::Label);
126 builder.set_name("label_2_0");
127 builder.build()
128 };
129 let paragraph_3_ignored = {
130 let mut builder = NodeBuilder::new(Role::Paragraph);
131 builder.set_children(vec![
132 EMPTY_CONTAINER_3_0_IGNORED_ID,
133 LINK_3_1_IGNORED_ID,
134 BUTTON_3_2_ID,
135 EMPTY_CONTAINER_3_3_IGNORED_ID,
136 ]);
137 builder.build()
138 };
139 let empty_container_3_0_ignored = NodeBuilder::new(Role::GenericContainer).build();
140 let link_3_1_ignored = {
141 let mut builder = NodeBuilder::new(Role::Link);
142 builder.set_children(vec![LABEL_3_1_0_ID]);
143 builder.set_linked();
144 builder.build()
145 };
146 let label_3_1_0 = {
147 let mut builder = NodeBuilder::new(Role::Label);
148 builder.set_name("label_3_1_0");
149 builder.build()
150 };
151 let button_3_2 = {
152 let mut builder = NodeBuilder::new(Role::Button);
153 builder.set_name("button_3_2");
154 builder.build()
155 };
156 let empty_container_3_3_ignored = NodeBuilder::new(Role::GenericContainer).build();
157 let initial_update = TreeUpdate {
158 nodes: vec![
159 (ROOT_ID, root),
160 (PARAGRAPH_0_ID, paragraph_0),
161 (LABEL_0_0_IGNORED_ID, label_0_0_ignored),
162 (PARAGRAPH_1_IGNORED_ID, paragraph_1_ignored),
163 (BUTTON_1_0_HIDDEN_ID, button_1_0_hidden),
164 (CONTAINER_1_0_0_HIDDEN_ID, container_1_0_0_hidden),
165 (LABEL_1_1_ID, label_1_1),
166 (BUTTON_1_2_HIDDEN_ID, button_1_2_hidden),
167 (CONTAINER_1_2_0_HIDDEN_ID, container_1_2_0_hidden),
168 (PARAGRAPH_2_ID, paragraph_2),
169 (LABEL_2_0_ID, label_2_0),
170 (PARAGRAPH_3_IGNORED_ID, paragraph_3_ignored),
171 (EMPTY_CONTAINER_3_0_IGNORED_ID, empty_container_3_0_ignored),
172 (LINK_3_1_IGNORED_ID, link_3_1_ignored),
173 (LABEL_3_1_0_ID, label_3_1_0),
174 (BUTTON_3_2_ID, button_3_2),
175 (EMPTY_CONTAINER_3_3_IGNORED_ID, empty_container_3_3_ignored),
176 ],
177 tree: Some(Tree::new(ROOT_ID)),
178 focus: ROOT_ID,
179 };
180 crate::tree::Tree::new(initial_update, false)
181 }
182
183 pub fn test_tree_filter(node: &crate::Node) -> FilterResult {
184 let id = node.id();
185 if node.is_hidden() {
186 FilterResult::ExcludeSubtree
187 } else if id == LABEL_0_0_IGNORED_ID
188 || id == PARAGRAPH_1_IGNORED_ID
189 || id == PARAGRAPH_3_IGNORED_ID
190 || id == EMPTY_CONTAINER_3_0_IGNORED_ID
191 || id == LINK_3_1_IGNORED_ID
192 || id == EMPTY_CONTAINER_3_3_IGNORED_ID
193 {
194 FilterResult::ExcludeNode
195 } else {
196 FilterResult::Include
197 }
198 }
199}