Skip to content

Commit 72f9b42

Browse files
authored
fix: Correctly handle recursive filtering (#438)
1 parent 5a80d3a commit 72f9b42

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

consumer/src/filters.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ pub fn common_filter(node: &Node) -> FilterResult {
2323
return FilterResult::ExcludeSubtree;
2424
}
2525

26+
if let Some(parent) = node.parent() {
27+
if common_filter(&parent) == FilterResult::ExcludeSubtree {
28+
return FilterResult::ExcludeSubtree;
29+
}
30+
}
31+
2632
let role = node.role();
2733
if role == Role::GenericContainer || role == Role::InlineTextBox {
2834
return FilterResult::ExcludeNode;

platforms/atspi-common/src/adapter.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,28 @@ use crate::{
2929

3030
struct AdapterChangeHandler<'a> {
3131
adapter: &'a Adapter,
32+
added_nodes: HashSet<NodeId>,
33+
removed_nodes: HashSet<NodeId>,
3234
checked_text_change: HashSet<NodeId>,
3335
}
3436

3537
impl<'a> AdapterChangeHandler<'a> {
3638
fn new(adapter: &'a Adapter) -> Self {
3739
Self {
3840
adapter,
41+
added_nodes: HashSet::new(),
42+
removed_nodes: HashSet::new(),
3943
checked_text_change: HashSet::new(),
4044
}
4145
}
4246

4347
fn add_node(&mut self, node: &Node) {
48+
let id = node.id();
49+
if self.added_nodes.contains(&id) {
50+
return;
51+
}
52+
self.added_nodes.insert(id);
53+
4454
let role = node.role();
4555
let is_root = node.is_root();
4656
let node = NodeWrapper(node);
@@ -65,7 +75,20 @@ impl<'a> AdapterChangeHandler<'a> {
6575
}
6676
}
6777

78+
fn add_subtree(&mut self, node: &Node) {
79+
self.add_node(node);
80+
for child in node.filtered_children(&filter) {
81+
self.add_subtree(&child);
82+
}
83+
}
84+
6885
fn remove_node(&mut self, node: &Node) {
86+
let id = node.id();
87+
if self.removed_nodes.contains(&id) {
88+
return;
89+
}
90+
self.removed_nodes.insert(id);
91+
6992
let role = node.role();
7093
let is_root = node.is_root();
7194
let node = NodeWrapper(node);
@@ -78,6 +101,13 @@ impl<'a> AdapterChangeHandler<'a> {
78101
.unregister_interfaces(node.id(), node.interfaces());
79102
}
80103

104+
fn remove_subtree(&mut self, node: &Node) {
105+
for child in node.filtered_children(&filter) {
106+
self.remove_subtree(&child);
107+
}
108+
self.remove_node(node);
109+
}
110+
81111
fn emit_text_change_if_needed_parent(&mut self, old_node: &Node, new_node: &Node) {
82112
if !new_node.supports_text_ranges() || !old_node.supports_text_ranges() {
83113
return;
@@ -220,9 +250,17 @@ impl TreeChangeHandler for AdapterChangeHandler<'_> {
220250
let filter_new = filter(new_node);
221251
if filter_new != filter_old {
222252
if filter_new == FilterResult::Include {
223-
self.add_node(new_node);
253+
if filter_old == FilterResult::ExcludeSubtree {
254+
self.add_subtree(new_node);
255+
} else {
256+
self.add_node(new_node);
257+
}
224258
} else if filter_old == FilterResult::Include {
225-
self.remove_node(old_node);
259+
if filter_new == FilterResult::ExcludeSubtree {
260+
self.remove_subtree(old_node);
261+
} else {
262+
self.remove_node(old_node);
263+
}
226264
}
227265
} else if filter_new == FilterResult::Include {
228266
let old_wrapper = NodeWrapper(old_node);

0 commit comments

Comments
 (0)