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