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)15TestAXTreeManager::TestAXTreeManager(std::unique_ptr<AXTree> tree) 16 : tree_(std::move(tree)) { 17 AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this); 18 } 19 ~TestAXTreeManager()20TestAXTreeManager::~TestAXTreeManager() { 21 if (tree_) 22 AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); 23 } 24 DestroyTree()25void TestAXTreeManager::DestroyTree() { 26 if (!tree_) 27 return; 28 29 AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); 30 tree_.reset(); 31 } 32 GetTree() const33AXTree* TestAXTreeManager::GetTree() const { 34 DCHECK(tree_) << "Did you forget to call SetTree?"; 35 return tree_.get(); 36 } 37 SetTree(std::unique_ptr<AXTree> tree)38void 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) const46AXNode* 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) const52AXNode* TestAXTreeManager::GetNodeFromTree(const AXNode::AXID node_id) const { 53 return tree_ ? tree_->GetFromId(node_id) : nullptr; 54 } 55 AddObserver(AXTreeObserver * observer)56void TestAXTreeManager::AddObserver(AXTreeObserver* observer) { 57 if (tree_) 58 tree_->AddObserver(observer); 59 } 60 RemoveObserver(AXTreeObserver * observer)61void TestAXTreeManager::RemoveObserver(AXTreeObserver* observer) { 62 if (tree_) 63 tree_->RemoveObserver(observer); 64 } 65 GetTreeID() const66AXTreeID TestAXTreeManager::GetTreeID() const { 67 return tree_ ? tree_->data().tree_id : AXTreeIDUnknown(); 68 } 69 GetParentTreeID() const70AXTreeID TestAXTreeManager::GetParentTreeID() const { 71 return tree_ ? tree_->data().parent_tree_id : AXTreeIDUnknown(); 72 } 73 GetRootAsAXNode() const74AXNode* TestAXTreeManager::GetRootAsAXNode() const { 75 return tree_ ? tree_->root() : nullptr; 76 } 77 GetParentNodeFromParentTreeAsAXNode() const78AXNode* 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