1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
4ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
5ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/accessibility/accessibility_tree_formatter.h"
6ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
7ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <atk/atk.h>
8ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/logging.h"
10ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/string_number_conversions.h"
11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/string_util.h"
12ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/stringprintf.h"
13ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/strings/utf_string_conversions.h"
14ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "content/browser/accessibility/browser_accessibility_gtk.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
16ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochnamespace content {
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
18ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AccessibilityTreeFormatter::AddProperties(const BrowserAccessibility& node,
19ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                               base::DictionaryValue* dict) {
20ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  BrowserAccessibilityGtk* node_gtk =
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      const_cast<BrowserAccessibility*>(&node)->ToBrowserAccessibilityGtk();
22ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  AtkObject* atk_object = node_gtk->GetAtkObject();
23ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  AtkRole role = atk_object_get_role(atk_object);
24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (role != ATK_ROLE_UNKNOWN)
25ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    dict->SetString("role", atk_role_get_name(role));
26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dict->SetString("name", atk_object_get_name(atk_object));
27ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dict->SetString("description", atk_object_get_description(atk_object));
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  AtkStateSet* state_set =
29ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      atk_object_ref_state_set(atk_object);
30ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ListValue* states = new base::ListValue;
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (int i = ATK_STATE_INVALID; i < ATK_STATE_LAST_DEFINED; i++) {
32ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    AtkStateType state_type = static_cast<AtkStateType>(i);
33ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if (atk_state_set_contains_state(state_set, state_type))
34ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      states->AppendString(atk_state_type_get_name(state_type));
35ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
36ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dict->Set("states", states);
37ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  dict->SetInteger("id", node.renderer_id());
38ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
39ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochstring16 AccessibilityTreeFormatter::ToString(const base::DictionaryValue& node,
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                              const string16& indent) {
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  string16 line;
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string role_value;
44ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  node.GetString("role", &role_value);
45ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  if (!role_value.empty())
46ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    WriteAttribute(true, base::StringPrintf("[%s]", role_value.c_str()), &line);
47ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
48ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string name_value;
49ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  node.GetString("name", &name_value);
50ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WriteAttribute(true, base::StringPrintf("name='%s'", name_value.c_str()),
51ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 &line);
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
53ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  std::string description_value;
54ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  node.GetString("description", &description_value);
55ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WriteAttribute(false,
56ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::StringPrintf("description='%s'",
57ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                                    description_value.c_str()),
58ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 &line);
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const base::ListValue* states_value;
61ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  node.GetList("states", &states_value);
62ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  for (base::ListValue::const_iterator it = states_value->begin();
63ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       it != states_value->end();
64ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch       ++it) {
65ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    std::string state_value;
66ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch    if ((*it)->GetAsString(&state_value))
67ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      WriteAttribute(true, state_value, &line);
68ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  }
69ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int id_value;
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  node.GetInteger("id", &id_value);
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  WriteAttribute(false,
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 base::StringPrintf("id=%d", id_value),
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch                 &line);
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return indent + line + ASCIIToUTF16("\n");
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochvoid AccessibilityTreeFormatter::Initialize() {}
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static
82ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst base::FilePath::StringType
83ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochAccessibilityTreeFormatter::GetActualFileSuffix() {
84ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return FILE_PATH_LITERAL("-actual-gtk.txt");
85ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
86ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
87ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst base::FilePath::StringType
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochAccessibilityTreeFormatter::GetExpectedFileSuffix() {
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return FILE_PATH_LITERAL("-expected-gtk.txt");
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
93ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static
94ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst std::string AccessibilityTreeFormatter::GetAllowEmptyString() {
95ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return "@GTK-ALLOW-EMPTY:";
96ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
97ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst std::string AccessibilityTreeFormatter::GetAllowString() {
100ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return "@GTK-ALLOW:";
101ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
102ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
103ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// static
104ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochconst std::string AccessibilityTreeFormatter::GetDenyString() {
105ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  return "@GTK-DENY:";
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
108ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch}
109