7
7
#include < functional>
8
8
#include < utility>
9
9
10
+ #include " flutter/third_party/accessibility/ax/ax_tree_manager_map.h"
10
11
#include " flutter/third_party/accessibility/ax/ax_tree_update.h"
11
12
#include " flutter/third_party/accessibility/base/logging.h"
12
13
@@ -19,14 +20,20 @@ constexpr int kHasScrollingAction =
19
20
FlutterSemanticsAction::kFlutterSemanticsActionScrollDown ;
20
21
21
22
// AccessibilityBridge
22
- AccessibilityBridge::AccessibilityBridge () {
23
- event_generator_.SetTree (&tree_);
24
- tree_.AddObserver (static_cast <ui::AXTreeObserver*>(this ));
23
+ AccessibilityBridge::AccessibilityBridge ()
24
+ : tree_(std::make_unique<ui::AXTree>()) {
25
+ event_generator_.SetTree (tree_.get ());
26
+ tree_->AddObserver (static_cast <ui::AXTreeObserver*>(this ));
27
+ ui::AXTreeData data = tree_->data ();
28
+ data.tree_id = ui::AXTreeID::CreateNewAXTreeID ();
29
+ tree_->UpdateData (data);
30
+ ui::AXTreeManagerMap::GetInstance ().AddTreeManager (tree_->GetAXTreeID (),
31
+ this );
25
32
}
26
33
27
34
AccessibilityBridge::~AccessibilityBridge () {
28
35
event_generator_.ReleaseTree ();
29
- tree_. RemoveObserver (static_cast <ui::AXTreeObserver*>(this ));
36
+ tree_-> RemoveObserver (static_cast <ui::AXTreeObserver*>(this ));
30
37
}
31
38
32
39
void AccessibilityBridge::AddFlutterSemanticsNodeUpdate (
@@ -51,9 +58,9 @@ void AccessibilityBridge::CommitUpdates() {
51
58
std::optional<ui::AXTreeUpdate> remove_reparented =
52
59
CreateRemoveReparentedNodesUpdate ();
53
60
if (remove_reparented.has_value ()) {
54
- tree_. Unserialize (remove_reparented.value ());
61
+ tree_-> Unserialize (remove_reparented.value ());
55
62
56
- std::string error = tree_. error ();
63
+ std::string error = tree_-> error ();
57
64
if (!error.empty ()) {
58
65
FML_LOG (ERROR) << " Failed to update ui::AXTree, error: " << error;
59
66
assert (false );
@@ -63,7 +70,7 @@ void AccessibilityBridge::CommitUpdates() {
63
70
64
71
// Second, apply the pending node updates. This also moves reparented nodes to
65
72
// their new parents if needed.
66
- ui::AXTreeUpdate update{.tree_data = tree_. data ()};
73
+ ui::AXTreeUpdate update{.tree_data = tree_-> data ()};
67
74
68
75
// Figure out update order, ui::AXTree only accepts update in tree order,
69
76
// where parent node must come before the child node in
@@ -88,11 +95,11 @@ void AccessibilityBridge::CommitUpdates() {
88
95
}
89
96
}
90
97
91
- tree_. Unserialize (update);
98
+ tree_-> Unserialize (update);
92
99
pending_semantics_node_updates_.clear ();
93
100
pending_semantics_custom_action_updates_.clear ();
94
101
95
- std::string error = tree_. error ();
102
+ std::string error = tree_-> error ();
96
103
if (!error.empty ()) {
97
104
FML_LOG (ERROR) << " Failed to update ui::AXTree, error: " << error;
98
105
return ;
@@ -122,7 +129,7 @@ AccessibilityBridge::GetFlutterPlatformNodeDelegateFromID(
122
129
}
123
130
124
131
const ui::AXTreeData& AccessibilityBridge::GetAXTreeData () const {
125
- return tree_. data ();
132
+ return tree_-> data ();
126
133
}
127
134
128
135
const std::vector<ui::AXEventGenerator::TargetedEvent>
@@ -201,7 +208,7 @@ AccessibilityBridge::CreateRemoveReparentedNodesUpdate() {
201
208
for (auto node_update : pending_semantics_node_updates_) {
202
209
for (int32_t child_id : node_update.second .children_in_traversal_order ) {
203
210
// Skip nodes that don't exist or have a parent in the current tree.
204
- ui::AXNode* child = tree_. GetFromId (child_id);
211
+ ui::AXNode* child = tree_-> GetFromId (child_id);
205
212
if (!child) {
206
213
continue ;
207
214
}
@@ -222,7 +229,7 @@ AccessibilityBridge::CreateRemoveReparentedNodesUpdate() {
222
229
// Create an update to remove the child from its previous parent.
223
230
int32_t parent_id = child->parent ()->id ();
224
231
if (updates.find (parent_id) == updates.end ()) {
225
- updates[parent_id] = tree_. GetFromId (parent_id)->data ();
232
+ updates[parent_id] = tree_-> GetFromId (parent_id)->data ();
226
233
}
227
234
228
235
ui::AXNodeData* parent = &updates[parent_id];
@@ -239,7 +246,7 @@ AccessibilityBridge::CreateRemoveReparentedNodesUpdate() {
239
246
}
240
247
241
248
ui::AXTreeUpdate update{
242
- .tree_data = tree_. data (),
249
+ .tree_data = tree_-> data (),
243
250
.nodes = std::vector<ui::AXNodeData>(),
244
251
};
245
252
@@ -649,8 +656,60 @@ gfx::NativeViewAccessible AccessibilityBridge::GetNativeAccessibleFromId(
649
656
gfx::RectF AccessibilityBridge::RelativeToGlobalBounds (const ui::AXNode* node,
650
657
bool & offscreen,
651
658
bool clip_bounds) {
652
- return tree_.RelativeToTreeBounds (node, gfx::RectF (), &offscreen,
653
- clip_bounds);
659
+ return tree_->RelativeToTreeBounds (node, gfx::RectF (), &offscreen,
660
+ clip_bounds);
661
+ }
662
+
663
+ ui::AXNode* AccessibilityBridge::GetNodeFromTree (
664
+ ui::AXTreeID tree_id,
665
+ ui::AXNode::AXID node_id) const {
666
+ return GetNodeFromTree (node_id);
667
+ }
668
+
669
+ ui::AXNode* AccessibilityBridge::GetNodeFromTree (
670
+ ui::AXNode::AXID node_id) const {
671
+ return tree_->GetFromId (node_id);
672
+ }
673
+
674
+ ui::AXTreeID AccessibilityBridge::GetTreeID () const {
675
+ return tree_->GetAXTreeID ();
676
+ }
677
+
678
+ ui::AXTreeID AccessibilityBridge::GetParentTreeID () const {
679
+ return ui::AXTreeIDUnknown ();
680
+ }
681
+
682
+ ui::AXNode* AccessibilityBridge::GetRootAsAXNode () const {
683
+ return tree_->root ();
684
+ }
685
+
686
+ ui::AXNode* AccessibilityBridge::GetParentNodeFromParentTreeAsAXNode () const {
687
+ return nullptr ;
688
+ }
689
+
690
+ ui::AXTree* AccessibilityBridge::GetTree () const {
691
+ return tree_.get ();
692
+ }
693
+
694
+ ui::AXPlatformNode* AccessibilityBridge::GetPlatformNodeFromTree (
695
+ const ui::AXNode::AXID node_id) const {
696
+ auto platform_delegate_weak = GetFlutterPlatformNodeDelegateFromID (node_id);
697
+ auto platform_delegate = platform_delegate_weak.lock ();
698
+ if (!platform_delegate) {
699
+ return nullptr ;
700
+ }
701
+ return platform_delegate->GetPlatformNode ();
702
+ }
703
+
704
+ ui::AXPlatformNode* AccessibilityBridge::GetPlatformNodeFromTree (
705
+ const ui::AXNode& node) const {
706
+ return GetPlatformNodeFromTree (node.id ());
707
+ }
708
+
709
+ ui::AXPlatformNodeDelegate* AccessibilityBridge::RootDelegate () const {
710
+ return GetFlutterPlatformNodeDelegateFromID (GetRootAsAXNode ()->id ())
711
+ .lock ()
712
+ .get ();
654
713
}
655
714
656
715
} // namespace flutter
0 commit comments