1 // Copyright 2014 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_id_registry.h"
6 
7 #include "base/memory/singleton.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "ui/accessibility/ax_action_handler_base.h"
10 
11 namespace ui {
12 
13 // static
GetInstance()14 AXTreeIDRegistry* AXTreeIDRegistry::GetInstance() {
15   return base::Singleton<AXTreeIDRegistry>::get();
16 }
17 
SetFrameIDForAXTreeID(const FrameID & frame_id,const AXTreeID & ax_tree_id)18 void AXTreeIDRegistry::SetFrameIDForAXTreeID(const FrameID& frame_id,
19                                              const AXTreeID& ax_tree_id) {
20   auto it = frame_to_ax_tree_id_map_.find(frame_id);
21   if (it != frame_to_ax_tree_id_map_.end()) {
22     NOTREACHED();
23     return;
24   }
25 
26   frame_to_ax_tree_id_map_[frame_id] = ax_tree_id;
27   ax_tree_to_frame_id_map_[ax_tree_id] = frame_id;
28 }
29 
GetFrameID(const AXTreeID & ax_tree_id)30 AXTreeIDRegistry::FrameID AXTreeIDRegistry::GetFrameID(
31     const AXTreeID& ax_tree_id) {
32   auto it = ax_tree_to_frame_id_map_.find(ax_tree_id);
33   if (it != ax_tree_to_frame_id_map_.end())
34     return it->second;
35 
36   return FrameID(-1, -1);
37 }
38 
GetAXTreeID(AXTreeIDRegistry::FrameID frame_id)39 AXTreeID AXTreeIDRegistry::GetAXTreeID(AXTreeIDRegistry::FrameID frame_id) {
40   auto it = frame_to_ax_tree_id_map_.find(frame_id);
41   if (it != frame_to_ax_tree_id_map_.end())
42     return it->second;
43 
44   return ui::AXTreeIDUnknown();
45 }
46 
GetOrCreateAXTreeID(AXActionHandlerBase * handler)47 AXTreeID AXTreeIDRegistry::GetOrCreateAXTreeID(AXActionHandlerBase* handler) {
48   for (auto it : id_to_action_handler_) {
49     if (it.second == handler)
50       return it.first;
51   }
52   AXTreeID new_id = AXTreeID::CreateNewAXTreeID();
53   SetAXTreeID(new_id, handler);
54   return new_id;
55 }
56 
GetActionHandler(AXTreeID ax_tree_id)57 AXActionHandlerBase* AXTreeIDRegistry::GetActionHandler(AXTreeID ax_tree_id) {
58   auto it = id_to_action_handler_.find(ax_tree_id);
59   if (it == id_to_action_handler_.end())
60     return nullptr;
61   return it->second;
62 }
63 
SetAXTreeID(const ui::AXTreeID & id,AXActionHandlerBase * action_handler)64 void AXTreeIDRegistry::SetAXTreeID(const ui::AXTreeID& id,
65                                    AXActionHandlerBase* action_handler) {
66   DCHECK(id_to_action_handler_.find(id) == id_to_action_handler_.end());
67   id_to_action_handler_[id] = action_handler;
68 }
69 
RemoveAXTreeID(AXTreeID ax_tree_id)70 void AXTreeIDRegistry::RemoveAXTreeID(AXTreeID ax_tree_id) {
71   auto frame_it = ax_tree_to_frame_id_map_.find(ax_tree_id);
72   if (frame_it != ax_tree_to_frame_id_map_.end()) {
73     frame_to_ax_tree_id_map_.erase(frame_it->second);
74     ax_tree_to_frame_id_map_.erase(frame_it);
75   }
76 
77   auto action_it = id_to_action_handler_.find(ax_tree_id);
78   if (action_it != id_to_action_handler_.end())
79     id_to_action_handler_.erase(action_it);
80 }
81 
AXTreeIDRegistry()82 AXTreeIDRegistry::AXTreeIDRegistry() {
83 }
84 
~AXTreeIDRegistry()85 AXTreeIDRegistry::~AXTreeIDRegistry() {}
86 
87 }  // namespace ui
88