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