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
6pub(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}