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