1 // Copyright 2020 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "ui/accessibility/test_ax_tree_manager.h"
6 
7 #include "ui/accessibility/ax_node.h"
8 #include "ui/accessibility/ax_tree_data.h"
9 #include "ui/accessibility/ax_tree_manager_map.h"
10 
11 namespace ui {
12 
13 TestAXTreeManager::TestAXTreeManager() = default;
14 
TestAXTreeManager(std::unique_ptr<AXTree> tree)15 TestAXTreeManager::TestAXTreeManager(std::unique_ptr<AXTree> tree)
16     : tree_(std::move(tree)) {
17   AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
18 }
19 
~TestAXTreeManager()20 TestAXTreeManager::~TestAXTreeManager() {
21   if (tree_)
22     AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
23 }
24 
DestroyTree()25 void TestAXTreeManager::DestroyTree() {
26   if (!tree_)
27     return;
28 
29   AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
30   tree_.reset();
31 }
32 
GetTree() const33 AXTree* TestAXTreeManager::GetTree() const {
34   DCHECK(tree_) << "Did you forget to call SetTree?";
35   return tree_.get();
36 }
37 
SetTree(std::unique_ptr<AXTree> tree)38 void TestAXTreeManager::SetTree(std::unique_ptr<AXTree> tree) {
39   if (tree_)
40     AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID());
41 
42   tree_ = std::move(tree);
43   AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this);
44 }
45 
GetNodeFromTree(const AXTreeID tree_id,const AXNode::AXID node_id) const46 AXNode* TestAXTreeManager::GetNodeFromTree(const AXTreeID tree_id,
47                                            const AXNode::AXID node_id) const {
48   return (tree_ && GetTreeID() == tree_id) ? tree_->GetFromId(node_id)
49                                            : nullptr;
50 }
51 
GetNodeFromTree(const AXNode::AXID node_id) const52 AXNode* TestAXTreeManager::GetNodeFromTree(const AXNode::AXID node_id) const {
53   return tree_ ? tree_->GetFromId(node_id) : nullptr;
54 }
55 
AddObserver(AXTreeObserver * observer)56 void TestAXTreeManager::AddObserver(AXTreeObserver* observer) {
57   if (tree_)
58     tree_->AddObserver(observer);
59 }
60 
RemoveObserver(AXTreeObserver * observer)61 void TestAXTreeManager::RemoveObserver(AXTreeObserver* observer) {
62   if (tree_)
63     tree_->RemoveObserver(observer);
64 }
65 
GetTreeID() const66 AXTreeID TestAXTreeManager::GetTreeID() const {
67   return tree_ ? tree_->data().tree_id : AXTreeIDUnknown();
68 }
69 
GetParentTreeID() const70 AXTreeID TestAXTreeManager::GetParentTreeID() const {
71   return tree_ ? tree_->data().parent_tree_id : AXTreeIDUnknown();
72 }
73 
GetRootAsAXNode() const74 AXNode* TestAXTreeManager::GetRootAsAXNode() const {
75   return tree_ ? tree_->root() : nullptr;
76 }
77 
GetParentNodeFromParentTreeAsAXNode() const78 AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const {
79   ui::AXTreeID parent_tree_id = GetParentTreeID();
80   TestAXTreeManager* parent_manager = static_cast<TestAXTreeManager*>(
81       ui::AXTreeManagerMap::GetInstance().GetManager(parent_tree_id));
82   if (!parent_manager)
83     return nullptr;
84 
85   std::set<int32_t> host_node_ids =
86       parent_manager->GetTree()->GetNodeIdsForChildTreeId(GetTreeID());
87 
88   for (int32_t host_node_id : host_node_ids) {
89     ui::AXNode* parent_node =
90         parent_manager->GetNodeFromTree(parent_tree_id, host_node_id);
91     if (parent_node)
92       return parent_node;
93   }
94 
95   return nullptr;
96 }
97 
98 }  // namespace ui
99