| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2012 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/common/accessibility_node_data.h" | |
| 6 | |
| 7 #include <set> | |
| 8 | |
| 9 #include "base/containers/hash_tables.h" | |
| 10 #include "base/strings/string_number_conversions.h" | |
| 11 #include "base/strings/string_util.h" | |
| 12 #include "base/strings/utf_string_conversions.h" | |
| 13 | |
| 14 using base::DoubleToString; | |
| 15 using base::IntToString; | |
| 16 | |
| 17 namespace { | |
| 18 | |
| 19 #ifndef NDEBUG | |
| 20 std::string IntVectorToString(const std::vector<int>& items) { | |
| 21 std::string str; | |
| 22 for (size_t i = 0; i < items.size(); ++i) { | |
| 23 if (i > 0) | |
| 24 str += ","; | |
| 25 str += IntToString(items[i]); | |
| 26 } | |
| 27 return str; | |
| 28 } | |
| 29 #endif | |
| 30 | |
| 31 } // Anonymous namespace | |
| 32 | |
| 33 namespace content { | |
| 34 | |
| 35 AccessibilityNodeData::AccessibilityNodeData() | |
| 36 : id(-1), | |
| 37 role(blink::WebAXRoleUnknown), | |
| 38 state(-1) { | |
| 39 } | |
| 40 | |
| 41 AccessibilityNodeData::~AccessibilityNodeData() { | |
| 42 } | |
| 43 | |
| 44 void AccessibilityNodeData::AddStringAttribute( | |
| 45 StringAttribute attribute, const std::string& value) { | |
| 46 string_attributes.push_back(std::make_pair(attribute, value)); | |
| 47 } | |
| 48 | |
| 49 void AccessibilityNodeData::AddIntAttribute( | |
| 50 IntAttribute attribute, int value) { | |
| 51 int_attributes.push_back(std::make_pair(attribute, value)); | |
| 52 } | |
| 53 | |
| 54 void AccessibilityNodeData::AddFloatAttribute( | |
| 55 FloatAttribute attribute, float value) { | |
| 56 float_attributes.push_back(std::make_pair(attribute, value)); | |
| 57 } | |
| 58 | |
| 59 void AccessibilityNodeData::AddBoolAttribute( | |
| 60 BoolAttribute attribute, bool value) { | |
| 61 bool_attributes.push_back(std::make_pair(attribute, value)); | |
| 62 } | |
| 63 | |
| 64 void AccessibilityNodeData::AddIntListAttribute( | |
| 65 IntListAttribute attribute, const std::vector<int32>& value) { | |
| 66 intlist_attributes.push_back(std::make_pair(attribute, value)); | |
| 67 } | |
| 68 | |
| 69 void AccessibilityNodeData::SetName(std::string name) { | |
| 70 string_attributes.push_back(std::make_pair(ATTR_NAME, name)); | |
| 71 } | |
| 72 | |
| 73 void AccessibilityNodeData::SetValue(std::string value) { | |
| 74 string_attributes.push_back(std::make_pair(ATTR_VALUE, value)); | |
| 75 } | |
| 76 | |
| 77 AccessibilityNodeDataTreeNode::AccessibilityNodeDataTreeNode() | |
| 78 : AccessibilityNodeData() { | |
| 79 } | |
| 80 | |
| 81 AccessibilityNodeDataTreeNode::~AccessibilityNodeDataTreeNode() { | |
| 82 } | |
| 83 | |
| 84 AccessibilityNodeDataTreeNode& AccessibilityNodeDataTreeNode::operator=( | |
| 85 const AccessibilityNodeData& src) { | |
| 86 AccessibilityNodeData::operator=(src); | |
| 87 return *this; | |
| 88 } | |
| 89 | |
| 90 void MakeAccessibilityNodeDataTree( | |
| 91 const std::vector<AccessibilityNodeData>& src_vector, | |
| 92 AccessibilityNodeDataTreeNode* dst_root) { | |
| 93 // This method assumes |src_vector| contains all of the nodes of | |
| 94 // an accessibility tree, and that each parent comes before its | |
| 95 // children. Each node has an id, and the ids of its children. | |
| 96 // The output is a tree where each node contains its children. | |
| 97 | |
| 98 // Initialize a hash map with all of the ids in |src_vector|. | |
| 99 base::hash_map<int32, AccessibilityNodeDataTreeNode*> id_map; | |
| 100 for (size_t i = 0; i < src_vector.size(); ++i) | |
| 101 id_map[src_vector[i].id] = NULL; | |
| 102 | |
| 103 // Copy the nodes to the output tree one at a time. | |
| 104 for (size_t i = 0; i < src_vector.size(); ++i) { | |
| 105 const AccessibilityNodeData& src_node = src_vector[i]; | |
| 106 AccessibilityNodeDataTreeNode* dst_node; | |
| 107 | |
| 108 // If it's the first element in the vector, assume it's | |
| 109 // the root. For any other element, look for it in our | |
| 110 // hash map, and skip it if not there (meaning there was | |
| 111 // an extranous node, or the nodes were sent in the wrong | |
| 112 // order). | |
| 113 if (i == 0) { | |
| 114 dst_node = dst_root; | |
| 115 } else { | |
| 116 dst_node = id_map[src_node.id]; | |
| 117 if (!dst_node) | |
| 118 continue; | |
| 119 } | |
| 120 | |
| 121 // Copy the node data. | |
| 122 *dst_node = src_node; | |
| 123 | |
| 124 // Add placeholders for all of the node's children in the tree, | |
| 125 // and add them to the hash map so we can find them when we | |
| 126 // encounter them in |src_vector|. | |
| 127 dst_node->children.reserve(src_node.child_ids.size()); | |
| 128 for (size_t j = 0; j < src_node.child_ids.size(); ++j) { | |
| 129 int child_id = src_node.child_ids[j]; | |
| 130 if (id_map.find(child_id) != id_map.end()) { | |
| 131 dst_node->children.push_back(AccessibilityNodeDataTreeNode()); | |
| 132 id_map[child_id] = &dst_node->children.back(); | |
| 133 } | |
| 134 } | |
| 135 } | |
| 136 } | |
| 137 | |
| 138 #ifndef NDEBUG | |
| 139 std::string AccessibilityNodeData::DebugString(bool recursive) const { | |
| 140 std::string result; | |
| 141 | |
| 142 result += "id=" + IntToString(id); | |
| 143 | |
| 144 switch (role) { | |
| 145 case blink::WebAXRoleAlert: result += " ALERT"; break; | |
| 146 case blink::WebAXRoleAlertDialog: result += " ALERT_DIALOG"; break; | |
| 147 case blink::WebAXRoleAnnotation: result += " ANNOTATION"; break; | |
| 148 case blink::WebAXRoleApplication: result += " APPLICATION"; break; | |
| 149 case blink::WebAXRoleArticle: result += " ARTICLE"; break; | |
| 150 case blink::WebAXRoleBanner: result += " L_BANNER"; break; | |
| 151 case blink::WebAXRoleBrowser: result += " BROWSER"; break; | |
| 152 case blink::WebAXRoleBusyIndicator: result += " BUSY_INDICATOR"; break; | |
| 153 case blink::WebAXRoleButton: result += " BUTTON"; break; | |
| 154 case blink::WebAXRoleCanvas: result += " CANVAS"; break; | |
| 155 case blink::WebAXRoleCell: result += " CELL"; break; | |
| 156 case blink::WebAXRoleCheckBox: result += " CHECKBOX"; break; | |
| 157 case blink::WebAXRoleColorWell: result += " COLOR_WELL"; break; | |
| 158 case blink::WebAXRoleColumn: result += " COLUMN"; break; | |
| 159 case blink::WebAXRoleColumnHeader: result += " COLUMN_HEADER"; break; | |
| 160 case blink::WebAXRoleComboBox: result += " COMBO_BOX"; break; | |
| 161 case blink::WebAXRoleComplementary: result += " L_COMPLEMENTARY"; break; | |
| 162 case blink::WebAXRoleContentInfo: result += " L_CONTENTINFO"; break; | |
| 163 case blink::WebAXRoleDefinition: result += " DEFINITION"; break; | |
| 164 case blink::WebAXRoleDescriptionListDetail: result += " DD"; break; | |
| 165 case blink::WebAXRoleDescriptionListTerm: result += " DT"; break; | |
| 166 case blink::WebAXRoleDialog: result += " DIALOG"; break; | |
| 167 case blink::WebAXRoleDirectory: result += " DIRECTORY"; break; | |
| 168 case blink::WebAXRoleDisclosureTriangle: | |
| 169 result += " DISCLOSURE_TRIANGLE"; break; | |
| 170 case blink::WebAXRoleDiv: result += " DIV"; break; | |
| 171 case blink::WebAXRoleDocument: result += " DOCUMENT"; break; | |
| 172 case blink::WebAXRoleDrawer: result += " DRAWER"; break; | |
| 173 case blink::WebAXRoleEditableText: result += " EDITABLE_TEXT"; break; | |
| 174 case blink::WebAXRoleFooter: result += " FOOTER"; break; | |
| 175 case blink::WebAXRoleForm: result += " FORM"; break; | |
| 176 case blink::WebAXRoleGrid: result += " GRID"; break; | |
| 177 case blink::WebAXRoleGroup: result += " GROUP"; break; | |
| 178 case blink::WebAXRoleGrowArea: result += " GROW_AREA"; break; | |
| 179 case blink::WebAXRoleHeading: result += " HEADING"; break; | |
| 180 case blink::WebAXRoleHelpTag: result += " HELP_TAG"; break; | |
| 181 case blink::WebAXRoleHorizontalRule: result += " HORIZONTAL_RULE"; break; | |
| 182 case blink::WebAXRoleIgnored: result += " IGNORED"; break; | |
| 183 case blink::WebAXRoleImage: result += " IMAGE"; break; | |
| 184 case blink::WebAXRoleImageMap: result += " IMAGE_MAP"; break; | |
| 185 case blink::WebAXRoleImageMapLink: result += " IMAGE_MAP_LINK"; break; | |
| 186 case blink::WebAXRoleIncrementor: result += " INCREMENTOR"; break; | |
| 187 case blink::WebAXRoleInlineTextBox: result += " INLINE_TEXT_BOX"; break; | |
| 188 case blink::WebAXRoleLabel: result += " LABEL"; break; | |
| 189 case blink::WebAXRoleLink: result += " LINK"; break; | |
| 190 case blink::WebAXRoleList: result += " LIST"; break; | |
| 191 case blink::WebAXRoleListBox: result += " LISTBOX"; break; | |
| 192 case blink::WebAXRoleListBoxOption: result += " LISTBOX_OPTION"; break; | |
| 193 case blink::WebAXRoleListItem: result += " LIST_ITEM"; break; | |
| 194 case blink::WebAXRoleListMarker: result += " LIST_MARKER"; break; | |
| 195 case blink::WebAXRoleLog: result += " LOG"; break; | |
| 196 case blink::WebAXRoleMain: result += " L_MAIN"; break; | |
| 197 case blink::WebAXRoleMarquee: result += " MARQUEE"; break; | |
| 198 case blink::WebAXRoleMath: result += " MATH"; break; | |
| 199 case blink::WebAXRoleMatte: result += " MATTE"; break; | |
| 200 case blink::WebAXRoleMenu: result += " MENU"; break; | |
| 201 case blink::WebAXRoleMenuBar: result += " MENU_BAR"; break; | |
| 202 case blink::WebAXRoleMenuButton: result += " MENU_BUTTON"; break; | |
| 203 case blink::WebAXRoleMenuItem: result += " MENU_ITEM"; break; | |
| 204 case blink::WebAXRoleMenuListOption: result += " MENU_LIST_OPTION"; break; | |
| 205 case blink::WebAXRoleMenuListPopup: result += " MENU_LIST_POPUP"; break; | |
| 206 case blink::WebAXRoleNavigation: result += " L_NAVIGATION"; break; | |
| 207 case blink::WebAXRoleNote: result += " NOTE"; break; | |
| 208 case blink::WebAXRoleOutline: result += " OUTLINE"; break; | |
| 209 case blink::WebAXRoleParagraph: result += " PARAGRAPH"; break; | |
| 210 case blink::WebAXRolePopUpButton: result += " POPUP_BUTTON"; break; | |
| 211 case blink::WebAXRolePresentational: result += " PRESENTATIONAL"; break; | |
| 212 case blink::WebAXRoleProgressIndicator: | |
| 213 result += " PROGRESS_INDICATOR"; break; | |
| 214 case blink::WebAXRoleRadioButton: result += " RADIO_BUTTON"; break; | |
| 215 case blink::WebAXRoleRadioGroup: result += " RADIO_GROUP"; break; | |
| 216 case blink::WebAXRoleRegion: result += " REGION"; break; | |
| 217 case blink::WebAXRoleRootWebArea: result += " ROOT_WEB_AREA"; break; | |
| 218 case blink::WebAXRoleRow: result += " ROW"; break; | |
| 219 case blink::WebAXRoleRowHeader: result += " ROW_HEADER"; break; | |
| 220 case blink::WebAXRoleRuler: result += " RULER"; break; | |
| 221 case blink::WebAXRoleRulerMarker: result += " RULER_MARKER"; break; | |
| 222 case blink::WebAXRoleSVGRoot: result += " SVG_ROOT"; break; | |
| 223 case blink::WebAXRoleScrollArea: result += " SCROLLAREA"; break; | |
| 224 case blink::WebAXRoleScrollBar: result += " SCROLLBAR"; break; | |
| 225 case blink::WebAXRoleSearch: result += " L_SEARCH"; break; | |
| 226 case blink::WebAXRoleSheet: result += " SHEET"; break; | |
| 227 case blink::WebAXRoleSlider: result += " SLIDER"; break; | |
| 228 case blink::WebAXRoleSliderThumb: result += " SLIDER_THUMB"; break; | |
| 229 case blink::WebAXRoleSpinButton: result += " SPIN_BUTTON"; break; | |
| 230 case blink::WebAXRoleSpinButtonPart: result += " SPIN_BUTTON_PART"; break; | |
| 231 case blink::WebAXRoleSplitGroup: result += " SPLIT_GROUP"; break; | |
| 232 case blink::WebAXRoleSplitter: result += " SPLITTER"; break; | |
| 233 case blink::WebAXRoleStaticText: result += " STATIC_TEXT"; break; | |
| 234 case blink::WebAXRoleStatus: result += " STATUS"; break; | |
| 235 case blink::WebAXRoleSystemWide: result += " SYSTEM_WIDE"; break; | |
| 236 case blink::WebAXRoleTab: result += " TAB"; break; | |
| 237 case blink::WebAXRoleTabList: result += " TAB_LIST"; break; | |
| 238 case blink::WebAXRoleTabPanel: result += " TAB_PANEL"; break; | |
| 239 case blink::WebAXRoleTable: result += " TABLE"; break; | |
| 240 case blink::WebAXRoleTableHeaderContainer: | |
| 241 result += " TABLE_HDR_CONTAINER"; break; | |
| 242 case blink::WebAXRoleTextArea: result += " TEXTAREA"; break; | |
| 243 case blink::WebAXRoleTextField: result += " TEXT_FIELD"; break; | |
| 244 case blink::WebAXRoleTimer: result += " TIMER"; break; | |
| 245 case blink::WebAXRoleToggleButton: result += " TOGGLE_BUTTON"; break; | |
| 246 case blink::WebAXRoleToolbar: result += " TOOLBAR"; break; | |
| 247 case blink::WebAXRoleTree: result += " TREE"; break; | |
| 248 case blink::WebAXRoleTreeGrid: result += " TREE_GRID"; break; | |
| 249 case blink::WebAXRoleTreeItem: result += " TREE_ITEM"; break; | |
| 250 case blink::WebAXRoleUnknown: result += " UNKNOWN"; break; | |
| 251 case blink::WebAXRoleUserInterfaceTooltip: result += " TOOLTIP"; break; | |
| 252 case blink::WebAXRoleValueIndicator: result += " VALUE_INDICATOR"; break; | |
| 253 case blink::WebAXRoleWebArea: result += " WEB_AREA"; break; | |
| 254 case blink::WebAXRoleWindow: result += " WINDOW"; break; | |
| 255 default: | |
| 256 assert(false); | |
| 257 } | |
| 258 | |
| 259 if (state & (1 << blink::WebAXStateBusy)) | |
| 260 result += " BUSY"; | |
| 261 if (state & (1 << blink::WebAXStateChecked)) | |
| 262 result += " CHECKED"; | |
| 263 if (state & (1 << blink::WebAXStateCollapsed)) | |
| 264 result += " COLLAPSED"; | |
| 265 if (state & (1 << blink::WebAXStateExpanded)) | |
| 266 result += " EXPANDED"; | |
| 267 if (state & (1 << blink::WebAXStateFocusable)) | |
| 268 result += " FOCUSABLE"; | |
| 269 if (state & (1 << blink::WebAXStateFocused)) | |
| 270 result += " FOCUSED"; | |
| 271 if (state & (1 << blink::WebAXStateHaspopup)) | |
| 272 result += " HASPOPUP"; | |
| 273 if (state & (1 << blink::WebAXStateHovered)) | |
| 274 result += " HOTTRACKED"; | |
| 275 if (state & (1 << blink::WebAXStateIndeterminate)) | |
| 276 result += " INDETERMINATE"; | |
| 277 if (state & (1 << blink::WebAXStateInvisible)) | |
| 278 result += " INVISIBLE"; | |
| 279 if (state & (1 << blink::WebAXStateLinked)) | |
| 280 result += " LINKED"; | |
| 281 if (state & (1 << blink::WebAXStateMultiselectable)) | |
| 282 result += " MULTISELECTABLE"; | |
| 283 if (state & (1 << blink::WebAXStateOffscreen)) | |
| 284 result += " OFFSCREEN"; | |
| 285 if (state & (1 << blink::WebAXStatePressed)) | |
| 286 result += " PRESSED"; | |
| 287 if (state & (1 << blink::WebAXStateProtected)) | |
| 288 result += " PROTECTED"; | |
| 289 if (state & (1 << blink::WebAXStateReadonly)) | |
| 290 result += " READONLY"; | |
| 291 if (state & (1 << blink::WebAXStateRequired)) | |
| 292 result += " REQUIRED"; | |
| 293 if (state & (1 << blink::WebAXStateSelectable)) | |
| 294 result += " SELECTABLE"; | |
| 295 if (state & (1 << blink::WebAXStateSelected)) | |
| 296 result += " SELECTED"; | |
| 297 if (state & (1 << blink::WebAXStateVertical)) | |
| 298 result += " VERTICAL"; | |
| 299 if (state & (1 << blink::WebAXStateVisited)) | |
| 300 result += " VISITED"; | |
| 301 | |
| 302 result += " (" + IntToString(location.x()) + ", " + | |
| 303 IntToString(location.y()) + ")-(" + | |
| 304 IntToString(location.width()) + ", " + | |
| 305 IntToString(location.height()) + ")"; | |
| 306 | |
| 307 for (size_t i = 0; i < int_attributes.size(); ++i) { | |
| 308 std::string value = IntToString(int_attributes[i].second); | |
| 309 switch (int_attributes[i].first) { | |
| 310 case ATTR_SCROLL_X: | |
| 311 result += " scroll_x=" + value; | |
| 312 break; | |
| 313 case ATTR_SCROLL_X_MIN: | |
| 314 result += " scroll_x_min=" + value; | |
| 315 break; | |
| 316 case ATTR_SCROLL_X_MAX: | |
| 317 result += " scroll_x_max=" + value; | |
| 318 break; | |
| 319 case ATTR_SCROLL_Y: | |
| 320 result += " scroll_y=" + value; | |
| 321 break; | |
| 322 case ATTR_SCROLL_Y_MIN: | |
| 323 result += " scroll_y_min=" + value; | |
| 324 break; | |
| 325 case ATTR_SCROLL_Y_MAX: | |
| 326 result += " scroll_y_max=" + value; | |
| 327 break; | |
| 328 case ATTR_HIERARCHICAL_LEVEL: | |
| 329 result += " level=" + value; | |
| 330 break; | |
| 331 case ATTR_TEXT_SEL_START: | |
| 332 result += " sel_start=" + value; | |
| 333 break; | |
| 334 case ATTR_TEXT_SEL_END: | |
| 335 result += " sel_end=" + value; | |
| 336 break; | |
| 337 case ATTR_TABLE_ROW_COUNT: | |
| 338 result += " rows=" + value; | |
| 339 break; | |
| 340 case ATTR_TABLE_COLUMN_COUNT: | |
| 341 result += " cols=" + value; | |
| 342 break; | |
| 343 case ATTR_TABLE_CELL_COLUMN_INDEX: | |
| 344 result += " col=" + value; | |
| 345 break; | |
| 346 case ATTR_TABLE_CELL_ROW_INDEX: | |
| 347 result += " row=" + value; | |
| 348 break; | |
| 349 case ATTR_TABLE_CELL_COLUMN_SPAN: | |
| 350 result += " colspan=" + value; | |
| 351 break; | |
| 352 case ATTR_TABLE_CELL_ROW_SPAN: | |
| 353 result += " rowspan=" + value; | |
| 354 break; | |
| 355 case ATTR_TABLE_COLUMN_HEADER_ID: | |
| 356 result += " column_header_id=" + value; | |
| 357 break; | |
| 358 case ATTR_TABLE_COLUMN_INDEX: | |
| 359 result += " column_index=" + value; | |
| 360 break; | |
| 361 case ATTR_TABLE_HEADER_ID: | |
| 362 result += " header_id=" + value; | |
| 363 break; | |
| 364 case ATTR_TABLE_ROW_HEADER_ID: | |
| 365 result += " row_header_id=" + value; | |
| 366 break; | |
| 367 case ATTR_TABLE_ROW_INDEX: | |
| 368 result += " row_index=" + value; | |
| 369 break; | |
| 370 case ATTR_TITLE_UI_ELEMENT: | |
| 371 result += " title_elem=" + value; | |
| 372 break; | |
| 373 case ATTR_COLOR_VALUE_RED: | |
| 374 result += " color_value_red=" + value; | |
| 375 break; | |
| 376 case ATTR_COLOR_VALUE_GREEN: | |
| 377 result += " color_value_green=" + value; | |
| 378 break; | |
| 379 case ATTR_COLOR_VALUE_BLUE: | |
| 380 result += " color_value_blue=" + value; | |
| 381 break; | |
| 382 case ATTR_TEXT_DIRECTION: | |
| 383 switch (int_attributes[i].second) { | |
| 384 case blink::WebAXTextDirectionLR: | |
| 385 default: | |
| 386 result += " text_direction=lr"; | |
| 387 break; | |
| 388 case blink::WebAXTextDirectionRL: | |
| 389 result += " text_direction=rl"; | |
| 390 break; | |
| 391 case blink::WebAXTextDirectionTB: | |
| 392 result += " text_direction=tb"; | |
| 393 break; | |
| 394 case blink::WebAXTextDirectionBT: | |
| 395 result += " text_direction=bt"; | |
| 396 break; | |
| 397 } | |
| 398 break; | |
| 399 } | |
| 400 } | |
| 401 | |
| 402 for (size_t i = 0; i < string_attributes.size(); ++i) { | |
| 403 std::string value = string_attributes[i].second; | |
| 404 switch (string_attributes[i].first) { | |
| 405 case ATTR_DOC_URL: | |
| 406 result += " doc_url=" + value; | |
| 407 break; | |
| 408 case ATTR_DOC_TITLE: | |
| 409 result += " doc_title=" + value; | |
| 410 break; | |
| 411 case ATTR_DOC_MIMETYPE: | |
| 412 result += " doc_mimetype=" + value; | |
| 413 break; | |
| 414 case ATTR_DOC_DOCTYPE: | |
| 415 result += " doc_doctype=" + value; | |
| 416 break; | |
| 417 case ATTR_ACCESS_KEY: | |
| 418 result += " access_key=" + value; | |
| 419 break; | |
| 420 case ATTR_ACTION: | |
| 421 result += " action=" + value; | |
| 422 break; | |
| 423 case ATTR_DESCRIPTION: | |
| 424 result += " description=" + value; | |
| 425 break; | |
| 426 case ATTR_DISPLAY: | |
| 427 result += " display=" + value; | |
| 428 break; | |
| 429 case ATTR_HELP: | |
| 430 result += " help=" + value; | |
| 431 break; | |
| 432 case ATTR_HTML_TAG: | |
| 433 result += " html_tag=" + value; | |
| 434 break; | |
| 435 case ATTR_LIVE_RELEVANT: | |
| 436 result += " relevant=" + value; | |
| 437 break; | |
| 438 case ATTR_LIVE_STATUS: | |
| 439 result += " live=" + value; | |
| 440 break; | |
| 441 case ATTR_CONTAINER_LIVE_RELEVANT: | |
| 442 result += " container_relevant=" + value; | |
| 443 break; | |
| 444 case ATTR_CONTAINER_LIVE_STATUS: | |
| 445 result += " container_live=" + value; | |
| 446 break; | |
| 447 case ATTR_ROLE: | |
| 448 result += " role=" + value; | |
| 449 break; | |
| 450 case ATTR_SHORTCUT: | |
| 451 result += " shortcut=" + value; | |
| 452 break; | |
| 453 case ATTR_URL: | |
| 454 result += " url=" + value; | |
| 455 break; | |
| 456 case ATTR_NAME: | |
| 457 result += " name=" + value; | |
| 458 break; | |
| 459 case ATTR_VALUE: | |
| 460 result += " value=" + value; | |
| 461 break; | |
| 462 } | |
| 463 } | |
| 464 | |
| 465 for (size_t i = 0; i < float_attributes.size(); ++i) { | |
| 466 std::string value = DoubleToString(float_attributes[i].second); | |
| 467 switch (float_attributes[i].first) { | |
| 468 case ATTR_DOC_LOADING_PROGRESS: | |
| 469 result += " doc_progress=" + value; | |
| 470 break; | |
| 471 case ATTR_VALUE_FOR_RANGE: | |
| 472 result += " value_for_range=" + value; | |
| 473 break; | |
| 474 case ATTR_MAX_VALUE_FOR_RANGE: | |
| 475 result += " max_value=" + value; | |
| 476 break; | |
| 477 case ATTR_MIN_VALUE_FOR_RANGE: | |
| 478 result += " min_value=" + value; | |
| 479 break; | |
| 480 } | |
| 481 } | |
| 482 | |
| 483 for (size_t i = 0; i < bool_attributes.size(); ++i) { | |
| 484 std::string value = bool_attributes[i].second ? "true" : "false"; | |
| 485 switch (bool_attributes[i].first) { | |
| 486 case ATTR_DOC_LOADED: | |
| 487 result += " doc_loaded=" + value; | |
| 488 break; | |
| 489 case ATTR_BUTTON_MIXED: | |
| 490 result += " mixed=" + value; | |
| 491 break; | |
| 492 case ATTR_LIVE_ATOMIC: | |
| 493 result += " atomic=" + value; | |
| 494 break; | |
| 495 case ATTR_LIVE_BUSY: | |
| 496 result += " busy=" + value; | |
| 497 break; | |
| 498 case ATTR_CONTAINER_LIVE_ATOMIC: | |
| 499 result += " container_atomic=" + value; | |
| 500 break; | |
| 501 case ATTR_CONTAINER_LIVE_BUSY: | |
| 502 result += " container_busy=" + value; | |
| 503 break; | |
| 504 case ATTR_ARIA_READONLY: | |
| 505 result += " aria_readonly=" + value; | |
| 506 break; | |
| 507 case ATTR_CAN_SET_VALUE: | |
| 508 result += " can_set_value=" + value; | |
| 509 break; | |
| 510 case ATTR_CANVAS_HAS_FALLBACK: | |
| 511 result += " has_fallback=" + value; | |
| 512 break; | |
| 513 } | |
| 514 } | |
| 515 | |
| 516 for (size_t i = 0; i < intlist_attributes.size(); ++i) { | |
| 517 const std::vector<int32>& values = intlist_attributes[i].second; | |
| 518 switch (intlist_attributes[i].first) { | |
| 519 case ATTR_INDIRECT_CHILD_IDS: | |
| 520 result += " indirect_child_ids=" + IntVectorToString(values); | |
| 521 break; | |
| 522 case ATTR_LINE_BREAKS: | |
| 523 result += " line_breaks=" + IntVectorToString(values); | |
| 524 break; | |
| 525 case ATTR_CELL_IDS: | |
| 526 result += " cell_ids=" + IntVectorToString(values); | |
| 527 break; | |
| 528 case ATTR_UNIQUE_CELL_IDS: | |
| 529 result += " unique_cell_ids=" + IntVectorToString(values); | |
| 530 break; | |
| 531 case ATTR_CHARACTER_OFFSETS: | |
| 532 result += " character_offsets=" + IntVectorToString(values); | |
| 533 break; | |
| 534 case ATTR_WORD_STARTS: | |
| 535 result += " word_starts=" + IntVectorToString(values); | |
| 536 break; | |
| 537 case ATTR_WORD_ENDS: | |
| 538 result += " word_ends=" + IntVectorToString(values); | |
| 539 break; | |
| 540 } | |
| 541 } | |
| 542 | |
| 543 if (!child_ids.empty()) | |
| 544 result += " child_ids=" + IntVectorToString(child_ids); | |
| 545 | |
| 546 return result; | |
| 547 } | |
| 548 | |
| 549 std::string AccessibilityNodeDataTreeNode::DebugString(bool recursive) const { | |
| 550 std::string result; | |
| 551 | |
| 552 static int indent = 0; | |
| 553 result += "\n"; | |
| 554 for (int i = 0; i < indent; ++i) | |
| 555 result += " "; | |
| 556 | |
| 557 result += AccessibilityNodeData::DebugString(recursive); | |
| 558 | |
| 559 if (recursive) { | |
| 560 result += "\n"; | |
| 561 ++indent; | |
| 562 for (size_t i = 0; i < children.size(); ++i) | |
| 563 result += children[i].DebugString(true); | |
| 564 --indent; | |
| 565 } | |
| 566 | |
| 567 return result; | |
| 568 } | |
| 569 | |
| 570 #endif // ifndef NDEBUG | |
| 571 | |
| 572 } // namespace content | |
| OLD | NEW |