205 lines
7.0 KiB
Rust
205 lines
7.0 KiB
Rust
// Copyright 2021 The AccessKit Authors. All rights reserved.
|
|
// Licensed under the Apache License, Version 2.0 (found in
|
|
// the LICENSE-APACHE file) or the MIT license (found in
|
|
// the LICENSE-MIT file), at your option.
|
|
|
|
#![no_std]
|
|
|
|
extern crate alloc;
|
|
|
|
pub(crate) mod tree;
|
|
pub use tree::{ChangeHandler as TreeChangeHandler, State as TreeState, Tree};
|
|
|
|
pub(crate) mod node;
|
|
pub use node::Node;
|
|
|
|
pub(crate) mod filters;
|
|
pub use filters::{common_filter, common_filter_with_root_exception, FilterResult};
|
|
|
|
pub(crate) mod iterators;
|
|
|
|
pub(crate) mod text;
|
|
pub use text::{
|
|
AttributeValue as TextAttributeValue, Position as TextPosition, Range as TextRange,
|
|
WeakRange as WeakTextRange,
|
|
};
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use accesskit::{Affine, Node, NodeId, Rect, Role, Tree, TreeUpdate, Vec2};
|
|
use alloc::vec;
|
|
|
|
use crate::FilterResult;
|
|
|
|
pub const ROOT_ID: NodeId = NodeId(0);
|
|
pub const PARAGRAPH_0_ID: NodeId = NodeId(1);
|
|
pub const LABEL_0_0_IGNORED_ID: NodeId = NodeId(2);
|
|
pub const PARAGRAPH_1_IGNORED_ID: NodeId = NodeId(3);
|
|
pub const BUTTON_1_0_HIDDEN_ID: NodeId = NodeId(4);
|
|
pub const CONTAINER_1_0_0_HIDDEN_ID: NodeId = NodeId(5);
|
|
pub const LABEL_1_1_ID: NodeId = NodeId(6);
|
|
pub const BUTTON_1_2_HIDDEN_ID: NodeId = NodeId(7);
|
|
pub const CONTAINER_1_2_0_HIDDEN_ID: NodeId = NodeId(8);
|
|
pub const PARAGRAPH_2_ID: NodeId = NodeId(9);
|
|
pub const LABEL_2_0_ID: NodeId = NodeId(10);
|
|
pub const PARAGRAPH_3_IGNORED_ID: NodeId = NodeId(11);
|
|
pub const EMPTY_CONTAINER_3_0_IGNORED_ID: NodeId = NodeId(12);
|
|
pub const LINK_3_1_IGNORED_ID: NodeId = NodeId(13);
|
|
pub const LABEL_3_1_0_ID: NodeId = NodeId(14);
|
|
pub const BUTTON_3_2_ID: NodeId = NodeId(15);
|
|
pub const EMPTY_CONTAINER_3_3_IGNORED_ID: NodeId = NodeId(16);
|
|
|
|
pub fn test_tree() -> crate::tree::Tree {
|
|
let root = {
|
|
let mut node = Node::new(Role::RootWebArea);
|
|
node.set_children(vec![
|
|
PARAGRAPH_0_ID,
|
|
PARAGRAPH_1_IGNORED_ID,
|
|
PARAGRAPH_2_ID,
|
|
PARAGRAPH_3_IGNORED_ID,
|
|
]);
|
|
node
|
|
};
|
|
let paragraph_0 = {
|
|
let mut node = Node::new(Role::Paragraph);
|
|
node.set_children(vec![LABEL_0_0_IGNORED_ID]);
|
|
node
|
|
};
|
|
let label_0_0_ignored = {
|
|
let mut node = Node::new(Role::Label);
|
|
node.set_value("label_0_0_ignored");
|
|
node
|
|
};
|
|
let paragraph_1_ignored = {
|
|
let mut node = Node::new(Role::Paragraph);
|
|
node.set_transform(Affine::translate(Vec2::new(10.0, 40.0)));
|
|
node.set_bounds(Rect {
|
|
x0: 0.0,
|
|
y0: 0.0,
|
|
x1: 800.0,
|
|
y1: 40.0,
|
|
});
|
|
node.set_children(vec![
|
|
BUTTON_1_0_HIDDEN_ID,
|
|
LABEL_1_1_ID,
|
|
BUTTON_1_2_HIDDEN_ID,
|
|
]);
|
|
node
|
|
};
|
|
let button_1_0_hidden = {
|
|
let mut node = Node::new(Role::Button);
|
|
node.set_label("button_1_0_hidden");
|
|
node.set_hidden();
|
|
node.set_children(vec![CONTAINER_1_0_0_HIDDEN_ID]);
|
|
node
|
|
};
|
|
let container_1_0_0_hidden = {
|
|
let mut node = Node::new(Role::GenericContainer);
|
|
node.set_hidden();
|
|
node
|
|
};
|
|
let label_1_1 = {
|
|
let mut node = Node::new(Role::Label);
|
|
node.set_bounds(Rect {
|
|
x0: 10.0,
|
|
y0: 10.0,
|
|
x1: 90.0,
|
|
y1: 30.0,
|
|
});
|
|
node.set_value("label_1_1");
|
|
node
|
|
};
|
|
let button_1_2_hidden = {
|
|
let mut node = Node::new(Role::Button);
|
|
node.set_label("button_1_2_hidden");
|
|
node.set_hidden();
|
|
node.set_children(vec![CONTAINER_1_2_0_HIDDEN_ID]);
|
|
node
|
|
};
|
|
let container_1_2_0_hidden = {
|
|
let mut node = Node::new(Role::GenericContainer);
|
|
node.set_hidden();
|
|
node
|
|
};
|
|
let paragraph_2 = {
|
|
let mut node = Node::new(Role::Paragraph);
|
|
node.set_children(vec![LABEL_2_0_ID]);
|
|
node
|
|
};
|
|
let label_2_0 = {
|
|
let mut node = Node::new(Role::Label);
|
|
node.set_label("label_2_0");
|
|
node
|
|
};
|
|
let paragraph_3_ignored = {
|
|
let mut node = Node::new(Role::Paragraph);
|
|
node.set_children(vec![
|
|
EMPTY_CONTAINER_3_0_IGNORED_ID,
|
|
LINK_3_1_IGNORED_ID,
|
|
BUTTON_3_2_ID,
|
|
EMPTY_CONTAINER_3_3_IGNORED_ID,
|
|
]);
|
|
node
|
|
};
|
|
let empty_container_3_0_ignored = Node::new(Role::GenericContainer);
|
|
let link_3_1_ignored = {
|
|
let mut node = Node::new(Role::Link);
|
|
node.set_children(vec![LABEL_3_1_0_ID]);
|
|
node.set_linked();
|
|
node
|
|
};
|
|
let label_3_1_0 = {
|
|
let mut node = Node::new(Role::Label);
|
|
node.set_value("label_3_1_0");
|
|
node
|
|
};
|
|
let button_3_2 = {
|
|
let mut node = Node::new(Role::Button);
|
|
node.set_label("button_3_2");
|
|
node
|
|
};
|
|
let empty_container_3_3_ignored = Node::new(Role::GenericContainer);
|
|
let initial_update = TreeUpdate {
|
|
nodes: vec![
|
|
(ROOT_ID, root),
|
|
(PARAGRAPH_0_ID, paragraph_0),
|
|
(LABEL_0_0_IGNORED_ID, label_0_0_ignored),
|
|
(PARAGRAPH_1_IGNORED_ID, paragraph_1_ignored),
|
|
(BUTTON_1_0_HIDDEN_ID, button_1_0_hidden),
|
|
(CONTAINER_1_0_0_HIDDEN_ID, container_1_0_0_hidden),
|
|
(LABEL_1_1_ID, label_1_1),
|
|
(BUTTON_1_2_HIDDEN_ID, button_1_2_hidden),
|
|
(CONTAINER_1_2_0_HIDDEN_ID, container_1_2_0_hidden),
|
|
(PARAGRAPH_2_ID, paragraph_2),
|
|
(LABEL_2_0_ID, label_2_0),
|
|
(PARAGRAPH_3_IGNORED_ID, paragraph_3_ignored),
|
|
(EMPTY_CONTAINER_3_0_IGNORED_ID, empty_container_3_0_ignored),
|
|
(LINK_3_1_IGNORED_ID, link_3_1_ignored),
|
|
(LABEL_3_1_0_ID, label_3_1_0),
|
|
(BUTTON_3_2_ID, button_3_2),
|
|
(EMPTY_CONTAINER_3_3_IGNORED_ID, empty_container_3_3_ignored),
|
|
],
|
|
tree: Some(Tree::new(ROOT_ID)),
|
|
focus: ROOT_ID,
|
|
};
|
|
crate::tree::Tree::new(initial_update, false)
|
|
}
|
|
|
|
pub fn test_tree_filter(node: &crate::Node) -> FilterResult {
|
|
let id = node.id();
|
|
if node.is_hidden() {
|
|
FilterResult::ExcludeSubtree
|
|
} else if id == LABEL_0_0_IGNORED_ID
|
|
|| id == PARAGRAPH_1_IGNORED_ID
|
|
|| id == PARAGRAPH_3_IGNORED_ID
|
|
|| id == EMPTY_CONTAINER_3_0_IGNORED_ID
|
|
|| id == LINK_3_1_IGNORED_ID
|
|
|| id == EMPTY_CONTAINER_3_3_IGNORED_ID
|
|
{
|
|
FilterResult::ExcludeNode
|
|
} else {
|
|
FilterResult::Include
|
|
}
|
|
}
|
|
}
|