blob: 04c6c27e1126086c534c0142c05a6282a999e5ed [file] [log] [blame]
// 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 <oleacc.h>
#include <uiautomation.h>
#include <map>
#include <string>
#include "base/memory/singleton.h"
#include "base/stl_util.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "third_party/iaccessible2/ia2_api_all.h"
namespace content {
namespace {
struct PlatformConstantToNameEntry {
int32_t value;
const char* name;
};
base::string16 GetNameForPlatformConstant(
const PlatformConstantToNameEntry table[],
size_t table_size,
int32_t value) {
for (size_t i = 0; i < table_size; ++i) {
auto& entry = table[i];
if (entry.value == value)
return base::ASCIIToUTF16(entry.name);
}
return L"";
}
struct HwndWithProcId {
HwndWithProcId(const base::ProcessId id) : pid(id), hwnd(nullptr) {}
const base::ProcessId pid;
HWND hwnd;
};
BOOL CALLBACK EnumWindowsProcPid(HWND hwnd, LPARAM lParam) {
DWORD process_id;
GetWindowThreadProcessId(hwnd, &process_id);
HwndWithProcId* hwnd_with_proc_id = (HwndWithProcId*)lParam;
if (process_id == static_cast<DWORD>(hwnd_with_proc_id->pid)) {
hwnd_with_proc_id->hwnd = hwnd;
return FALSE;
}
return TRUE;
}
} // namespace
#define QUOTE(X) \
{ X, #X }
CONTENT_EXPORT base::string16 IAccessibleRoleToString(int32_t ia_role) {
// MSAA / IAccessible roles. Each one of these is also a valid
// IAccessible2 role.
static const PlatformConstantToNameEntry ia_table[] = {
QUOTE(ROLE_SYSTEM_ALERT), QUOTE(ROLE_SYSTEM_ANIMATION),
QUOTE(ROLE_SYSTEM_APPLICATION), QUOTE(ROLE_SYSTEM_BORDER),
QUOTE(ROLE_SYSTEM_BUTTONDROPDOWN), QUOTE(ROLE_SYSTEM_BUTTONDROPDOWNGRID),
QUOTE(ROLE_SYSTEM_BUTTONMENU), QUOTE(ROLE_SYSTEM_CARET),
QUOTE(ROLE_SYSTEM_CELL), QUOTE(ROLE_SYSTEM_CHARACTER),
QUOTE(ROLE_SYSTEM_CHART), QUOTE(ROLE_SYSTEM_CHECKBUTTON),
QUOTE(ROLE_SYSTEM_CLIENT), QUOTE(ROLE_SYSTEM_CLOCK),
QUOTE(ROLE_SYSTEM_COLUMN), QUOTE(ROLE_SYSTEM_COLUMNHEADER),
QUOTE(ROLE_SYSTEM_COMBOBOX), QUOTE(ROLE_SYSTEM_CURSOR),
QUOTE(ROLE_SYSTEM_DIAGRAM), QUOTE(ROLE_SYSTEM_DIAL),
QUOTE(ROLE_SYSTEM_DIALOG), QUOTE(ROLE_SYSTEM_DOCUMENT),
QUOTE(ROLE_SYSTEM_DROPLIST), QUOTE(ROLE_SYSTEM_EQUATION),
QUOTE(ROLE_SYSTEM_GRAPHIC), QUOTE(ROLE_SYSTEM_GRIP),
QUOTE(ROLE_SYSTEM_GROUPING), QUOTE(ROLE_SYSTEM_HELPBALLOON),
QUOTE(ROLE_SYSTEM_HOTKEYFIELD), QUOTE(ROLE_SYSTEM_INDICATOR),
QUOTE(ROLE_SYSTEM_IPADDRESS), QUOTE(ROLE_SYSTEM_LINK),
QUOTE(ROLE_SYSTEM_LIST), QUOTE(ROLE_SYSTEM_LISTITEM),
QUOTE(ROLE_SYSTEM_MENUBAR), QUOTE(ROLE_SYSTEM_MENUITEM),
QUOTE(ROLE_SYSTEM_MENUPOPUP), QUOTE(ROLE_SYSTEM_OUTLINE),
QUOTE(ROLE_SYSTEM_OUTLINEBUTTON), QUOTE(ROLE_SYSTEM_OUTLINEITEM),
QUOTE(ROLE_SYSTEM_PAGETAB), QUOTE(ROLE_SYSTEM_PAGETABLIST),
QUOTE(ROLE_SYSTEM_PANE), QUOTE(ROLE_SYSTEM_PROGRESSBAR),
QUOTE(ROLE_SYSTEM_PROPERTYPAGE), QUOTE(ROLE_SYSTEM_PUSHBUTTON),
QUOTE(ROLE_SYSTEM_RADIOBUTTON), QUOTE(ROLE_SYSTEM_ROW),
QUOTE(ROLE_SYSTEM_ROWHEADER), QUOTE(ROLE_SYSTEM_SCROLLBAR),
QUOTE(ROLE_SYSTEM_SEPARATOR), QUOTE(ROLE_SYSTEM_SLIDER),
QUOTE(ROLE_SYSTEM_SOUND), QUOTE(ROLE_SYSTEM_SPINBUTTON),
QUOTE(ROLE_SYSTEM_SPLITBUTTON), QUOTE(ROLE_SYSTEM_STATICTEXT),
QUOTE(ROLE_SYSTEM_STATUSBAR), QUOTE(ROLE_SYSTEM_TABLE),
QUOTE(ROLE_SYSTEM_TEXT), QUOTE(ROLE_SYSTEM_TITLEBAR),
QUOTE(ROLE_SYSTEM_TOOLBAR), QUOTE(ROLE_SYSTEM_TOOLTIP),
QUOTE(ROLE_SYSTEM_WHITESPACE), QUOTE(ROLE_SYSTEM_WINDOW),
};
return GetNameForPlatformConstant(ia_table, base::size(ia_table), ia_role);
}
CONTENT_EXPORT base::string16 IAccessible2RoleToString(int32_t ia2_role) {
base::string16 result = IAccessibleRoleToString(ia2_role);
if (!result.empty())
return result;
static const PlatformConstantToNameEntry ia2_table[] = {
QUOTE(IA2_ROLE_CANVAS),
QUOTE(IA2_ROLE_CAPTION),
QUOTE(IA2_ROLE_CHECK_MENU_ITEM),
QUOTE(IA2_ROLE_COLOR_CHOOSER),
QUOTE(IA2_ROLE_DATE_EDITOR),
QUOTE(IA2_ROLE_DESKTOP_ICON),
QUOTE(IA2_ROLE_DESKTOP_PANE),
QUOTE(IA2_ROLE_DIRECTORY_PANE),
QUOTE(IA2_ROLE_EDITBAR),
QUOTE(IA2_ROLE_EMBEDDED_OBJECT),
QUOTE(IA2_ROLE_ENDNOTE),
QUOTE(IA2_ROLE_FILE_CHOOSER),
QUOTE(IA2_ROLE_FONT_CHOOSER),
QUOTE(IA2_ROLE_FOOTER),
QUOTE(IA2_ROLE_FOOTNOTE),
QUOTE(IA2_ROLE_FORM),
QUOTE(IA2_ROLE_FRAME),
QUOTE(IA2_ROLE_GLASS_PANE),
QUOTE(IA2_ROLE_HEADER),
QUOTE(IA2_ROLE_HEADING),
QUOTE(IA2_ROLE_ICON),
QUOTE(IA2_ROLE_IMAGE_MAP),
QUOTE(IA2_ROLE_INPUT_METHOD_WINDOW),
QUOTE(IA2_ROLE_INTERNAL_FRAME),
QUOTE(IA2_ROLE_LABEL),
QUOTE(IA2_ROLE_LAYERED_PANE),
QUOTE(IA2_ROLE_NOTE),
QUOTE(IA2_ROLE_OPTION_PANE),
QUOTE(IA2_ROLE_PAGE),
QUOTE(IA2_ROLE_PARAGRAPH),
QUOTE(IA2_ROLE_RADIO_MENU_ITEM),
QUOTE(IA2_ROLE_REDUNDANT_OBJECT),
QUOTE(IA2_ROLE_ROOT_PANE),
QUOTE(IA2_ROLE_RULER),
QUOTE(IA2_ROLE_SCROLL_PANE),
QUOTE(IA2_ROLE_SECTION),
QUOTE(IA2_ROLE_SHAPE),
QUOTE(IA2_ROLE_SPLIT_PANE),
QUOTE(IA2_ROLE_TEAR_OFF_MENU),
QUOTE(IA2_ROLE_TERMINAL),
QUOTE(IA2_ROLE_TEXT_FRAME),
QUOTE(IA2_ROLE_TOGGLE_BUTTON),
QUOTE(IA2_ROLE_UNKNOWN),
QUOTE(IA2_ROLE_VIEW_PORT),
QUOTE(IA2_ROLE_COMPLEMENTARY_CONTENT),
QUOTE(IA2_ROLE_LANDMARK),
QUOTE(IA2_ROLE_LEVEL_BAR),
QUOTE(IA2_ROLE_CONTENT_DELETION),
QUOTE(IA2_ROLE_CONTENT_INSERTION),
};
return GetNameForPlatformConstant(ia2_table, base::size(ia2_table), ia2_role);
}
CONTENT_EXPORT base::string16 AccessibilityEventToString(int32_t event) {
static const PlatformConstantToNameEntry event_table[] = {
QUOTE(EVENT_OBJECT_CREATE),
QUOTE(EVENT_OBJECT_DESTROY),
QUOTE(EVENT_OBJECT_SHOW),
QUOTE(EVENT_OBJECT_HIDE),
QUOTE(EVENT_OBJECT_REORDER),
QUOTE(EVENT_OBJECT_FOCUS),
QUOTE(EVENT_OBJECT_SELECTION),
QUOTE(EVENT_OBJECT_SELECTIONADD),
QUOTE(EVENT_OBJECT_SELECTIONREMOVE),
QUOTE(EVENT_OBJECT_SELECTIONWITHIN),
QUOTE(EVENT_OBJECT_STATECHANGE),
QUOTE(EVENT_OBJECT_LOCATIONCHANGE),
QUOTE(EVENT_OBJECT_NAMECHANGE),
QUOTE(EVENT_OBJECT_DESCRIPTIONCHANGE),
QUOTE(EVENT_OBJECT_VALUECHANGE),
QUOTE(EVENT_OBJECT_PARENTCHANGE),
QUOTE(EVENT_OBJECT_HELPCHANGE),
QUOTE(EVENT_OBJECT_DEFACTIONCHANGE),
QUOTE(EVENT_OBJECT_ACCELERATORCHANGE),
QUOTE(EVENT_OBJECT_INVOKED),
QUOTE(EVENT_OBJECT_TEXTSELECTIONCHANGED),
QUOTE(EVENT_OBJECT_CONTENTSCROLLED),
QUOTE(EVENT_OBJECT_LIVEREGIONCHANGED),
QUOTE(EVENT_OBJECT_HOSTEDOBJECTSINVALIDATED),
QUOTE(EVENT_OBJECT_DRAGSTART),
QUOTE(EVENT_OBJECT_DRAGCANCEL),
QUOTE(EVENT_OBJECT_DRAGCOMPLETE),
QUOTE(EVENT_OBJECT_DRAGENTER),
QUOTE(EVENT_OBJECT_DRAGLEAVE),
QUOTE(EVENT_OBJECT_DRAGDROPPED),
QUOTE(EVENT_SYSTEM_ALERT),
QUOTE(EVENT_SYSTEM_SCROLLINGSTART),
QUOTE(EVENT_SYSTEM_SCROLLINGEND),
QUOTE(IA2_EVENT_ACTION_CHANGED),
QUOTE(IA2_EVENT_ACTIVE_DESCENDANT_CHANGED),
QUOTE(IA2_EVENT_DOCUMENT_ATTRIBUTE_CHANGED),
QUOTE(IA2_EVENT_DOCUMENT_CONTENT_CHANGED),
QUOTE(IA2_EVENT_DOCUMENT_LOAD_COMPLETE),
QUOTE(IA2_EVENT_DOCUMENT_LOAD_STOPPED),
QUOTE(IA2_EVENT_DOCUMENT_RELOAD),
QUOTE(IA2_EVENT_HYPERLINK_END_INDEX_CHANGED),
QUOTE(IA2_EVENT_HYPERLINK_NUMBER_OF_ANCHORS_CHANGED),
QUOTE(IA2_EVENT_HYPERLINK_SELECTED_LINK_CHANGED),
QUOTE(IA2_EVENT_HYPERTEXT_LINK_ACTIVATED),
QUOTE(IA2_EVENT_HYPERTEXT_LINK_SELECTED),
QUOTE(IA2_EVENT_HYPERLINK_START_INDEX_CHANGED),
QUOTE(IA2_EVENT_HYPERTEXT_CHANGED),
QUOTE(IA2_EVENT_HYPERTEXT_NLINKS_CHANGED),
QUOTE(IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED),
QUOTE(IA2_EVENT_PAGE_CHANGED),
QUOTE(IA2_EVENT_SECTION_CHANGED),
QUOTE(IA2_EVENT_TABLE_CAPTION_CHANGED),
QUOTE(IA2_EVENT_TABLE_COLUMN_DESCRIPTION_CHANGED),
QUOTE(IA2_EVENT_TABLE_COLUMN_HEADER_CHANGED),
QUOTE(IA2_EVENT_TABLE_MODEL_CHANGED),
QUOTE(IA2_EVENT_TABLE_ROW_DESCRIPTION_CHANGED),
QUOTE(IA2_EVENT_TABLE_ROW_HEADER_CHANGED),
QUOTE(IA2_EVENT_TABLE_SUMMARY_CHANGED),
QUOTE(IA2_EVENT_TEXT_ATTRIBUTE_CHANGED),
QUOTE(IA2_EVENT_TEXT_CARET_MOVED),
QUOTE(IA2_EVENT_TEXT_CHANGED),
QUOTE(IA2_EVENT_TEXT_COLUMN_CHANGED),
QUOTE(IA2_EVENT_TEXT_INSERTED),
QUOTE(IA2_EVENT_TEXT_REMOVED),
QUOTE(IA2_EVENT_TEXT_UPDATED),
QUOTE(IA2_EVENT_TEXT_SELECTION_CHANGED),
QUOTE(IA2_EVENT_VISIBLE_DATA_CHANGED),
};
return GetNameForPlatformConstant(event_table, base::size(event_table),
event);
}
void IAccessibleStateToStringVector(int32_t ia_state,
std::vector<base::string16>* result) {
#define QUOTE_STATE(X) \
{ STATE_SYSTEM_##X, #X }
// MSAA / IAccessible states. Unlike roles, these are not also IA2 states.
//
// Note: for historical reasons these are in numerical order rather than
// alphabetical order. Changing the order would change the order in which
// the states are printed, which would affect a bunch of tests.
static const PlatformConstantToNameEntry ia_table[] = {
QUOTE_STATE(UNAVAILABLE), QUOTE_STATE(SELECTED),
QUOTE_STATE(FOCUSED), QUOTE_STATE(PRESSED),
QUOTE_STATE(CHECKED), QUOTE_STATE(MIXED),
QUOTE_STATE(READONLY), QUOTE_STATE(HOTTRACKED),
QUOTE_STATE(DEFAULT), QUOTE_STATE(EXPANDED),
QUOTE_STATE(COLLAPSED), QUOTE_STATE(BUSY),
QUOTE_STATE(FLOATING), QUOTE_STATE(MARQUEED),
QUOTE_STATE(ANIMATED), QUOTE_STATE(INVISIBLE),
QUOTE_STATE(OFFSCREEN), QUOTE_STATE(SIZEABLE),
QUOTE_STATE(MOVEABLE), QUOTE_STATE(SELFVOICING),
QUOTE_STATE(FOCUSABLE), QUOTE_STATE(SELECTABLE),
QUOTE_STATE(LINKED), QUOTE_STATE(TRAVERSED),
QUOTE_STATE(MULTISELECTABLE), QUOTE_STATE(EXTSELECTABLE),
QUOTE_STATE(ALERT_LOW), QUOTE_STATE(ALERT_MEDIUM),
QUOTE_STATE(ALERT_HIGH), QUOTE_STATE(PROTECTED),
QUOTE_STATE(HASPOPUP),
};
for (auto& entry : ia_table) {
if (entry.value & ia_state)
result->push_back(base::ASCIIToUTF16(entry.name));
}
}
base::string16 IAccessibleStateToString(int32_t ia_state) {
std::vector<base::string16> strings;
IAccessibleStateToStringVector(ia_state, &strings);
return base::JoinString(strings, base::ASCIIToUTF16(","));
}
void IAccessible2StateToStringVector(int32_t ia2_state,
std::vector<base::string16>* result) {
// Note: for historical reasons these are in numerical order rather than
// alphabetical order. Changing the order would change the order in which
// the states are printed, which would affect a bunch of tests.
static const PlatformConstantToNameEntry ia2_table[] = {
QUOTE(IA2_STATE_ACTIVE),
QUOTE(IA2_STATE_ARMED),
QUOTE(IA2_STATE_CHECKABLE),
QUOTE(IA2_STATE_DEFUNCT),
QUOTE(IA2_STATE_EDITABLE),
QUOTE(IA2_STATE_HORIZONTAL),
QUOTE(IA2_STATE_ICONIFIED),
QUOTE(IA2_STATE_INVALID_ENTRY),
QUOTE(IA2_STATE_MANAGES_DESCENDANTS),
QUOTE(IA2_STATE_MODAL),
QUOTE(IA2_STATE_MULTI_LINE),
QUOTE(IA2_STATE_REQUIRED),
QUOTE(IA2_STATE_SELECTABLE_TEXT),
QUOTE(IA2_STATE_SINGLE_LINE),
QUOTE(IA2_STATE_STALE),
QUOTE(IA2_STATE_SUPPORTS_AUTOCOMPLETION),
QUOTE(IA2_STATE_TRANSIENT),
QUOTE(IA2_STATE_VERTICAL),
// Untested states include those that would be repeated on nearly
// every node or would vary based on window size.
// QUOTE(IA2_STATE_OPAQUE) // Untested.
};
for (auto& entry : ia2_table) {
if (entry.value & ia2_state)
result->push_back(base::ASCIIToUTF16(entry.name));
}
}
base::string16 IAccessible2StateToString(int32_t ia2_state) {
std::vector<base::string16> strings;
IAccessible2StateToStringVector(ia2_state, &strings);
return base::JoinString(strings, base::ASCIIToUTF16(","));
}
CONTENT_EXPORT base::string16 UiaIdentifierToString(int32_t identifier) {
static const PlatformConstantToNameEntry id_table[] = {
// Patterns
QUOTE(UIA_InvokePatternId),
QUOTE(UIA_SelectionPatternId),
QUOTE(UIA_ValuePatternId),
QUOTE(UIA_RangeValuePatternId),
QUOTE(UIA_ScrollPatternId),
QUOTE(UIA_ExpandCollapsePatternId),
QUOTE(UIA_GridPatternId),
QUOTE(UIA_GridItemPatternId),
QUOTE(UIA_MultipleViewPatternId),
QUOTE(UIA_WindowPatternId),
QUOTE(UIA_SelectionItemPatternId),
QUOTE(UIA_DockPatternId),
QUOTE(UIA_TablePatternId),
QUOTE(UIA_TableItemPatternId),
QUOTE(UIA_TextPatternId),
QUOTE(UIA_TogglePatternId),
QUOTE(UIA_TransformPatternId),
QUOTE(UIA_ScrollItemPatternId),
QUOTE(UIA_LegacyIAccessiblePatternId),
QUOTE(UIA_ItemContainerPatternId),
QUOTE(UIA_VirtualizedItemPatternId),
QUOTE(UIA_SynchronizedInputPatternId),
QUOTE(UIA_ObjectModelPatternId),
QUOTE(UIA_AnnotationPatternId),
QUOTE(UIA_TextPattern2Id),
QUOTE(UIA_StylesPatternId),
QUOTE(UIA_SpreadsheetPatternId),
QUOTE(UIA_SpreadsheetItemPatternId),
QUOTE(UIA_TransformPattern2Id),
QUOTE(UIA_TextChildPatternId),
QUOTE(UIA_DragPatternId),
QUOTE(UIA_DropTargetPatternId),
QUOTE(UIA_TextEditPatternId),
QUOTE(UIA_CustomNavigationPatternId),
QUOTE(UIA_SelectionPattern2Id),
// Events
QUOTE(UIA_ToolTipOpenedEventId),
QUOTE(UIA_ToolTipClosedEventId),
QUOTE(UIA_StructureChangedEventId),
QUOTE(UIA_MenuOpenedEventId),
QUOTE(UIA_AutomationPropertyChangedEventId),
QUOTE(UIA_AutomationFocusChangedEventId),
QUOTE(UIA_AsyncContentLoadedEventId),
QUOTE(UIA_MenuClosedEventId),
QUOTE(UIA_LayoutInvalidatedEventId),
QUOTE(UIA_Invoke_InvokedEventId),
QUOTE(UIA_SelectionItem_ElementAddedToSelectionEventId),
QUOTE(UIA_SelectionItem_ElementRemovedFromSelectionEventId),
QUOTE(UIA_SelectionItem_ElementSelectedEventId),
QUOTE(UIA_Selection_InvalidatedEventId),
QUOTE(UIA_Text_TextSelectionChangedEventId),
QUOTE(UIA_Text_TextChangedEventId),
QUOTE(UIA_Window_WindowOpenedEventId),
QUOTE(UIA_Window_WindowClosedEventId),
QUOTE(UIA_MenuModeStartEventId),
QUOTE(UIA_MenuModeEndEventId),
QUOTE(UIA_InputReachedTargetEventId),
QUOTE(UIA_InputReachedOtherElementEventId),
QUOTE(UIA_InputDiscardedEventId),
QUOTE(UIA_SystemAlertEventId),
QUOTE(UIA_LiveRegionChangedEventId),
QUOTE(UIA_HostedFragmentRootsInvalidatedEventId),
QUOTE(UIA_Drag_DragStartEventId),
QUOTE(UIA_Drag_DragCancelEventId),
QUOTE(UIA_Drag_DragCompleteEventId),
QUOTE(UIA_DropTarget_DragEnterEventId),
QUOTE(UIA_DropTarget_DragLeaveEventId),
QUOTE(UIA_DropTarget_DroppedEventId),
QUOTE(UIA_TextEdit_TextChangedEventId),
QUOTE(UIA_TextEdit_ConversionTargetChangedEventId),
QUOTE(UIA_ChangesEventId),
QUOTE(UIA_NotificationEventId),
// Properties
QUOTE(UIA_RuntimeIdPropertyId),
QUOTE(UIA_BoundingRectanglePropertyId),
QUOTE(UIA_ProcessIdPropertyId),
QUOTE(UIA_ControlTypePropertyId),
QUOTE(UIA_LocalizedControlTypePropertyId),
QUOTE(UIA_NamePropertyId),
QUOTE(UIA_AcceleratorKeyPropertyId),
QUOTE(UIA_AccessKeyPropertyId),
QUOTE(UIA_HasKeyboardFocusPropertyId),
QUOTE(UIA_IsKeyboardFocusablePropertyId),
QUOTE(UIA_IsEnabledPropertyId),
QUOTE(UIA_AutomationIdPropertyId),
QUOTE(UIA_ClassNamePropertyId),
QUOTE(UIA_HelpTextPropertyId),
QUOTE(UIA_ClickablePointPropertyId),
QUOTE(UIA_CulturePropertyId),
QUOTE(UIA_IsControlElementPropertyId),
QUOTE(UIA_IsContentElementPropertyId),
QUOTE(UIA_LabeledByPropertyId),
QUOTE(UIA_IsPasswordPropertyId),
QUOTE(UIA_NativeWindowHandlePropertyId),
QUOTE(UIA_ItemTypePropertyId),
QUOTE(UIA_IsOffscreenPropertyId),
QUOTE(UIA_OrientationPropertyId),
QUOTE(UIA_FrameworkIdPropertyId),
QUOTE(UIA_IsRequiredForFormPropertyId),
QUOTE(UIA_ItemStatusPropertyId),
QUOTE(UIA_IsDockPatternAvailablePropertyId),
QUOTE(UIA_IsExpandCollapsePatternAvailablePropertyId),
QUOTE(UIA_IsGridItemPatternAvailablePropertyId),
QUOTE(UIA_IsGridPatternAvailablePropertyId),
QUOTE(UIA_IsInvokePatternAvailablePropertyId),
QUOTE(UIA_IsMultipleViewPatternAvailablePropertyId),
QUOTE(UIA_IsRangeValuePatternAvailablePropertyId),
QUOTE(UIA_IsScrollPatternAvailablePropertyId),
QUOTE(UIA_IsScrollItemPatternAvailablePropertyId),
QUOTE(UIA_IsSelectionItemPatternAvailablePropertyId),
QUOTE(UIA_IsSelectionPatternAvailablePropertyId),
QUOTE(UIA_IsTablePatternAvailablePropertyId),
QUOTE(UIA_IsTableItemPatternAvailablePropertyId),
QUOTE(UIA_IsTextPatternAvailablePropertyId),
QUOTE(UIA_IsTogglePatternAvailablePropertyId),
QUOTE(UIA_IsTransformPatternAvailablePropertyId),
QUOTE(UIA_IsValuePatternAvailablePropertyId),
QUOTE(UIA_IsWindowPatternAvailablePropertyId),
QUOTE(UIA_ValueValuePropertyId),
QUOTE(UIA_ValueIsReadOnlyPropertyId),
QUOTE(UIA_RangeValueValuePropertyId),
QUOTE(UIA_RangeValueIsReadOnlyPropertyId),
QUOTE(UIA_RangeValueMinimumPropertyId),
QUOTE(UIA_RangeValueMaximumPropertyId),
QUOTE(UIA_RangeValueLargeChangePropertyId),
QUOTE(UIA_RangeValueSmallChangePropertyId),
QUOTE(UIA_ScrollHorizontalScrollPercentPropertyId),
QUOTE(UIA_ScrollHorizontalViewSizePropertyId),
QUOTE(UIA_ScrollVerticalScrollPercentPropertyId),
QUOTE(UIA_ScrollVerticalViewSizePropertyId),
QUOTE(UIA_ScrollHorizontallyScrollablePropertyId),
QUOTE(UIA_ScrollVerticallyScrollablePropertyId),
QUOTE(UIA_SelectionSelectionPropertyId),
QUOTE(UIA_SelectionCanSelectMultiplePropertyId),
QUOTE(UIA_SelectionIsSelectionRequiredPropertyId),
QUOTE(UIA_GridRowCountPropertyId),
QUOTE(UIA_GridColumnCountPropertyId),
QUOTE(UIA_GridItemRowPropertyId),
QUOTE(UIA_GridItemColumnPropertyId),
QUOTE(UIA_GridItemRowSpanPropertyId),
QUOTE(UIA_GridItemColumnSpanPropertyId),
QUOTE(UIA_GridItemContainingGridPropertyId),
QUOTE(UIA_DockDockPositionPropertyId),
QUOTE(UIA_ExpandCollapseExpandCollapseStatePropertyId),
QUOTE(UIA_MultipleViewCurrentViewPropertyId),
QUOTE(UIA_MultipleViewSupportedViewsPropertyId),
QUOTE(UIA_WindowCanMaximizePropertyId),
QUOTE(UIA_WindowCanMinimizePropertyId),
QUOTE(UIA_WindowWindowVisualStatePropertyId),
QUOTE(UIA_WindowWindowInteractionStatePropertyId),
QUOTE(UIA_WindowIsModalPropertyId),
QUOTE(UIA_WindowIsTopmostPropertyId),
QUOTE(UIA_SelectionItemIsSelectedPropertyId),
QUOTE(UIA_SelectionItemSelectionContainerPropertyId),
QUOTE(UIA_TableRowHeadersPropertyId),
QUOTE(UIA_TableColumnHeadersPropertyId),
QUOTE(UIA_TableRowOrColumnMajorPropertyId),
QUOTE(UIA_TableItemRowHeaderItemsPropertyId),
QUOTE(UIA_TableItemColumnHeaderItemsPropertyId),
QUOTE(UIA_ToggleToggleStatePropertyId),
QUOTE(UIA_TransformCanMovePropertyId),
QUOTE(UIA_TransformCanResizePropertyId),
QUOTE(UIA_TransformCanRotatePropertyId),
QUOTE(UIA_IsLegacyIAccessiblePatternAvailablePropertyId),
QUOTE(UIA_LegacyIAccessibleChildIdPropertyId),
QUOTE(UIA_LegacyIAccessibleNamePropertyId),
QUOTE(UIA_LegacyIAccessibleValuePropertyId),
QUOTE(UIA_LegacyIAccessibleDescriptionPropertyId),
QUOTE(UIA_LegacyIAccessibleRolePropertyId),
QUOTE(UIA_LegacyIAccessibleStatePropertyId),
QUOTE(UIA_LegacyIAccessibleHelpPropertyId),
QUOTE(UIA_LegacyIAccessibleKeyboardShortcutPropertyId),
QUOTE(UIA_LegacyIAccessibleSelectionPropertyId),
QUOTE(UIA_LegacyIAccessibleDefaultActionPropertyId),
QUOTE(UIA_AriaRolePropertyId),
QUOTE(UIA_AriaPropertiesPropertyId),
QUOTE(UIA_IsDataValidForFormPropertyId),
QUOTE(UIA_ControllerForPropertyId),
QUOTE(UIA_DescribedByPropertyId),
QUOTE(UIA_FlowsToPropertyId),
QUOTE(UIA_ProviderDescriptionPropertyId),
QUOTE(UIA_IsItemContainerPatternAvailablePropertyId),
QUOTE(UIA_IsVirtualizedItemPatternAvailablePropertyId),
QUOTE(UIA_IsSynchronizedInputPatternAvailablePropertyId),
QUOTE(UIA_OptimizeForVisualContentPropertyId),
QUOTE(UIA_IsObjectModelPatternAvailablePropertyId),
QUOTE(UIA_AnnotationAnnotationTypeIdPropertyId),
QUOTE(UIA_AnnotationAnnotationTypeNamePropertyId),
QUOTE(UIA_AnnotationAuthorPropertyId),
QUOTE(UIA_AnnotationDateTimePropertyId),
QUOTE(UIA_AnnotationTargetPropertyId),
QUOTE(UIA_IsAnnotationPatternAvailablePropertyId),
QUOTE(UIA_IsTextPattern2AvailablePropertyId),
QUOTE(UIA_StylesStyleIdPropertyId),
QUOTE(UIA_StylesStyleNamePropertyId),
QUOTE(UIA_StylesFillColorPropertyId),
QUOTE(UIA_StylesFillPatternStylePropertyId),
QUOTE(UIA_StylesShapePropertyId),
QUOTE(UIA_StylesFillPatternColorPropertyId),
QUOTE(UIA_StylesExtendedPropertiesPropertyId),
QUOTE(UIA_IsStylesPatternAvailablePropertyId),
QUOTE(UIA_IsSpreadsheetPatternAvailablePropertyId),
QUOTE(UIA_SpreadsheetItemFormulaPropertyId),
QUOTE(UIA_SpreadsheetItemAnnotationObjectsPropertyId),
QUOTE(UIA_SpreadsheetItemAnnotationTypesPropertyId),
QUOTE(UIA_IsSpreadsheetItemPatternAvailablePropertyId),
QUOTE(UIA_Transform2CanZoomPropertyId),
QUOTE(UIA_IsTransformPattern2AvailablePropertyId),
QUOTE(UIA_LiveSettingPropertyId),
QUOTE(UIA_IsTextChildPatternAvailablePropertyId),
QUOTE(UIA_IsDragPatternAvailablePropertyId),
QUOTE(UIA_DragIsGrabbedPropertyId),
QUOTE(UIA_DragDropEffectPropertyId),
QUOTE(UIA_DragDropEffectsPropertyId),
QUOTE(UIA_IsDropTargetPatternAvailablePropertyId),
QUOTE(UIA_DropTargetDropTargetEffectPropertyId),
QUOTE(UIA_DropTargetDropTargetEffectsPropertyId),
QUOTE(UIA_DragGrabbedItemsPropertyId),
QUOTE(UIA_Transform2ZoomLevelPropertyId),
QUOTE(UIA_Transform2ZoomMinimumPropertyId),
QUOTE(UIA_Transform2ZoomMaximumPropertyId),
QUOTE(UIA_FlowsFromPropertyId),
QUOTE(UIA_IsTextEditPatternAvailablePropertyId),
QUOTE(UIA_IsPeripheralPropertyId),
QUOTE(UIA_IsCustomNavigationPatternAvailablePropertyId),
QUOTE(UIA_PositionInSetPropertyId),
QUOTE(UIA_SizeOfSetPropertyId),
QUOTE(UIA_LevelPropertyId),
QUOTE(UIA_AnnotationTypesPropertyId),
QUOTE(UIA_AnnotationObjectsPropertyId),
QUOTE(UIA_LandmarkTypePropertyId),
QUOTE(UIA_LocalizedLandmarkTypePropertyId),
QUOTE(UIA_FullDescriptionPropertyId),
QUOTE(UIA_FillColorPropertyId),
QUOTE(UIA_OutlineColorPropertyId),
QUOTE(UIA_FillTypePropertyId),
QUOTE(UIA_VisualEffectsPropertyId),
QUOTE(UIA_OutlineThicknessPropertyId),
QUOTE(UIA_CenterPointPropertyId),
QUOTE(UIA_RotationPropertyId),
QUOTE(UIA_SizePropertyId),
QUOTE(UIA_IsSelectionPattern2AvailablePropertyId),
QUOTE(UIA_Selection2FirstSelectedItemPropertyId),
QUOTE(UIA_Selection2LastSelectedItemPropertyId),
QUOTE(UIA_Selection2CurrentSelectedItemPropertyId),
QUOTE(UIA_Selection2ItemCountPropertyId),
QUOTE(UIA_HeadingLevelPropertyId),
// Attributes
QUOTE(UIA_AnimationStyleAttributeId),
QUOTE(UIA_BackgroundColorAttributeId),
QUOTE(UIA_BulletStyleAttributeId),
QUOTE(UIA_CapStyleAttributeId),
QUOTE(UIA_CultureAttributeId),
QUOTE(UIA_FontNameAttributeId),
QUOTE(UIA_FontSizeAttributeId),
QUOTE(UIA_FontWeightAttributeId),
QUOTE(UIA_ForegroundColorAttributeId),
QUOTE(UIA_HorizontalTextAlignmentAttributeId),
QUOTE(UIA_IndentationFirstLineAttributeId),
QUOTE(UIA_IndentationLeadingAttributeId),
QUOTE(UIA_IndentationTrailingAttributeId),
QUOTE(UIA_IsHiddenAttributeId),
QUOTE(UIA_IsItalicAttributeId),
QUOTE(UIA_IsReadOnlyAttributeId),
QUOTE(UIA_IsSubscriptAttributeId),
QUOTE(UIA_IsSuperscriptAttributeId),
QUOTE(UIA_MarginBottomAttributeId),
QUOTE(UIA_MarginLeadingAttributeId),
QUOTE(UIA_MarginTopAttributeId),
QUOTE(UIA_MarginTrailingAttributeId),
QUOTE(UIA_OutlineStylesAttributeId),
QUOTE(UIA_OverlineColorAttributeId),
QUOTE(UIA_OverlineStyleAttributeId),
QUOTE(UIA_StrikethroughColorAttributeId),
QUOTE(UIA_StrikethroughStyleAttributeId),
QUOTE(UIA_TabsAttributeId),
QUOTE(UIA_TextFlowDirectionsAttributeId),
QUOTE(UIA_UnderlineColorAttributeId),
QUOTE(UIA_UnderlineStyleAttributeId),
QUOTE(UIA_AnnotationTypesAttributeId),
QUOTE(UIA_AnnotationObjectsAttributeId),
QUOTE(UIA_StyleNameAttributeId),
QUOTE(UIA_StyleIdAttributeId),
QUOTE(UIA_LinkAttributeId),
QUOTE(UIA_IsActiveAttributeId),
QUOTE(UIA_SelectionActiveEndAttributeId),
QUOTE(UIA_CaretPositionAttributeId),
QUOTE(UIA_CaretBidiModeAttributeId),
QUOTE(UIA_LineSpacingAttributeId),
QUOTE(UIA_BeforeParagraphSpacingAttributeId),
QUOTE(UIA_AfterParagraphSpacingAttributeId),
QUOTE(UIA_SayAsInterpretAsAttributeId),
// Control Types
QUOTE(UIA_ButtonControlTypeId),
QUOTE(UIA_CalendarControlTypeId),
QUOTE(UIA_CheckBoxControlTypeId),
QUOTE(UIA_ComboBoxControlTypeId),
QUOTE(UIA_EditControlTypeId),
QUOTE(UIA_HyperlinkControlTypeId),
QUOTE(UIA_ImageControlTypeId),
QUOTE(UIA_ListItemControlTypeId),
QUOTE(UIA_ListControlTypeId),
QUOTE(UIA_MenuControlTypeId),
QUOTE(UIA_MenuBarControlTypeId),
QUOTE(UIA_MenuItemControlTypeId),
QUOTE(UIA_ProgressBarControlTypeId),
QUOTE(UIA_RadioButtonControlTypeId),
QUOTE(UIA_ScrollBarControlTypeId),
QUOTE(UIA_SliderControlTypeId),
QUOTE(UIA_SpinnerControlTypeId),
QUOTE(UIA_StatusBarControlTypeId),
QUOTE(UIA_TabControlTypeId),
QUOTE(UIA_TabItemControlTypeId),
QUOTE(UIA_TextControlTypeId),
QUOTE(UIA_ToolBarControlTypeId),
QUOTE(UIA_ToolTipControlTypeId),
QUOTE(UIA_TreeControlTypeId),
QUOTE(UIA_TreeItemControlTypeId),
QUOTE(UIA_CustomControlTypeId),
QUOTE(UIA_GroupControlTypeId),
QUOTE(UIA_ThumbControlTypeId),
QUOTE(UIA_DataGridControlTypeId),
QUOTE(UIA_DataItemControlTypeId),
QUOTE(UIA_DocumentControlTypeId),
QUOTE(UIA_SplitButtonControlTypeId),
QUOTE(UIA_WindowControlTypeId),
QUOTE(UIA_PaneControlTypeId),
QUOTE(UIA_HeaderControlTypeId),
QUOTE(UIA_HeaderItemControlTypeId),
QUOTE(UIA_TableControlTypeId),
QUOTE(UIA_TitleBarControlTypeId),
QUOTE(UIA_SeparatorControlTypeId),
QUOTE(UIA_SemanticZoomControlTypeId),
QUOTE(UIA_AppBarControlTypeId),
};
return GetNameForPlatformConstant(id_table, base::size(id_table), identifier);
}
CONTENT_EXPORT base::string16 UiaOrientationToString(int32_t identifier) {
static const PlatformConstantToNameEntry id_table[] = {
QUOTE(OrientationType_None), QUOTE(OrientationType_Horizontal),
QUOTE(OrientationType_Vertical)};
return GetNameForPlatformConstant(id_table, base::size(id_table), identifier);
}
CONTENT_EXPORT base::string16 UiaLiveSettingToString(int32_t identifier) {
static const PlatformConstantToNameEntry id_table[] = {
QUOTE(LiveSetting::Off), QUOTE(LiveSetting::Polite),
QUOTE(LiveSetting::Assertive)};
return GetNameForPlatformConstant(id_table, base::size(id_table), identifier);
}
CONTENT_EXPORT std::string BstrToUTF8(BSTR bstr) {
base::string16 str16(bstr, SysStringLen(bstr));
return base::UTF16ToUTF8(str16);
}
CONTENT_EXPORT std::string UiaIdentifierToStringUTF8(int32_t id) {
return base::UTF16ToUTF8(UiaIdentifierToString(id));
}
CONTENT_EXPORT HWND GetHwndForProcess(base::ProcessId pid) {
HwndWithProcId hwnd_with_proc_id(pid);
EnumWindows(&EnumWindowsProcPid, (LPARAM)&hwnd_with_proc_id);
return hwnd_with_proc_id.hwnd;
}
} // namespace content