// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "content/browser/accessibility/accessibility_tree_formatter_utils_win.h" #include #include #include #include "base/memory/singleton.h" #include "base/strings/string_util.h" #include "third_party/iaccessible2/ia2_api_all.h" namespace content { namespace { class AccessibilityRoleStateMap { public: static AccessibilityRoleStateMap* GetInstance(); std::map ia_role_string_map; std::map ia2_role_string_map; std::map ia_state_string_map; std::map ia2_state_string_map; private: AccessibilityRoleStateMap(); virtual ~AccessibilityRoleStateMap() {} friend struct DefaultSingletonTraits; DISALLOW_COPY_AND_ASSIGN(AccessibilityRoleStateMap); }; // static AccessibilityRoleStateMap* AccessibilityRoleStateMap::GetInstance() { return Singleton >::get(); } AccessibilityRoleStateMap::AccessibilityRoleStateMap() { // Convenience macros for generating readable strings. #define IA_ROLE_MAP(x) ia_role_string_map[x] = L#x; \ ia2_role_string_map[x] = L#x; #define IA2_ROLE_MAP(x) ia2_role_string_map[x] = L#x; #define IA_STATE_MAP(x) ia_state_string_map[STATE_SYSTEM_##x] = L#x; #define IA2_STATE_MAP(x) ia2_state_string_map[x] = L#x; // MSAA / IAccessible roles. Each one of these is also a valid // IAccessible2 role, the IA_ROLE_MAP macro adds it to both. IA_ROLE_MAP(ROLE_SYSTEM_ALERT) IA_ROLE_MAP(ROLE_SYSTEM_ANIMATION) IA_ROLE_MAP(ROLE_SYSTEM_APPLICATION) IA_ROLE_MAP(ROLE_SYSTEM_BORDER) IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWN) IA_ROLE_MAP(ROLE_SYSTEM_BUTTONDROPDOWNGRID) IA_ROLE_MAP(ROLE_SYSTEM_BUTTONMENU) IA_ROLE_MAP(ROLE_SYSTEM_CARET) IA_ROLE_MAP(ROLE_SYSTEM_CELL) IA_ROLE_MAP(ROLE_SYSTEM_CHARACTER) IA_ROLE_MAP(ROLE_SYSTEM_CHART) IA_ROLE_MAP(ROLE_SYSTEM_CHECKBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_CLIENT) IA_ROLE_MAP(ROLE_SYSTEM_CLOCK) IA_ROLE_MAP(ROLE_SYSTEM_COLUMN) IA_ROLE_MAP(ROLE_SYSTEM_COLUMNHEADER) IA_ROLE_MAP(ROLE_SYSTEM_COMBOBOX) IA_ROLE_MAP(ROLE_SYSTEM_CURSOR) IA_ROLE_MAP(ROLE_SYSTEM_DIAGRAM) IA_ROLE_MAP(ROLE_SYSTEM_DIAL) IA_ROLE_MAP(ROLE_SYSTEM_DIALOG) IA_ROLE_MAP(ROLE_SYSTEM_DOCUMENT) IA_ROLE_MAP(ROLE_SYSTEM_DROPLIST) IA_ROLE_MAP(ROLE_SYSTEM_EQUATION) IA_ROLE_MAP(ROLE_SYSTEM_GRAPHIC) IA_ROLE_MAP(ROLE_SYSTEM_GRIP) IA_ROLE_MAP(ROLE_SYSTEM_GROUPING) IA_ROLE_MAP(ROLE_SYSTEM_HELPBALLOON) IA_ROLE_MAP(ROLE_SYSTEM_HOTKEYFIELD) IA_ROLE_MAP(ROLE_SYSTEM_INDICATOR) IA_ROLE_MAP(ROLE_SYSTEM_IPADDRESS) IA_ROLE_MAP(ROLE_SYSTEM_LINK) IA_ROLE_MAP(ROLE_SYSTEM_LIST) IA_ROLE_MAP(ROLE_SYSTEM_LISTITEM) IA_ROLE_MAP(ROLE_SYSTEM_MENUBAR) IA_ROLE_MAP(ROLE_SYSTEM_MENUITEM) IA_ROLE_MAP(ROLE_SYSTEM_MENUPOPUP) IA_ROLE_MAP(ROLE_SYSTEM_OUTLINE) IA_ROLE_MAP(ROLE_SYSTEM_OUTLINEBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_OUTLINEITEM) IA_ROLE_MAP(ROLE_SYSTEM_PAGETAB) IA_ROLE_MAP(ROLE_SYSTEM_PAGETABLIST) IA_ROLE_MAP(ROLE_SYSTEM_PANE) IA_ROLE_MAP(ROLE_SYSTEM_PROGRESSBAR) IA_ROLE_MAP(ROLE_SYSTEM_PROPERTYPAGE) IA_ROLE_MAP(ROLE_SYSTEM_PUSHBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_RADIOBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_ROW) IA_ROLE_MAP(ROLE_SYSTEM_ROWHEADER) IA_ROLE_MAP(ROLE_SYSTEM_SCROLLBAR) IA_ROLE_MAP(ROLE_SYSTEM_SEPARATOR) IA_ROLE_MAP(ROLE_SYSTEM_SLIDER) IA_ROLE_MAP(ROLE_SYSTEM_SOUND) IA_ROLE_MAP(ROLE_SYSTEM_SPINBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_SPLITBUTTON) IA_ROLE_MAP(ROLE_SYSTEM_STATICTEXT) IA_ROLE_MAP(ROLE_SYSTEM_STATUSBAR) IA_ROLE_MAP(ROLE_SYSTEM_TABLE) IA_ROLE_MAP(ROLE_SYSTEM_TEXT) IA_ROLE_MAP(ROLE_SYSTEM_TITLEBAR) IA_ROLE_MAP(ROLE_SYSTEM_TOOLBAR) IA_ROLE_MAP(ROLE_SYSTEM_TOOLTIP) IA_ROLE_MAP(ROLE_SYSTEM_WHITESPACE) IA_ROLE_MAP(ROLE_SYSTEM_WINDOW) // IAccessible2 roles. IA2_ROLE_MAP(IA2_ROLE_CANVAS) IA2_ROLE_MAP(IA2_ROLE_CAPTION) IA2_ROLE_MAP(IA2_ROLE_CHECK_MENU_ITEM) IA2_ROLE_MAP(IA2_ROLE_COLOR_CHOOSER) IA2_ROLE_MAP(IA2_ROLE_DATE_EDITOR) IA2_ROLE_MAP(IA2_ROLE_DESKTOP_ICON) IA2_ROLE_MAP(IA2_ROLE_DESKTOP_PANE) IA2_ROLE_MAP(IA2_ROLE_DIRECTORY_PANE) IA2_ROLE_MAP(IA2_ROLE_EDITBAR) IA2_ROLE_MAP(IA2_ROLE_EMBEDDED_OBJECT) IA2_ROLE_MAP(IA2_ROLE_ENDNOTE) IA2_ROLE_MAP(IA2_ROLE_FILE_CHOOSER) IA2_ROLE_MAP(IA2_ROLE_FONT_CHOOSER) IA2_ROLE_MAP(IA2_ROLE_FOOTER) IA2_ROLE_MAP(IA2_ROLE_FOOTNOTE) IA2_ROLE_MAP(IA2_ROLE_FORM) IA2_ROLE_MAP(IA2_ROLE_FRAME) IA2_ROLE_MAP(IA2_ROLE_GLASS_PANE) IA2_ROLE_MAP(IA2_ROLE_HEADER) IA2_ROLE_MAP(IA2_ROLE_HEADING) IA2_ROLE_MAP(IA2_ROLE_ICON) IA2_ROLE_MAP(IA2_ROLE_IMAGE_MAP) IA2_ROLE_MAP(IA2_ROLE_INPUT_METHOD_WINDOW) IA2_ROLE_MAP(IA2_ROLE_INTERNAL_FRAME) IA2_ROLE_MAP(IA2_ROLE_LABEL) IA2_ROLE_MAP(IA2_ROLE_LAYERED_PANE) IA2_ROLE_MAP(IA2_ROLE_NOTE) IA2_ROLE_MAP(IA2_ROLE_OPTION_PANE) IA2_ROLE_MAP(IA2_ROLE_PAGE) IA2_ROLE_MAP(IA2_ROLE_PARAGRAPH) IA2_ROLE_MAP(IA2_ROLE_RADIO_MENU_ITEM) IA2_ROLE_MAP(IA2_ROLE_REDUNDANT_OBJECT) IA2_ROLE_MAP(IA2_ROLE_ROOT_PANE) IA2_ROLE_MAP(IA2_ROLE_RULER) IA2_ROLE_MAP(IA2_ROLE_SCROLL_PANE) IA2_ROLE_MAP(IA2_ROLE_SECTION) IA2_ROLE_MAP(IA2_ROLE_SHAPE) IA2_ROLE_MAP(IA2_ROLE_SPLIT_PANE) IA2_ROLE_MAP(IA2_ROLE_TEAR_OFF_MENU) IA2_ROLE_MAP(IA2_ROLE_TERMINAL) IA2_ROLE_MAP(IA2_ROLE_TEXT_FRAME) IA2_ROLE_MAP(IA2_ROLE_TOGGLE_BUTTON) IA2_ROLE_MAP(IA2_ROLE_UNKNOWN) IA2_ROLE_MAP(IA2_ROLE_VIEW_PORT) // MSAA / IAccessible states. Unlike roles, these are not also IA2 states. IA_STATE_MAP(ALERT_HIGH) IA_STATE_MAP(ALERT_LOW) IA_STATE_MAP(ALERT_MEDIUM) IA_STATE_MAP(ANIMATED) IA_STATE_MAP(BUSY) IA_STATE_MAP(CHECKED) IA_STATE_MAP(COLLAPSED) IA_STATE_MAP(DEFAULT) IA_STATE_MAP(EXPANDED) IA_STATE_MAP(EXTSELECTABLE) IA_STATE_MAP(FLOATING) IA_STATE_MAP(FOCUSABLE) IA_STATE_MAP(FOCUSED) IA_STATE_MAP(HASPOPUP) IA_STATE_MAP(HOTTRACKED) IA_STATE_MAP(INVISIBLE) IA_STATE_MAP(LINKED) IA_STATE_MAP(MARQUEED) IA_STATE_MAP(MIXED) IA_STATE_MAP(MOVEABLE) IA_STATE_MAP(MULTISELECTABLE) IA_STATE_MAP(OFFSCREEN) IA_STATE_MAP(PRESSED) IA_STATE_MAP(PROTECTED) IA_STATE_MAP(READONLY) IA_STATE_MAP(SELECTABLE) IA_STATE_MAP(SELECTED) IA_STATE_MAP(SELFVOICING) IA_STATE_MAP(SIZEABLE) IA_STATE_MAP(TRAVERSED) IA_STATE_MAP(UNAVAILABLE) // IAccessible2 states. IA2_STATE_MAP(IA2_STATE_ACTIVE) IA2_STATE_MAP(IA2_STATE_ARMED) IA2_STATE_MAP(IA2_STATE_DEFUNCT) IA2_STATE_MAP(IA2_STATE_EDITABLE) IA2_STATE_MAP(IA2_STATE_ICONIFIED) IA2_STATE_MAP(IA2_STATE_INVALID_ENTRY) IA2_STATE_MAP(IA2_STATE_MANAGES_DESCENDANTS) IA2_STATE_MAP(IA2_STATE_MODAL) IA2_STATE_MAP(IA2_STATE_MULTI_LINE) IA2_STATE_MAP(IA2_STATE_REQUIRED) IA2_STATE_MAP(IA2_STATE_SELECTABLE_TEXT) IA2_STATE_MAP(IA2_STATE_SINGLE_LINE) IA2_STATE_MAP(IA2_STATE_STALE) IA2_STATE_MAP(IA2_STATE_SUPPORTS_AUTOCOMPLETION) IA2_STATE_MAP(IA2_STATE_TRANSIENT) // Untested states include those that would be repeated on nearly every node, // or would vary based on window size. // IA2_STATE_MAP(IA2_STATE_HORIZONTAL) // Untested. // IA2_STATE_MAP(IA2_STATE_OPAQUE) // Untested. // IA2_STATE_MAP(IA2_STATE_VERTICAL) // Untested. } } // namespace. string16 IAccessibleRoleToString(int32 ia_role) { return AccessibilityRoleStateMap::GetInstance()->ia_role_string_map[ia_role]; } string16 IAccessible2RoleToString(int32 ia_role) { return AccessibilityRoleStateMap::GetInstance()->ia2_role_string_map[ia_role]; } void IAccessibleStateToStringVector(int32 ia_state, std::vector* result) { const std::map& state_string_map = AccessibilityRoleStateMap::GetInstance()->ia_state_string_map; std::map::const_iterator it; for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { if (it->first & ia_state) result->push_back(it->second); } } string16 IAccessibleStateToString(int32 ia_state) { std::vector strings; IAccessibleStateToStringVector(ia_state, &strings); return JoinString(strings, ','); } void IAccessible2StateToStringVector(int32 ia2_state, std::vector* result) { const std::map& state_string_map = AccessibilityRoleStateMap::GetInstance()->ia2_state_string_map; std::map::const_iterator it; for (it = state_string_map.begin(); it != state_string_map.end(); ++it) { if (it->first & ia2_state) result->push_back(it->second); } } string16 IAccessible2StateToString(int32 ia2_state) { std::vector strings; IAccessible2StateToStringVector(ia2_state, &strings); return JoinString(strings, ','); } } // namespace content