accesskit_consumer/
lib.rs

1// Copyright 2021 The AccessKit Authors. All rights reserved.
2// Licensed under the Apache License, Version 2.0 (found in
3// the LICENSE-APACHE file) or the MIT license (found in
4// the LICENSE-MIT file), at your option.
5
6#![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}