Index: content/browser/accessibility/browser_accessibility_android.cc |
diff --git a/content/browser/accessibility/browser_accessibility_android.cc b/content/browser/accessibility/browser_accessibility_android.cc |
index 79a1f18a36957566cd04a9f4367fa63e7860e6bc..ac52699633fa46940e651e17d356c36bef3d26fb 100644 |
--- a/content/browser/accessibility/browser_accessibility_android.cc |
+++ b/content/browser/accessibility/browser_accessibility_android.cc |
@@ -5,11 +5,14 @@ |
#include "content/browser/accessibility/browser_accessibility_android.h" |
#include "base/i18n/break_iterator.h" |
+#include "base/strings/string_number_conversions.h" |
#include "base/strings/string_util.h" |
#include "base/strings/stringprintf.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/app/strings/grit/content_strings.h" |
#include "content/browser/accessibility/browser_accessibility_manager_android.h" |
#include "content/common/accessibility_messages.h" |
+#include "content/public/common/content_client.h" |
namespace { |
@@ -407,6 +410,412 @@ base::string16 BrowserAccessibilityAndroid::GetText() const { |
return text; |
} |
+base::string16 BrowserAccessibilityAndroid::GetRoleDescription() const { |
+ content::ContentClient* content_client = content::GetContentClient(); |
+ |
+ // As a special case, if we have a heading level return a string like |
+ // "heading level 1", etc. |
+ if (GetRole() == ui::AX_ROLE_HEADING) { |
+ int level = GetIntAttribute(ui::AX_ATTR_HIERARCHICAL_LEVEL); |
+ if (level >= 1 && level <= 6) { |
+ std::vector<base::string16> values; |
+ values.push_back(base::IntToString16(level)); |
+ return base::ReplaceStringPlaceholders( |
+ content_client->GetLocalizedString(IDS_AX_ROLE_HEADING_WITH_LEVEL), |
+ values, nullptr); |
+ } |
+ } |
+ |
+ int message_id = -1; |
+ switch (GetRole()) { |
+ case ui::AX_ROLE_ABBR: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_ALERT_DIALOG: |
+ message_id = IDS_AX_ROLE_ALERT_DIALOG; |
+ break; |
+ case ui::AX_ROLE_ALERT: |
+ message_id = IDS_AX_ROLE_ALERT; |
+ break; |
+ case ui::AX_ROLE_ANNOTATION: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_APPLICATION: |
+ message_id = IDS_AX_ROLE_APPLICATION; |
+ break; |
+ case ui::AX_ROLE_ARTICLE: |
+ message_id = IDS_AX_ROLE_ARTICLE; |
+ break; |
+ case ui::AX_ROLE_BANNER: |
+ message_id = IDS_AX_ROLE_BANNER; |
+ break; |
+ case ui::AX_ROLE_BLOCKQUOTE: |
+ message_id = IDS_AX_ROLE_BLOCKQUOTE; |
+ break; |
+ case ui::AX_ROLE_BUSY_INDICATOR: |
+ message_id = IDS_AX_ROLE_BUSY_INDICATOR; |
+ break; |
+ case ui::AX_ROLE_BUTTON: |
+ message_id = IDS_AX_ROLE_BUTTON; |
+ break; |
+ case ui::AX_ROLE_BUTTON_DROP_DOWN: |
+ message_id = IDS_AX_ROLE_BUTTON_DROP_DOWN; |
+ break; |
+ case ui::AX_ROLE_CANVAS: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_CAPTION: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_CELL: |
+ message_id = IDS_AX_ROLE_CELL; |
+ break; |
+ case ui::AX_ROLE_CHECK_BOX: |
+ message_id = IDS_AX_ROLE_CHECK_BOX; |
+ break; |
+ case ui::AX_ROLE_CLIENT: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_COLOR_WELL: |
+ message_id = IDS_AX_ROLE_COLOR_WELL; |
+ break; |
+ case ui::AX_ROLE_COLUMN_HEADER: |
+ message_id = IDS_AX_ROLE_COLUMN_HEADER; |
+ break; |
+ case ui::AX_ROLE_COLUMN: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_COMBO_BOX: |
+ message_id = IDS_AX_ROLE_COMBO_BOX; |
+ break; |
+ case ui::AX_ROLE_COMPLEMENTARY: |
+ message_id = IDS_AX_ROLE_COMPLEMENTARY; |
+ break; |
+ case ui::AX_ROLE_CONTENT_INFO: |
+ message_id = IDS_AX_ROLE_CONTENT_INFO; |
+ break; |
+ case ui::AX_ROLE_DATE: |
+ message_id = IDS_AX_ROLE_DATE; |
+ break; |
+ case ui::AX_ROLE_DATE_TIME: |
+ message_id = IDS_AX_ROLE_DATE_TIME; |
+ break; |
+ case ui::AX_ROLE_DEFINITION: |
+ message_id = IDS_AX_ROLE_DEFINITION; |
+ break; |
+ case ui::AX_ROLE_DESCRIPTION_LIST_DETAIL: |
+ message_id = IDS_AX_ROLE_DEFINITION; |
+ break; |
+ case ui::AX_ROLE_DESCRIPTION_LIST: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_DESCRIPTION_LIST_TERM: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_DESKTOP: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_DETAILS: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_DIALOG: |
+ message_id = IDS_AX_ROLE_DIALOG; |
+ break; |
+ case ui::AX_ROLE_DIRECTORY: |
+ message_id = IDS_AX_ROLE_DIRECTORY; |
+ break; |
+ case ui::AX_ROLE_DISCLOSURE_TRIANGLE: |
+ message_id = IDS_AX_ROLE_DISCLOSURE_TRIANGLE; |
+ break; |
+ case ui::AX_ROLE_DIV: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_DOCUMENT: |
+ message_id = IDS_AX_ROLE_DOCUMENT; |
+ break; |
+ case ui::AX_ROLE_EMBEDDED_OBJECT: |
+ message_id = IDS_AX_ROLE_EMBEDDED_OBJECT; |
+ break; |
+ case ui::AX_ROLE_FIGCAPTION: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_FIGURE: |
+ message_id = IDS_AX_ROLE_GRAPHIC; |
+ break; |
+ case ui::AX_ROLE_FOOTER: |
+ message_id = IDS_AX_ROLE_FOOTER; |
+ break; |
+ case ui::AX_ROLE_FORM: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_GRID: |
+ message_id = IDS_AX_ROLE_TABLE; |
+ break; |
+ case ui::AX_ROLE_GROUP: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_HEADING: |
+ // Note that code above this switch statement handles headings with |
+ // a level, returning a string like "heading level 1", etc. |
+ message_id = IDS_AX_ROLE_HEADING; |
+ break; |
+ case ui::AX_ROLE_IFRAME: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_IFRAME_PRESENTATIONAL: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_IGNORED: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_IMAGE_MAP_LINK: |
+ message_id = IDS_AX_ROLE_LINK; |
+ break; |
+ case ui::AX_ROLE_IMAGE_MAP: |
+ message_id = IDS_AX_ROLE_GRAPHIC; |
+ break; |
+ case ui::AX_ROLE_IMAGE: |
+ message_id = IDS_AX_ROLE_GRAPHIC; |
+ break; |
+ case ui::AX_ROLE_INLINE_TEXT_BOX: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_INPUT_TIME: |
+ message_id = IDS_AX_ROLE_INPUT_TIME; |
+ break; |
+ case ui::AX_ROLE_LABEL_TEXT: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LEGEND: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LINE_BREAK: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LINK: |
+ message_id = IDS_AX_ROLE_LINK; |
+ break; |
+ case ui::AX_ROLE_LIST_BOX_OPTION: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LIST_BOX: |
+ message_id = IDS_AX_ROLE_LIST_BOX; |
+ break; |
+ case ui::AX_ROLE_LIST_ITEM: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LIST_MARKER: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LIST: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LOCATION_BAR: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_LOG: |
+ message_id = IDS_AX_ROLE_LOG; |
+ break; |
+ case ui::AX_ROLE_MAIN: |
+ message_id = IDS_AX_ROLE_MAIN_CONTENT; |
+ break; |
+ case ui::AX_ROLE_MARK: |
+ message_id = IDS_AX_ROLE_MARK; |
+ break; |
+ case ui::AX_ROLE_MARQUEE: |
+ message_id = IDS_AX_ROLE_MARQUEE; |
+ break; |
+ case ui::AX_ROLE_MATH: |
+ message_id = IDS_AX_ROLE_MATH; |
+ break; |
+ case ui::AX_ROLE_MENU_BAR: |
+ message_id = IDS_AX_ROLE_MENU_BAR; |
+ break; |
+ case ui::AX_ROLE_MENU_BUTTON: |
+ message_id = IDS_AX_ROLE_MENU_BUTTON; |
+ break; |
+ case ui::AX_ROLE_MENU_ITEM: |
+ message_id = IDS_AX_ROLE_MENU_ITEM; |
+ break; |
+ case ui::AX_ROLE_MENU_ITEM_CHECK_BOX: |
+ message_id = IDS_AX_ROLE_CHECK_BOX; |
+ break; |
+ case ui::AX_ROLE_MENU_ITEM_RADIO: |
+ message_id = IDS_AX_ROLE_RADIO; |
+ break; |
+ case ui::AX_ROLE_MENU_LIST_OPTION: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_MENU_LIST_POPUP: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_MENU: |
+ message_id = IDS_AX_ROLE_MENU; |
+ break; |
+ case ui::AX_ROLE_METER: |
+ message_id = IDS_AX_ROLE_METER; |
+ break; |
+ case ui::AX_ROLE_NAVIGATION: |
+ message_id = IDS_AX_ROLE_NAVIGATIONAL_LINK; |
+ break; |
+ case ui::AX_ROLE_NOTE: |
+ message_id = IDS_AX_ROLE_NOTE; |
+ break; |
+ case ui::AX_ROLE_OUTLINE: |
+ message_id = IDS_AX_ROLE_OUTLINE; |
+ break; |
+ case ui::AX_ROLE_PANE: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_PARAGRAPH: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_POP_UP_BUTTON: |
+ message_id = IDS_AX_ROLE_POP_UP_BUTTON; |
+ break; |
+ case ui::AX_ROLE_PRE: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_PRESENTATIONAL: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_PROGRESS_INDICATOR: |
+ message_id = IDS_AX_ROLE_PROGRESS_INDICATOR; |
+ break; |
+ case ui::AX_ROLE_RADIO_BUTTON: |
+ message_id = IDS_AX_ROLE_RADIO; |
+ break; |
+ case ui::AX_ROLE_RADIO_GROUP: |
+ message_id = IDS_AX_ROLE_RADIO_GROUP; |
+ break; |
+ case ui::AX_ROLE_REGION: |
+ message_id = IDS_AX_ROLE_REGION; |
+ break; |
+ case ui::AX_ROLE_ROOT_WEB_AREA: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_ROW_HEADER: |
+ message_id = IDS_AX_ROLE_ROW_HEADER; |
+ break; |
+ case ui::AX_ROLE_ROW: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_RUBY: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_RULER: |
+ message_id = IDS_AX_ROLE_RULER; |
+ break; |
+ case ui::AX_ROLE_SVG_ROOT: |
+ message_id = IDS_AX_ROLE_GRAPHIC; |
+ break; |
+ case ui::AX_ROLE_SCROLL_AREA: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_SCROLL_BAR: |
+ message_id = IDS_AX_ROLE_SCROLL_BAR; |
+ break; |
+ case ui::AX_ROLE_SEAMLESS_WEB_AREA: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_SEARCH: |
+ message_id = IDS_AX_ROLE_SEARCH; |
+ break; |
+ case ui::AX_ROLE_SEARCH_BOX: |
+ message_id = IDS_AX_ROLE_SEARCH_BOX; |
+ break; |
+ case ui::AX_ROLE_SLIDER: |
+ message_id = IDS_AX_ROLE_SLIDER; |
+ break; |
+ case ui::AX_ROLE_SLIDER_THUMB: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_SPIN_BUTTON_PART: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_SPIN_BUTTON: |
+ message_id = IDS_AX_ROLE_SPIN_BUTTON; |
+ break; |
+ case ui::AX_ROLE_SPLITTER: |
+ message_id = IDS_AX_ROLE_SPLITTER; |
+ break; |
+ case ui::AX_ROLE_STATIC_TEXT: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_STATUS: |
+ message_id = IDS_AX_ROLE_STATUS; |
+ break; |
+ case ui::AX_ROLE_SWITCH: |
+ message_id = IDS_AX_ROLE_SWITCH; |
+ break; |
+ case ui::AX_ROLE_TAB_GROUP: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_TAB_LIST: |
+ message_id = IDS_AX_ROLE_TAB_LIST; |
+ break; |
+ case ui::AX_ROLE_TAB_PANEL: |
+ message_id = IDS_AX_ROLE_TAB_PANEL; |
+ break; |
+ case ui::AX_ROLE_TAB: |
+ message_id = IDS_AX_ROLE_TAB; |
+ break; |
+ case ui::AX_ROLE_TABLE_HEADER_CONTAINER: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_TABLE: |
+ message_id = IDS_AX_ROLE_TABLE; |
+ break; |
+ case ui::AX_ROLE_TEXT_FIELD: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_TIME: |
+ message_id = IDS_AX_ROLE_TIME; |
+ break; |
+ case ui::AX_ROLE_TIMER: |
+ message_id = IDS_AX_ROLE_TIMER; |
+ break; |
+ case ui::AX_ROLE_TITLE_BAR: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_TOGGLE_BUTTON: |
+ message_id = IDS_AX_ROLE_TOGGLE_BUTTON; |
+ break; |
+ case ui::AX_ROLE_TOOLBAR: |
+ message_id = IDS_AX_ROLE_TOOLBAR; |
+ break; |
+ case ui::AX_ROLE_TREE_GRID: |
+ message_id = IDS_AX_ROLE_TREE_GRID; |
+ break; |
+ case ui::AX_ROLE_TREE_ITEM: |
+ message_id = IDS_AX_ROLE_TREE_ITEM; |
+ break; |
+ case ui::AX_ROLE_TREE: |
+ message_id = IDS_AX_ROLE_TREE; |
+ break; |
+ case ui::AX_ROLE_UNKNOWN: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_TOOLTIP: |
+ message_id = IDS_AX_ROLE_TOOLTIP; |
+ break; |
+ case ui::AX_ROLE_WEB_AREA: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_WEB_VIEW: |
+ // No role description. |
+ break; |
+ case ui::AX_ROLE_WINDOW: |
+ // No role description. |
+ break; |
+ } |
+ |
+ if (message_id != -1) |
+ return content_client->GetLocalizedString(message_id); |
+ |
+ return base::string16(); |
+} |
+ |
int BrowserAccessibilityAndroid::GetItemIndex() const { |
int index = 0; |
switch (GetRole()) { |