1 // Copyright 2019 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/ax_tree_manager_map.h"
6 
7 #include "base/stl_util.h"
8 #include "ui/accessibility/ax_enums.mojom.h"
9 
10 namespace ui {
11 
AXTreeManagerMap()12 AXTreeManagerMap::AXTreeManagerMap() {}
13 
~AXTreeManagerMap()14 AXTreeManagerMap::~AXTreeManagerMap() {}
15 
GetInstance()16 AXTreeManagerMap& AXTreeManagerMap::GetInstance() {
17   static base::NoDestructor<AXTreeManagerMap> instance;
18   return *instance;
19 }
20 
AddTreeManager(AXTreeID tree_id,AXTreeManager * manager)21 void AXTreeManagerMap::AddTreeManager(AXTreeID tree_id,
22                                       AXTreeManager* manager) {
23   if (tree_id != AXTreeIDUnknown())
24     map_[tree_id] = manager;
25 }
26 
RemoveTreeManager(AXTreeID tree_id)27 void AXTreeManagerMap::RemoveTreeManager(AXTreeID tree_id) {
28   if (tree_id != AXTreeIDUnknown())
29     map_.erase(tree_id);
30 }
31 
GetManager(AXTreeID tree_id)32 AXTreeManager* AXTreeManagerMap::GetManager(AXTreeID tree_id) {
33   if (tree_id == AXTreeIDUnknown() || !base::Contains(map_, tree_id))
34     return nullptr;
35 
36   return map_.at(tree_id);
37 }
38 
GetManagerForChildTree(const AXNode & parent_node)39 AXTreeManager* AXTreeManagerMap::GetManagerForChildTree(
40     const AXNode& parent_node) {
41   if (!parent_node.data().HasStringAttribute(
42           ax::mojom::StringAttribute::kChildTreeId)) {
43     return nullptr;
44   }
45 
46   AXTreeID child_tree_id =
47       AXTreeID::FromString(parent_node.data().GetStringAttribute(
48           ax::mojom::StringAttribute::kChildTreeId));
49   AXTreeManager* child_tree_manager =
50       AXTreeManagerMap::GetInstance().GetManager(child_tree_id);
51 
52   // Some platforms do not use AXTreeManagers, so child trees don't exist in
53   // the browser process.
54   if (!child_tree_manager)
55     return nullptr;
56 
57   DCHECK(child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() ==
58          parent_node.id());
59 
60   return child_tree_manager;
61 }
62 
63 }  // namespace ui
64