ax_tree_manager.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. // Copyright 2022 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. #include "ui/accessibility/ax_tree_manager.h"
  5. #include "base/no_destructor.h"
  6. #include "ui/accessibility/ax_export.h"
  7. #include "ui/accessibility/ax_node.h"
  8. #include "ui/accessibility/ax_tree_id.h"
  9. #include "ui/accessibility/ax_tree_manager_map.h"
  10. #include "ui/accessibility/ax_tree_observer.h"
  11. namespace ui {
  12. // static
  13. AXTreeManagerMap& AXTreeManager::GetMap() {
  14. static base::NoDestructor<AXTreeManagerMap> map;
  15. return *map;
  16. }
  17. // static
  18. AXTreeManager* AXTreeManager::FromID(AXTreeID ax_tree_id) {
  19. return ax_tree_id != AXTreeIDUnknown() ? GetMap().GetManager(ax_tree_id)
  20. : nullptr;
  21. }
  22. // static
  23. AXTreeManager* AXTreeManager::ForChildTree(const AXNode& parent_node) {
  24. if (!parent_node.HasStringAttribute(
  25. ax::mojom::StringAttribute::kChildTreeId)) {
  26. return nullptr;
  27. }
  28. AXTreeID child_tree_id = AXTreeID::FromString(
  29. parent_node.GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId));
  30. AXTreeManager* child_tree_manager = GetMap().GetManager(child_tree_id);
  31. // Some platforms do not use AXTreeManagers, so child trees don't exist in
  32. // the browser process.
  33. DCHECK(!child_tree_manager ||
  34. !child_tree_manager->GetParentNodeFromParentTreeAsAXNode() ||
  35. child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() ==
  36. parent_node.id());
  37. return child_tree_manager;
  38. }
  39. AXTreeManager::AXTreeManager()
  40. : ax_tree_id_(AXTreeIDUnknown()),
  41. ax_tree_(nullptr),
  42. event_generator_(ax_tree()) {}
  43. AXTreeManager::AXTreeManager(std::unique_ptr<AXTree> tree)
  44. : ax_tree_id_(tree ? tree->data().tree_id : AXTreeIDUnknown()),
  45. ax_tree_(std::move(tree)),
  46. event_generator_(ax_tree()) {
  47. GetMap().AddTreeManager(ax_tree_id_, this);
  48. }
  49. AXTreeManager::AXTreeManager(const AXTreeID& tree_id,
  50. std::unique_ptr<AXTree> tree)
  51. : ax_tree_id_(tree_id),
  52. ax_tree_(std::move(tree)),
  53. event_generator_(ax_tree()) {
  54. GetMap().AddTreeManager(ax_tree_id_, this);
  55. if (ax_tree())
  56. tree_observation_.Observe(ax_tree());
  57. }
  58. AXTreeID AXTreeManager::GetTreeID() const {
  59. return ax_tree_ ? ax_tree_->data().tree_id : AXTreeIDUnknown();
  60. }
  61. AXTreeID AXTreeManager::GetParentTreeID() const {
  62. return ax_tree_ ? ax_tree_->data().parent_tree_id : AXTreeIDUnknown();
  63. }
  64. AXNode* AXTreeManager::GetRootAsAXNode() const {
  65. return ax_tree_ ? ax_tree_->root() : nullptr;
  66. }
  67. void AXTreeManager::WillBeRemovedFromMap() {
  68. if (!ax_tree_)
  69. return;
  70. ax_tree_->NotifyTreeManagerWillBeRemoved(ax_tree_id_);
  71. }
  72. AXTreeManager::~AXTreeManager() {
  73. // Stop observing so we don't get a callback for every node being deleted.
  74. event_generator_.ReleaseTree();
  75. if (ax_tree_)
  76. GetMap().RemoveTreeManager(ax_tree_id_);
  77. }
  78. void AXTreeManager::OnTreeDataChanged(AXTree* tree,
  79. const AXTreeData& old_data,
  80. const AXTreeData& new_data) {
  81. GetMap().RemoveTreeManager(ax_tree_id_);
  82. ax_tree_id_ = new_data.tree_id;
  83. GetMap().AddTreeManager(ax_tree_id_, this);
  84. }
  85. void AXTreeManager::RemoveFromMap() {
  86. GetMap().RemoveTreeManager(ax_tree_id_);
  87. }
  88. } // namespace ui