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/string_number_conversions.h" |
| 10 #include "base/string_util.h" |
| 11 #include "base/utf_string_conversions.h" |
| 12 |
| 13 using base::DoubleToString; |
| 14 using base::IntToString; |
| 15 |
| 16 namespace { |
| 17 |
| 18 #ifndef NDEBUG |
| 19 std::string IntVectorToString(const std::vector<int>& items) { |
| 20 std::string str; |
| 21 for (size_t i = 0; i < items.size(); ++i) { |
| 22 if (i > 0) |
| 23 str += ","; |
| 24 str += IntToString(items[i]); |
| 25 } |
| 26 return str; |
| 27 } |
| 28 #endif |
| 29 |
| 30 } // Anonymous namespace |
| 31 |
| 32 namespace content { |
| 33 |
| 34 AccessibilityNodeData::AccessibilityNodeData() |
| 35 : id(-1), |
| 36 role(ROLE_UNKNOWN), |
| 37 state(-1) { |
| 38 } |
| 39 |
| 40 AccessibilityNodeData::~AccessibilityNodeData() { |
| 41 } |
| 42 |
| 43 #ifndef NDEBUG |
| 44 std::string AccessibilityNodeData::DebugString(bool recursive) const { |
| 45 std::string result; |
| 46 static int indent = 0; |
| 47 result += "\n"; |
| 48 for (int i = 0; i < indent; ++i) |
| 49 result += " "; |
| 50 |
| 51 result += "id=" + IntToString(id); |
| 52 |
| 53 switch (role) { |
| 54 case ROLE_ALERT: result += " ALERT"; break; |
| 55 case ROLE_ALERT_DIALOG: result += " ALERT_DIALOG"; break; |
| 56 case ROLE_ANNOTATION: result += " ANNOTATION"; break; |
| 57 case ROLE_APPLICATION: result += " APPLICATION"; break; |
| 58 case ROLE_ARTICLE: result += " ARTICLE"; break; |
| 59 case ROLE_BROWSER: result += " BROWSER"; break; |
| 60 case ROLE_BUSY_INDICATOR: result += " BUSY_INDICATOR"; break; |
| 61 case ROLE_BUTTON: result += " BUTTON"; break; |
| 62 case ROLE_CELL: result += " CELL"; break; |
| 63 case ROLE_CHECKBOX: result += " CHECKBOX"; break; |
| 64 case ROLE_COLOR_WELL: result += " COLOR_WELL"; break; |
| 65 case ROLE_COLUMN: result += " COLUMN"; break; |
| 66 case ROLE_COLUMN_HEADER: result += " COLUMN_HEADER"; break; |
| 67 case ROLE_COMBO_BOX: result += " COMBO_BOX"; break; |
| 68 case ROLE_DEFINITION_LIST_DEFINITION: result += " DL_DEFINITION"; break; |
| 69 case ROLE_DEFINITION_LIST_TERM: result += " DL_TERM"; break; |
| 70 case ROLE_DIALOG: result += " DIALOG"; break; |
| 71 case ROLE_DIRECTORY: result += " DIRECTORY"; break; |
| 72 case ROLE_DISCLOSURE_TRIANGLE: result += " DISCLOSURE_TRIANGLE"; break; |
| 73 case ROLE_DOCUMENT: result += " DOCUMENT"; break; |
| 74 case ROLE_DRAWER: result += " DRAWER"; break; |
| 75 case ROLE_EDITABLE_TEXT: result += " EDITABLE_TEXT"; break; |
| 76 case ROLE_GRID: result += " GRID"; break; |
| 77 case ROLE_GROUP: result += " GROUP"; break; |
| 78 case ROLE_GROW_AREA: result += " GROW_AREA"; break; |
| 79 case ROLE_HEADING: result += " HEADING"; break; |
| 80 case ROLE_HELP_TAG: result += " HELP_TAG"; break; |
| 81 case ROLE_IGNORED: result += " IGNORED"; break; |
| 82 case ROLE_IMAGE: result += " IMAGE"; break; |
| 83 case ROLE_IMAGE_MAP: result += " IMAGE_MAP"; break; |
| 84 case ROLE_IMAGE_MAP_LINK: result += " IMAGE_MAP_LINK"; break; |
| 85 case ROLE_INCREMENTOR: result += " INCREMENTOR"; break; |
| 86 case ROLE_LANDMARK_APPLICATION: result += " L_APPLICATION"; break; |
| 87 case ROLE_LANDMARK_BANNER: result += " L_BANNER"; break; |
| 88 case ROLE_LANDMARK_COMPLEMENTARY: result += " L_COMPLEMENTARY"; break; |
| 89 case ROLE_LANDMARK_CONTENTINFO: result += " L_CONTENTINFO"; break; |
| 90 case ROLE_LANDMARK_MAIN: result += " L_MAIN"; break; |
| 91 case ROLE_LANDMARK_NAVIGATION: result += " L_NAVIGATION"; break; |
| 92 case ROLE_LANDMARK_SEARCH: result += " L_SEARCH"; break; |
| 93 case ROLE_LINK: result += " LINK"; break; |
| 94 case ROLE_LIST: result += " LIST"; break; |
| 95 case ROLE_LISTBOX: result += " LISTBOX"; break; |
| 96 case ROLE_LISTBOX_OPTION: result += " LISTBOX_OPTION"; break; |
| 97 case ROLE_LIST_ITEM: result += " LIST_ITEM"; break; |
| 98 case ROLE_LIST_MARKER: result += " LIST_MARKER"; break; |
| 99 case ROLE_LOG: result += " LOG"; break; |
| 100 case ROLE_MARQUEE: result += " MARQUEE"; break; |
| 101 case ROLE_MATH: result += " MATH"; break; |
| 102 case ROLE_MATTE: result += " MATTE"; break; |
| 103 case ROLE_MENU: result += " MENU"; break; |
| 104 case ROLE_MENU_BAR: result += " MENU_BAR"; break; |
| 105 case ROLE_MENU_BUTTON: result += " MENU_BUTTON"; break; |
| 106 case ROLE_MENU_ITEM: result += " MENU_ITEM"; break; |
| 107 case ROLE_MENU_LIST_OPTION: result += " MENU_LIST_OPTION"; break; |
| 108 case ROLE_MENU_LIST_POPUP: result += " MENU_LIST_POPUP"; break; |
| 109 case ROLE_NOTE: result += " NOTE"; break; |
| 110 case ROLE_OUTLINE: result += " OUTLINE"; break; |
| 111 case ROLE_POPUP_BUTTON: result += " POPUP_BUTTON"; break; |
| 112 case ROLE_PROGRESS_INDICATOR: result += " PROGRESS_INDICATOR"; break; |
| 113 case ROLE_RADIO_BUTTON: result += " RADIO_BUTTON"; break; |
| 114 case ROLE_RADIO_GROUP: result += " RADIO_GROUP"; break; |
| 115 case ROLE_REGION: result += " REGION"; break; |
| 116 case ROLE_ROOT_WEB_AREA: result += " ROOT_WEB_AREA"; break; |
| 117 case ROLE_ROW: result += " ROW"; break; |
| 118 case ROLE_ROW_HEADER: result += " ROW_HEADER"; break; |
| 119 case ROLE_RULER: result += " RULER"; break; |
| 120 case ROLE_RULER_MARKER: result += " RULER_MARKER"; break; |
| 121 case ROLE_SCROLLAREA: result += " SCROLLAREA"; break; |
| 122 case ROLE_SCROLLBAR: result += " SCROLLBAR"; break; |
| 123 case ROLE_SHEET: result += " SHEET"; break; |
| 124 case ROLE_SLIDER: result += " SLIDER"; break; |
| 125 case ROLE_SLIDER_THUMB: result += " SLIDER_THUMB"; break; |
| 126 case ROLE_SPLITTER: result += " SPLITTER"; break; |
| 127 case ROLE_SPLIT_GROUP: result += " SPLIT_GROUP"; break; |
| 128 case ROLE_STATIC_TEXT: result += " STATIC_TEXT"; break; |
| 129 case ROLE_STATUS: result += " STATUS"; break; |
| 130 case ROLE_SYSTEM_WIDE: result += " SYSTEM_WIDE"; break; |
| 131 case ROLE_TAB: result += " TAB"; break; |
| 132 case ROLE_TABLE: result += " TABLE"; break; |
| 133 case ROLE_TABLE_HEADER_CONTAINER: result += " TABLE_HDR_CONTAINER"; break; |
| 134 case ROLE_TAB_GROUP_UNUSED: result += " TAB_GROUP_UNUSED"; break; |
| 135 case ROLE_TAB_LIST: result += " TAB_LIST"; break; |
| 136 case ROLE_TAB_PANEL: result += " TAB_PANEL"; break; |
| 137 case ROLE_TEXTAREA: result += " TEXTAREA"; break; |
| 138 case ROLE_TEXT_FIELD: result += " TEXT_FIELD"; break; |
| 139 case ROLE_TIMER: result += " TIMER"; break; |
| 140 case ROLE_TOOLBAR: result += " TOOLBAR"; break; |
| 141 case ROLE_TOOLTIP: result += " TOOLTIP"; break; |
| 142 case ROLE_TREE: result += " TREE"; break; |
| 143 case ROLE_TREE_GRID: result += " TREE_GRID"; break; |
| 144 case ROLE_TREE_ITEM: result += " TREE_ITEM"; break; |
| 145 case ROLE_UNKNOWN: result += " UNKNOWN"; break; |
| 146 case ROLE_VALUE_INDICATOR: result += " VALUE_INDICATOR"; break; |
| 147 case ROLE_WEBCORE_LINK: result += " WEBCORE_LINK"; break; |
| 148 case ROLE_WEB_AREA: result += " WEB_AREA"; break; |
| 149 case ROLE_WINDOW: result += " WINDOW"; break; |
| 150 default: |
| 151 assert(false); |
| 152 } |
| 153 |
| 154 if (state & (1 << STATE_BUSY)) |
| 155 result += " BUSY"; |
| 156 if (state & (1 << STATE_CHECKED)) |
| 157 result += " CHECKED"; |
| 158 if (state & (1 << STATE_COLLAPSED)) |
| 159 result += " COLLAPSED"; |
| 160 if (state & (1 << STATE_EXPANDED)) |
| 161 result += " EXPANDED"; |
| 162 if (state & (1 << STATE_FOCUSABLE)) |
| 163 result += " FOCUSABLE"; |
| 164 if (state & (1 << STATE_FOCUSED)) |
| 165 result += " FOCUSED"; |
| 166 if (state & (1 << STATE_HASPOPUP)) |
| 167 result += " HASPOPUP"; |
| 168 if (state & (1 << STATE_HOTTRACKED)) |
| 169 result += " HOTTRACKED"; |
| 170 if (state & (1 << STATE_INDETERMINATE)) |
| 171 result += " INDETERMINATE"; |
| 172 if (state & (1 << STATE_INVISIBLE)) |
| 173 result += " INVISIBLE"; |
| 174 if (state & (1 << STATE_LINKED)) |
| 175 result += " LINKED"; |
| 176 if (state & (1 << STATE_MULTISELECTABLE)) |
| 177 result += " MULTISELECTABLE"; |
| 178 if (state & (1 << STATE_OFFSCREEN)) |
| 179 result += " OFFSCREEN"; |
| 180 if (state & (1 << STATE_PRESSED)) |
| 181 result += " PRESSED"; |
| 182 if (state & (1 << STATE_PROTECTED)) |
| 183 result += " PROTECTED"; |
| 184 if (state & (1 << STATE_READONLY)) |
| 185 result += " READONLY"; |
| 186 if (state & (1 << STATE_REQUIRED)) |
| 187 result += " REQUIRED"; |
| 188 if (state & (1 << STATE_SELECTABLE)) |
| 189 result += " SELECTABLE"; |
| 190 if (state & (1 << STATE_SELECTED)) |
| 191 result += " SELECTED"; |
| 192 if (state & (1 << STATE_TRAVERSED)) |
| 193 result += " TRAVERSED"; |
| 194 if (state & (1 << STATE_UNAVAILABLE)) |
| 195 result += " UNAVAILABLE"; |
| 196 if (state & (1 << STATE_VERTICAL)) |
| 197 result += " VERTICAL"; |
| 198 if (state & (1 << STATE_VISITED)) |
| 199 result += " VISITED"; |
| 200 |
| 201 std::string tmp = UTF16ToUTF8(name); |
| 202 RemoveChars(tmp, "\n", &tmp); |
| 203 if (!tmp.empty()) |
| 204 result += " name=" + tmp; |
| 205 |
| 206 tmp = UTF16ToUTF8(value); |
| 207 RemoveChars(tmp, "\n", &tmp); |
| 208 if (!tmp.empty()) |
| 209 result += " value=" + tmp; |
| 210 |
| 211 result += " (" + IntToString(location.x()) + ", " + |
| 212 IntToString(location.y()) + ")-(" + |
| 213 IntToString(location.width()) + ", " + |
| 214 IntToString(location.height()) + ")"; |
| 215 |
| 216 for (std::map<IntAttribute, int32>::const_iterator iter = |
| 217 int_attributes.begin(); |
| 218 iter != int_attributes.end(); |
| 219 ++iter) { |
| 220 std::string value = IntToString(iter->second); |
| 221 switch (iter->first) { |
| 222 case ATTR_SCROLL_X: |
| 223 result += " scroll_x=" + value; |
| 224 break; |
| 225 case ATTR_SCROLL_X_MIN: |
| 226 result += " scroll_x_min=" + value; |
| 227 break; |
| 228 case ATTR_SCROLL_X_MAX: |
| 229 result += " scroll_x_max=" + value; |
| 230 break; |
| 231 case ATTR_SCROLL_Y: |
| 232 result += " scroll_y=" + value; |
| 233 break; |
| 234 case ATTR_SCROLL_Y_MIN: |
| 235 result += " scroll_y_min=" + value; |
| 236 break; |
| 237 case ATTR_SCROLL_Y_MAX: |
| 238 result += " scroll_y_max=" + value; |
| 239 break; |
| 240 case ATTR_HIERARCHICAL_LEVEL: |
| 241 result += " level=" + value; |
| 242 break; |
| 243 case ATTR_TEXT_SEL_START: |
| 244 result += " sel_start=" + value; |
| 245 break; |
| 246 case ATTR_TEXT_SEL_END: |
| 247 result += " sel_end=" + value; |
| 248 break; |
| 249 case ATTR_TABLE_ROW_COUNT: |
| 250 result += " rows=" + value; |
| 251 break; |
| 252 case ATTR_TABLE_COLUMN_COUNT: |
| 253 result += " cols=" + value; |
| 254 break; |
| 255 case ATTR_TABLE_CELL_COLUMN_INDEX: |
| 256 result += " col=" + value; |
| 257 break; |
| 258 case ATTR_TABLE_CELL_ROW_INDEX: |
| 259 result += " row=" + value; |
| 260 break; |
| 261 case ATTR_TABLE_CELL_COLUMN_SPAN: |
| 262 result += " colspan=" + value; |
| 263 break; |
| 264 case ATTR_TABLE_CELL_ROW_SPAN: |
| 265 result += " rowspan=" + value; |
| 266 break; |
| 267 case ATTR_TITLE_UI_ELEMENT: |
| 268 result += " title_elem=" + value; |
| 269 break; |
| 270 } |
| 271 } |
| 272 |
| 273 for (std::map<StringAttribute, string16>::const_iterator iter = |
| 274 string_attributes.begin(); |
| 275 iter != string_attributes.end(); |
| 276 ++iter) { |
| 277 std::string value = UTF16ToUTF8(iter->second); |
| 278 switch (iter->first) { |
| 279 case ATTR_DOC_URL: |
| 280 result += " doc_url=" + value; |
| 281 break; |
| 282 case ATTR_DOC_TITLE: |
| 283 result += " doc_title=" + value; |
| 284 break; |
| 285 case ATTR_DOC_MIMETYPE: |
| 286 result += " doc_mimetype=" + value; |
| 287 break; |
| 288 case ATTR_DOC_DOCTYPE: |
| 289 result += " doc_doctype=" + value; |
| 290 break; |
| 291 case ATTR_ACCESS_KEY: |
| 292 result += " access_key=" + value; |
| 293 break; |
| 294 case ATTR_ACTION: |
| 295 result += " action=" + value; |
| 296 break; |
| 297 case ATTR_DESCRIPTION: |
| 298 result += " description=" + value; |
| 299 break; |
| 300 case ATTR_DISPLAY: |
| 301 result += " display=" + value; |
| 302 break; |
| 303 case ATTR_HELP: |
| 304 result += " help=" + value; |
| 305 break; |
| 306 case ATTR_HTML_TAG: |
| 307 result += " html_tag=" + value; |
| 308 break; |
| 309 case ATTR_LIVE_RELEVANT: |
| 310 result += " relevant=" + value; |
| 311 break; |
| 312 case ATTR_LIVE_STATUS: |
| 313 result += " live=" + value; |
| 314 break; |
| 315 case ATTR_CONTAINER_LIVE_RELEVANT: |
| 316 result += " container_relevant=" + value; |
| 317 break; |
| 318 case ATTR_CONTAINER_LIVE_STATUS: |
| 319 result += " container_live=" + value; |
| 320 break; |
| 321 case ATTR_ROLE: |
| 322 result += " role=" + value; |
| 323 break; |
| 324 case ATTR_SHORTCUT: |
| 325 result += " shortcut=" + value; |
| 326 break; |
| 327 case ATTR_URL: |
| 328 result += " url=" + value; |
| 329 break; |
| 330 } |
| 331 } |
| 332 |
| 333 for (std::map<FloatAttribute, float>::const_iterator iter = |
| 334 float_attributes.begin(); |
| 335 iter != float_attributes.end(); |
| 336 ++iter) { |
| 337 std::string value = DoubleToString(iter->second); |
| 338 switch (iter->first) { |
| 339 case ATTR_DOC_LOADING_PROGRESS: |
| 340 result += " doc_progress=" + value; |
| 341 break; |
| 342 case ATTR_VALUE_FOR_RANGE: |
| 343 result += " value_for_range=" + value; |
| 344 break; |
| 345 case ATTR_MAX_VALUE_FOR_RANGE: |
| 346 result += " max_value=" + value; |
| 347 break; |
| 348 case ATTR_MIN_VALUE_FOR_RANGE: |
| 349 result += " min_value=" + value; |
| 350 break; |
| 351 } |
| 352 } |
| 353 |
| 354 for (std::map<BoolAttribute, bool>::const_iterator iter = |
| 355 bool_attributes.begin(); |
| 356 iter != bool_attributes.end(); |
| 357 ++iter) { |
| 358 std::string value = iter->second ? "true" : "false"; |
| 359 switch (iter->first) { |
| 360 case ATTR_DOC_LOADED: |
| 361 result += " doc_loaded=" + value; |
| 362 break; |
| 363 case ATTR_BUTTON_MIXED: |
| 364 result += " mixed=" + value; |
| 365 break; |
| 366 case ATTR_LIVE_ATOMIC: |
| 367 result += " atomic=" + value; |
| 368 break; |
| 369 case ATTR_LIVE_BUSY: |
| 370 result += " busy=" + value; |
| 371 break; |
| 372 case ATTR_CONTAINER_LIVE_ATOMIC: |
| 373 result += " container_atomic=" + value; |
| 374 break; |
| 375 case ATTR_CONTAINER_LIVE_BUSY: |
| 376 result += " container_busy=" + value; |
| 377 break; |
| 378 case ATTR_ARIA_READONLY: |
| 379 result += " aria_readonly=" + value; |
| 380 break; |
| 381 case ATTR_CAN_SET_VALUE: |
| 382 result += " can_set_value=" + value; |
| 383 break; |
| 384 } |
| 385 } |
| 386 |
| 387 if (!children.empty()) |
| 388 result += " children=" + IntToString(children.size()); |
| 389 |
| 390 if (!indirect_child_ids.empty()) |
| 391 result += " indirect_child_ids=" + IntVectorToString(indirect_child_ids); |
| 392 |
| 393 if (!line_breaks.empty()) |
| 394 result += " line_breaks=" + IntVectorToString(line_breaks); |
| 395 |
| 396 if (!cell_ids.empty()) |
| 397 result += " cell_ids=" + IntVectorToString(cell_ids); |
| 398 |
| 399 if (recursive) { |
| 400 result += "\n"; |
| 401 ++indent; |
| 402 for (size_t i = 0; i < children.size(); ++i) |
| 403 result += children[i].DebugString(true); |
| 404 --indent; |
| 405 } |
| 406 |
| 407 return result; |
| 408 } |
| 409 #endif // ifndef NDEBUG |
| 410 |
| 411 } // namespace content |
OLD | NEW |