blob: 425e9fdca421147b47e1f93edd63bc9a4716d5eb [file] [log] [blame]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/accessibility/test_single_ax_tree_manager.h"
#include "ui/accessibility/ax_node.h"
#include "ui/accessibility/ax_tree_data.h"
#include "ui/accessibility/ax_tree_manager_map.h"
#include "ui/accessibility/test_ax_tree_update.h"
namespace ui {
TestSingleAXTreeManager::TestSingleAXTreeManager() = default;
TestSingleAXTreeManager::TestSingleAXTreeManager(std::unique_ptr<AXTree> tree)
: AXTreeManager(std::move(tree)) {}
TestSingleAXTreeManager::TestSingleAXTreeManager(
TestSingleAXTreeManager&& manager)
: AXTreeManager(std::move(manager.ax_tree_)) {
if (ax_tree_) {
GetMap().RemoveTreeManager(GetTreeID());
GetMap().AddTreeManager(GetTreeID(), this);
}
}
TestSingleAXTreeManager& TestSingleAXTreeManager::operator=(
TestSingleAXTreeManager&& manager) {
if (this == &manager) {
return *this;
}
if (manager.HasValidTreeID()) {
GetMap().RemoveTreeManager(manager.GetTreeID());
}
// std::move(nullptr) == nullptr, so no need to check if `manager.tree_` is
// assigned.
SetTree(std::move(manager.ax_tree_));
return *this;
}
TestSingleAXTreeManager::~TestSingleAXTreeManager() = default;
void TestSingleAXTreeManager::DestroyTree() {
if (HasValidTreeID()) {
GetMap().RemoveTreeManager(GetTreeID());
}
ax_tree_.reset();
}
AXTree* TestSingleAXTreeManager::GetTree() const {
DCHECK(ax_tree_) << "Did you forget to call SetTree?";
return ax_tree_.get();
}
void TestSingleAXTreeManager::SetTree(std::unique_ptr<AXTree> tree) {
if (HasValidTreeID()) {
GetMap().RemoveTreeManager(GetTreeID());
}
ax_tree_ = std::move(tree);
if (HasValidTreeID()) {
GetMap().AddTreeManager(GetTreeID(), this);
}
}
AXTree* TestSingleAXTreeManager::Init(AXTreeUpdate tree_update) {
tree_update.has_tree_data = true;
if (tree_update.tree_data.tree_id == AXTreeIDUnknown()) {
tree_update.tree_data.tree_id = AXTreeID::CreateNewAXTreeID();
}
SetTree(std::make_unique<AXTree>(tree_update));
return ax_tree_.get();
}
AXTree* TestSingleAXTreeManager::Init(const std::string& tree_update) {
return Init(TestAXTreeUpdate(tree_update));
}
AXTree* TestSingleAXTreeManager::Init(
const AXNodeData& node1,
const AXNodeData& node2 /* = AXNodeData() */,
const AXNodeData& node3 /* = AXNodeData() */,
const AXNodeData& node4 /* = AXNodeData() */,
const AXNodeData& node5 /* = AXNodeData() */,
const AXNodeData& node6 /* = AXNodeData() */,
const AXNodeData& node7 /* = AXNodeData() */,
const AXNodeData& node8 /* = AXNodeData() */,
const AXNodeData& node9 /* = AXNodeData() */,
const AXNodeData& node10 /* = AXNodeData() */,
const AXNodeData& node11 /* = AXNodeData() */,
const AXNodeData& node12 /* = AXNodeData() */) {
AXTreeUpdate update;
update.root_id = node1.id;
update.tree_data.title = "Dialog title";
update.nodes.push_back(node1);
if (node2.id != kInvalidAXNodeID) {
update.nodes.push_back(node2);
}
if (node3.id != kInvalidAXNodeID) {
update.nodes.push_back(node3);
}
if (node4.id != kInvalidAXNodeID) {
update.nodes.push_back(node4);
}
if (node5.id != kInvalidAXNodeID) {
update.nodes.push_back(node5);
}
if (node6.id != kInvalidAXNodeID) {
update.nodes.push_back(node6);
}
if (node7.id != kInvalidAXNodeID) {
update.nodes.push_back(node7);
}
if (node8.id != kInvalidAXNodeID) {
update.nodes.push_back(node8);
}
if (node9.id != kInvalidAXNodeID) {
update.nodes.push_back(node9);
}
if (node10.id != kInvalidAXNodeID) {
update.nodes.push_back(node10);
}
if (node11.id != kInvalidAXNodeID) {
update.nodes.push_back(node11);
}
if (node12.id != kInvalidAXNodeID) {
update.nodes.push_back(node12);
}
return Init(update);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTreePosition(
const AXNode& anchor,
int child_index) const {
return AXNodePosition::CreateTreePosition(anchor, child_index);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTreePosition(
const AXTree* tree,
const AXNodeData& anchor_data,
int child_index) const {
const AXNode* anchor = tree->GetFromId(anchor_data.id);
return CreateTreePosition(*anchor, child_index);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTreePosition(
const AXNodeData& anchor_data,
int child_index) const {
return CreateTreePosition(ax_tree(), anchor_data, child_index);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTextPosition(
const AXNode& anchor,
int text_offset,
ax::mojom::TextAffinity affinity) const {
return AXNodePosition::CreateTextPosition(anchor, text_offset, affinity);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTextPosition(
const AXTree* tree,
const AXNodeData& anchor_data,
int text_offset,
ax::mojom::TextAffinity affinity) const {
const AXNode* anchor = tree->GetFromId(anchor_data.id);
return CreateTextPosition(*anchor, text_offset, affinity);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTextPosition(
const AXNodeData& anchor_data,
int text_offset,
ax::mojom::TextAffinity affinity) const {
return CreateTextPosition(ax_tree(), anchor_data, text_offset, affinity);
}
AXNodePosition::AXPositionInstance TestSingleAXTreeManager::CreateTextPosition(
const AXNodeID& anchor_id,
int text_offset,
ax::mojom::TextAffinity affinity) const {
const AXNode* anchor = ax_tree()->GetFromId(anchor_id);
return CreateTextPosition(*anchor, text_offset, affinity);
}
AXNode* TestSingleAXTreeManager::GetParentNodeFromParentTree() const {
AXTreeID parent_tree_id = GetParentTreeID();
TestSingleAXTreeManager* parent_manager =
static_cast<TestSingleAXTreeManager*>(
AXTreeManager::FromID(parent_tree_id));
if (!parent_manager) {
return nullptr;
}
std::set<AXNodeID> host_node_ids =
parent_manager->GetTree()->GetNodeIdsForChildTreeId(GetTreeID());
for (AXNodeID host_node_id : host_node_ids) {
AXNode* parent_node = parent_manager->GetNode(host_node_id);
if (parent_node) {
return parent_node;
}
}
return nullptr;
}
} // namespace ui