Commit 861bb429 authored by Alexander Surkov's avatar Alexander Surkov Committed by Commit Bot

Make accessibility tree formatter walking ATK tree

ATK tree traversal makes the a11y tree formatter to produce ATK trees which makes accessible tree testing realistically reflect accessibility trees on Linux

Bug: 1066536
Change-Id: I03072c9bdd419202703308b7c79d65bb5e1e9e27
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2140306Reviewed-by: default avatarMartin Robinson <mrobinson@igalia.com>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Commit-Queue: Alexander Surkkov <asurkov@igalia.com>
Cr-Commit-Position: refs/heads/master@{#757812}
parent ae8526c6
......@@ -27,7 +27,7 @@
namespace content {
class AccessibilityTreeFormatterAuraLinux
: public AccessibilityTreeFormatterBrowser {
: public AccessibilityTreeFormatterBase {
public:
AccessibilityTreeFormatterAuraLinux();
~AccessibilityTreeFormatterAuraLinux() override;
......@@ -38,13 +38,13 @@ class AccessibilityTreeFormatterAuraLinux
const std::string GetAllowString() override;
const std::string GetDenyString() override;
const std::string GetDenyNodeString() override;
void AddProperties(const BrowserAccessibility& node,
base::DictionaryValue* dict) override;
base::string16 ProcessTreeForOutput(
const base::DictionaryValue& node,
base::DictionaryValue* filtered_dict_result = nullptr) override;
std::unique_ptr<base::DictionaryValue> BuildAccessibilityTree(
BrowserAccessibility* root) override;
std::unique_ptr<base::DictionaryValue> BuildAccessibilityTreeForProcess(
base::ProcessId pid) override;
std::unique_ptr<base::DictionaryValue> BuildAccessibilityTreeForWindow(
......@@ -54,6 +54,13 @@ class AccessibilityTreeFormatterAuraLinux
std::unique_ptr<base::DictionaryValue> BuildAccessibilityTreeWithNode(
AtspiAccessible* node);
void RecursiveBuildAccessibilityTree(AtspiAccessible* node,
base::DictionaryValue* dict);
void RecursiveBuildAccessibilityTree(AtkObject*, base::DictionaryValue*);
void AddProperties(AtkObject*, base::DictionaryValue*);
void AddProperties(AtspiAccessible*, base::DictionaryValue*);
void AddTextProperties(AtkText* atk_text, base::DictionaryValue* dict);
void AddActionProperties(AtkObject* atk_object, base::DictionaryValue* dict);
void AddValueProperties(AtkObject* atk_object, base::DictionaryValue* dict);
......@@ -61,11 +68,6 @@ class AccessibilityTreeFormatterAuraLinux
void AddTableCellProperties(const ui::AXPlatformNodeAuraLinux* node,
AtkObject* atk_object,
base::DictionaryValue* dict);
void RecursiveBuildAccessibilityTree(AtspiAccessible* node,
base::DictionaryValue* dict);
virtual void AddProperties(AtspiAccessible* node,
base::DictionaryValue* dict);
};
// static
......@@ -135,6 +137,24 @@ AccessibilityTreeFormatterAuraLinux::BuildAccessibilityTreeForPattern(
return nullptr;
}
std::unique_ptr<base::DictionaryValue>
AccessibilityTreeFormatterAuraLinux::BuildAccessibilityTree(
BrowserAccessibility* root) {
DCHECK(root);
DCHECK(root->instance_active());
BrowserAccessibilityAuraLinux* platform_root =
ToBrowserAccessibilityAuraLinux(root);
DCHECK(platform_root);
AtkObject* atk_root = platform_root->GetNativeViewAccessible();
DCHECK(atk_root);
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
RecursiveBuildAccessibilityTree(atk_root, dict.get());
return dict;
}
std::unique_ptr<base::DictionaryValue>
AccessibilityTreeFormatterAuraLinux::BuildAccessibilityTreeForProcess(
base::ProcessId pid) {
......@@ -162,6 +182,32 @@ AccessibilityTreeFormatterAuraLinux::BuildAccessibilityTreeWithNode(
return dict;
}
void AccessibilityTreeFormatterAuraLinux::RecursiveBuildAccessibilityTree(
AtkObject* atk_node,
base::DictionaryValue* dict) {
AddProperties(atk_node, dict);
auto child_count = atk_object_get_n_accessible_children(atk_node);
if (child_count <= 0)
return;
auto children = std::make_unique<base::ListValue>();
for (auto i = 0; i < child_count; i++) {
std::unique_ptr<base::DictionaryValue> child_dict(
new base::DictionaryValue);
AtkObject* atk_child = atk_object_ref_accessible_child(atk_node, i);
CHECK(atk_child);
RecursiveBuildAccessibilityTree(atk_child, child_dict.get());
g_object_unref(atk_child);
children->Append(std::move(child_dict));
}
dict->Set(kChildrenDictAttr, std::move(children));
}
void AccessibilityTreeFormatterAuraLinux::RecursiveBuildAccessibilityTree(
AtspiAccessible* node,
base::DictionaryValue* dict) {
......@@ -412,18 +458,17 @@ void AccessibilityTreeFormatterAuraLinux::AddTableCellProperties(
}
void AccessibilityTreeFormatterAuraLinux::AddProperties(
const BrowserAccessibility& node,
AtkObject* atk_object,
base::DictionaryValue* dict) {
dict->SetInteger("id", node.GetId());
BrowserAccessibilityAuraLinux* acc_obj =
ToBrowserAccessibilityAuraLinux(const_cast<BrowserAccessibility*>(&node));
DCHECK(acc_obj);
ui::AXPlatformNodeAuraLinux* platform_node =
ui::AXPlatformNodeAuraLinux::FromAtkObject(atk_object);
DCHECK(platform_node);
ui::AXPlatformNodeAuraLinux* ax_platform_node = acc_obj->GetNode();
DCHECK(ax_platform_node);
BrowserAccessibility* node = BrowserAccessibility::FromAXPlatformNodeDelegate(
platform_node->GetDelegate());
DCHECK(node);
AtkObject* atk_object = ax_platform_node->GetNativeViewAccessible();
DCHECK(atk_object);
dict->SetInteger("id", node->GetId());
AtkRole role = atk_object_get_role(atk_object);
if (role != ATK_ROLE_UNKNOWN) {
......@@ -469,7 +514,7 @@ void AccessibilityTreeFormatterAuraLinux::AddProperties(
AddActionProperties(atk_object, dict);
AddValueProperties(atk_object, dict);
AddTableProperties(atk_object, dict);
AddTableCellProperties(ax_platform_node, atk_object, dict);
AddTableCellProperties(platform_node, atk_object, dict);
}
void AccessibilityTreeFormatterAuraLinux::AddProperties(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment