summaryrefslogtreecommitdiff
path: root/winaccessibility
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2023-10-27 15:24:46 +0100
committerMichael Weghorn <m.weghorn@posteo.de>2023-10-28 05:45:06 +0200
commit33061be5a7538409839dcca3116b9fa72629013f (patch)
tree3fd8a4c38bfae6d745124747e45548896ee23ee8 /winaccessibility
parent0775ae4dec529505e1d108b2806f90040721e054 (diff)
tdf#135586 wina11y: Make role mapping more explicit
The previous `ROLE_TABLE` looked like it might explicitly map the UNO role on the left-hand side to the IAccessible2 role on the right-hand side, and the comment also said so. In reality, the UNO role on the left hand side was not really accessed, but the assumption was that the index of each entry would correspond to the sal_Int16 value of the UNO role (`css::accessibility::AccessibleRole`). Make that mapping more explicit by replacing it with a helper function `lcl_mapToIAccessible2Role` and slightly simplify `AccObject::UpdateRole`. Change-Id: Id02553c4df042982f92fce3338077e95db687a83 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/158572 Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'winaccessibility')
-rw-r--r--winaccessibility/source/service/AccObject.cxx301
1 files changed, 197 insertions, 104 deletions
diff --git a/winaccessibility/source/service/AccObject.cxx b/winaccessibility/source/service/AccObject.cxx
index 98c6bba9392f..ad0f65d8cc09 100644
--- a/winaccessibility/source/service/AccObject.cxx
+++ b/winaccessibility/source/service/AccObject.cxx
@@ -26,6 +26,7 @@
#include <o3tl/char16_t2wchar_t.hxx>
#include <o3tl/safeint.hxx>
+#include <sal/log.hxx>
#include <stdlib.h>
#include <memory.h>
@@ -51,102 +52,199 @@ using namespace com::sun::star::accessibility;
using namespace com::sun::star::accessibility::AccessibleRole;
using namespace com::sun::star::accessibility::AccessibleStateType;
-//Role mapping table,left side is UNO role, right side is MSAA role
-const short ROLE_TABLE[][2] =
+namespace {
+
+/**
+ * Map a UNO accessible role to an IAccessible2 role.
+ * @param nUnoRole The UNO role (css::accessiblity::AccessibleRole).
+ * @return IAccessible2 role.
+ */
+short lcl_mapToIAccessible2Role(sal_Int16 nUnoRole)
+{
+ switch(nUnoRole)
{
- {UNKNOWN, IA2_ROLE_UNKNOWN},
- {ALERT , ROLE_SYSTEM_DIALOG},
- {COLUMN_HEADER , ROLE_SYSTEM_COLUMNHEADER},
- //{CANVAS , ROLE_SYSTEM_CLIENT},
- {CANVAS , IA2_ROLE_CANVAS},
- {CHECK_BOX , ROLE_SYSTEM_CHECKBUTTON},
- {CHECK_MENU_ITEM , IA2_ROLE_CHECK_MENU_ITEM},
- {COLOR_CHOOSER, IA2_ROLE_COLOR_CHOOSER},
- {COMBO_BOX , ROLE_SYSTEM_COMBOBOX},
- {DATE_EDITOR , IA2_ROLE_DATE_EDITOR},
- {DESKTOP_ICON , IA2_ROLE_DESKTOP_ICON},
- {DESKTOP_PANE, IA2_ROLE_DESKTOP_PANE},
- {DIRECTORY_PANE, IA2_ROLE_DIRECTORY_PANE},
- {DIALOG, ROLE_SYSTEM_DIALOG},
- {DOCUMENT, ROLE_SYSTEM_DOCUMENT},
- {EMBEDDED_OBJECT , IA2_ROLE_EMBEDDED_OBJECT },
- {END_NOTE , IA2_ROLE_ENDNOTE },
- {FILE_CHOOSER , IA2_ROLE_FILE_CHOOSER },
- {FILLER, ROLE_SYSTEM_WHITESPACE},
- {FONT_CHOOSER, IA2_ROLE_FONT_CHOOSER},
- {FOOTER, IA2_ROLE_FOOTER},
- {FOOTNOTE, IA2_ROLE_FOOTNOTE},
- {FRAME, IA2_ROLE_FRAME},
- {GLASS_PANE , IA2_ROLE_GLASS_PANE},
- {GRAPHIC , ROLE_SYSTEM_GRAPHIC},
- {GROUP_BOX, ROLE_SYSTEM_GROUPING},
- {HEADER , IA2_ROLE_HEADER},
- {HEADING , IA2_ROLE_HEADING},
- {HYPER_LINK , ROLE_SYSTEM_TEXT},
- {ICON , IA2_ROLE_ICON},
- {INTERNAL_FRAME, IA2_ROLE_INTERNAL_FRAME},
- {LABEL, ROLE_SYSTEM_STATICTEXT},
- {LAYERED_PANE , IA2_ROLE_LAYERED_PANE},
- {LIST , ROLE_SYSTEM_LIST},
- {LIST_ITEM , ROLE_SYSTEM_LISTITEM},
- //{MENU , ROLE_SYSTEM_MENUPOPUP},
- {MENU, ROLE_SYSTEM_MENUITEM},
- {MENU_BAR, ROLE_SYSTEM_MENUBAR},
- {MENU_ITEM, ROLE_SYSTEM_MENUITEM},
- {OPTION_PANE , IA2_ROLE_OPTION_PANE},
- {PAGE_TAB, ROLE_SYSTEM_PAGETAB},
- {PAGE_TAB_LIST, ROLE_SYSTEM_PAGETABLIST},
- {PANEL, IA2_ROLE_OPTION_PANE},
- {PARAGRAPH, IA2_ROLE_PARAGRAPH},
- {PASSWORD_TEXT, ROLE_SYSTEM_TEXT},
- {POPUP_MENU, ROLE_SYSTEM_MENUPOPUP},
- {PUSH_BUTTON, ROLE_SYSTEM_PUSHBUTTON},
- {PROGRESS_BAR, ROLE_SYSTEM_PROGRESSBAR},
- {RADIO_BUTTON, ROLE_SYSTEM_RADIOBUTTON},
- {RADIO_MENU_ITEM, IA2_ROLE_RADIO_MENU_ITEM},
- {ROW_HEADER , ROLE_SYSTEM_ROWHEADER},
- {ROOT_PANE, IA2_ROLE_ROOT_PANE},
- {SCROLL_BAR , ROLE_SYSTEM_SCROLLBAR},
- {SCROLL_PANE , IA2_ROLE_SCROLL_PANE},
- {SHAPE, IA2_ROLE_SHAPE},
- {SEPARATOR , ROLE_SYSTEM_SEPARATOR},
- {SLIDER , ROLE_SYSTEM_SLIDER},
- {SPIN_BOX , ROLE_SYSTEM_SPINBUTTON},
- {SPLIT_PANE, IA2_ROLE_SPLIT_PANE},
- {STATUS_BAR, ROLE_SYSTEM_STATUSBAR},
- {TABLE, ROLE_SYSTEM_TABLE},
- {TABLE_CELL , ROLE_SYSTEM_CELL},
- {TEXT, ROLE_SYSTEM_TEXT},
- {TEXT_FRAME , IA2_ROLE_TEXT_FRAME},
- //for change toggle button to push button for jaws
- {TOGGLE_BUTTON, ROLE_SYSTEM_PUSHBUTTON},
-
- {TOOL_BAR, ROLE_SYSTEM_TOOLBAR},
- {TOOL_TIP, ROLE_SYSTEM_TOOLTIP},
- {TREE , ROLE_SYSTEM_OUTLINE},
- {VIEW_PORT , IA2_ROLE_VIEW_PORT},
- {WINDOW, ROLE_SYSTEM_WINDOW},
- {BUTTON_DROPDOWN, ROLE_SYSTEM_BUTTONDROPDOWN},
- {BUTTON_MENU, ROLE_SYSTEM_BUTTONMENU},
- {CAPTION, IA2_ROLE_CAPTION},
- {CHART, IA2_ROLE_SHAPE},
- {EDIT_BAR, IA2_ROLE_EDITBAR},
- {FORM, IA2_ROLE_FORM},
- {IMAGE_MAP , IA2_ROLE_IMAGE_MAP},
- {NOTE, IA2_ROLE_NOTE},
- {PAGE, IA2_ROLE_PAGE},
- {RULER , IA2_ROLE_RULER},
- {SECTION, IA2_ROLE_SECTION},
- {TREE_ITEM , ROLE_SYSTEM_OUTLINEITEM},
- {TREE_TABLE, ROLE_SYSTEM_OUTLINE},
- {COMMENT, IA2_ROLE_TEXT_FRAME },
- {COMMENT_END, IA2_ROLE_TEXT_FRAME },
- {DOCUMENT_PRESENTATION, ROLE_SYSTEM_DOCUMENT },
- {DOCUMENT_SPREADSHEET, ROLE_SYSTEM_DOCUMENT },
- {DOCUMENT_TEXT, ROLE_SYSTEM_DOCUMENT },
- {STATIC, ROLE_SYSTEM_STATICTEXT },
- {NOTIFICATION, ROLE_SYSTEM_ALERT}
- };
+ case css::accessibility::AccessibleRole::UNKNOWN:
+ return IA2_ROLE_UNKNOWN;
+ case css::accessibility::AccessibleRole::ALERT:
+ return ROLE_SYSTEM_DIALOG;
+ case css::accessibility::AccessibleRole::COLUMN_HEADER:
+ return ROLE_SYSTEM_COLUMNHEADER;
+ case css::accessibility::AccessibleRole::CANVAS:
+ return IA2_ROLE_CANVAS;
+ case css::accessibility::AccessibleRole::CHECK_BOX:
+ return ROLE_SYSTEM_CHECKBUTTON;
+ case css::accessibility::AccessibleRole::CHECK_MENU_ITEM:
+ return IA2_ROLE_CHECK_MENU_ITEM;
+ case css::accessibility::AccessibleRole::COLOR_CHOOSER:
+ return IA2_ROLE_COLOR_CHOOSER;
+ case css::accessibility::AccessibleRole::COMBO_BOX:
+ return ROLE_SYSTEM_COMBOBOX;
+ case css::accessibility::AccessibleRole::DATE_EDITOR:
+ return IA2_ROLE_DATE_EDITOR;
+ case css::accessibility::AccessibleRole::DESKTOP_ICON:
+ return IA2_ROLE_DESKTOP_ICON;
+ case css::accessibility::AccessibleRole::DESKTOP_PANE:
+ return IA2_ROLE_DESKTOP_PANE;
+ case css::accessibility::AccessibleRole::DIRECTORY_PANE:
+ return IA2_ROLE_DIRECTORY_PANE;
+ case css::accessibility::AccessibleRole::DIALOG:
+ return ROLE_SYSTEM_DIALOG;
+ case css::accessibility::AccessibleRole::DOCUMENT:
+ return ROLE_SYSTEM_DOCUMENT;
+ case css::accessibility::AccessibleRole::EMBEDDED_OBJECT:
+ return IA2_ROLE_EMBEDDED_OBJECT;
+ case css::accessibility::AccessibleRole::END_NOTE:
+ return IA2_ROLE_ENDNOTE;
+ case css::accessibility::AccessibleRole::FILE_CHOOSER:
+ return IA2_ROLE_FILE_CHOOSER;
+ case css::accessibility::AccessibleRole::FILLER:
+ return ROLE_SYSTEM_WHITESPACE;
+ case css::accessibility::AccessibleRole::FONT_CHOOSER:
+ return IA2_ROLE_FONT_CHOOSER;
+ case css::accessibility::AccessibleRole::FOOTER:
+ return IA2_ROLE_FOOTER;
+ case css::accessibility::AccessibleRole::FOOTNOTE:
+ return IA2_ROLE_FOOTNOTE;
+ case css::accessibility::AccessibleRole::FRAME:
+ return IA2_ROLE_FRAME;
+ case css::accessibility::AccessibleRole::GLASS_PANE:
+ return IA2_ROLE_GLASS_PANE;
+ case css::accessibility::AccessibleRole::GRAPHIC:
+ return ROLE_SYSTEM_GRAPHIC;
+ case css::accessibility::AccessibleRole::GROUP_BOX:
+ return ROLE_SYSTEM_GROUPING;
+ case css::accessibility::AccessibleRole::HEADER:
+ return IA2_ROLE_HEADER;
+ case css::accessibility::AccessibleRole::HEADING:
+ return IA2_ROLE_HEADING;
+ case css::accessibility::AccessibleRole::HYPER_LINK:
+ return ROLE_SYSTEM_TEXT;
+ case css::accessibility::AccessibleRole::ICON:
+ return IA2_ROLE_ICON;
+ case css::accessibility::AccessibleRole::INTERNAL_FRAME:
+ return IA2_ROLE_INTERNAL_FRAME;
+ case css::accessibility::AccessibleRole::LABEL:
+ return ROLE_SYSTEM_STATICTEXT;
+ case css::accessibility::AccessibleRole::LAYERED_PANE:
+ return IA2_ROLE_LAYERED_PANE;
+ case css::accessibility::AccessibleRole::LIST:
+ return ROLE_SYSTEM_LIST;
+ case css::accessibility::AccessibleRole::LIST_ITEM:
+ return ROLE_SYSTEM_LISTITEM;
+ case css::accessibility::AccessibleRole::MENU:
+ return ROLE_SYSTEM_MENUITEM;
+ case css::accessibility::AccessibleRole::MENU_BAR:
+ return ROLE_SYSTEM_MENUBAR;
+ case css::accessibility::AccessibleRole::MENU_ITEM:
+ return ROLE_SYSTEM_MENUITEM;
+ case css::accessibility::AccessibleRole::OPTION_PANE:
+ return IA2_ROLE_OPTION_PANE;
+ case css::accessibility::AccessibleRole::PAGE_TAB:
+ return ROLE_SYSTEM_PAGETAB;
+ case css::accessibility::AccessibleRole::PAGE_TAB_LIST:
+ return ROLE_SYSTEM_PAGETABLIST;
+ case css::accessibility::AccessibleRole::PANEL:
+ return IA2_ROLE_OPTION_PANE;
+ case css::accessibility::AccessibleRole::PARAGRAPH:
+ return IA2_ROLE_PARAGRAPH;
+ case css::accessibility::AccessibleRole::PASSWORD_TEXT:
+ return ROLE_SYSTEM_TEXT;
+ case css::accessibility::AccessibleRole::POPUP_MENU:
+ return ROLE_SYSTEM_MENUPOPUP;
+ case css::accessibility::AccessibleRole::PUSH_BUTTON:
+ return ROLE_SYSTEM_PUSHBUTTON;
+ case css::accessibility::AccessibleRole::PROGRESS_BAR:
+ return ROLE_SYSTEM_PROGRESSBAR;
+ case css::accessibility::AccessibleRole::RADIO_BUTTON:
+ return ROLE_SYSTEM_RADIOBUTTON;
+ case css::accessibility::AccessibleRole::RADIO_MENU_ITEM:
+ return IA2_ROLE_RADIO_MENU_ITEM;
+ case css::accessibility::AccessibleRole::ROW_HEADER:
+ return ROLE_SYSTEM_ROWHEADER;
+ case css::accessibility::AccessibleRole::ROOT_PANE:
+ return IA2_ROLE_ROOT_PANE;
+ case css::accessibility::AccessibleRole::SCROLL_BAR:
+ return ROLE_SYSTEM_SCROLLBAR;
+ case css::accessibility::AccessibleRole::SCROLL_PANE:
+ return IA2_ROLE_SCROLL_PANE;
+ case css::accessibility::AccessibleRole::SHAPE:
+ return IA2_ROLE_SHAPE;
+ case css::accessibility::AccessibleRole::SEPARATOR:
+ return ROLE_SYSTEM_SEPARATOR;
+ case css::accessibility::AccessibleRole::SLIDER:
+ return ROLE_SYSTEM_SLIDER;
+ case css::accessibility::AccessibleRole::SPIN_BOX:
+ return ROLE_SYSTEM_SPINBUTTON;
+ case css::accessibility::AccessibleRole::SPLIT_PANE:
+ return IA2_ROLE_SPLIT_PANE;
+ case css::accessibility::AccessibleRole::STATUS_BAR:
+ return ROLE_SYSTEM_STATUSBAR;
+ case css::accessibility::AccessibleRole::TABLE:
+ return ROLE_SYSTEM_TABLE;
+ case css::accessibility::AccessibleRole::TABLE_CELL:
+ return ROLE_SYSTEM_CELL;
+ case css::accessibility::AccessibleRole::TEXT:
+ return ROLE_SYSTEM_TEXT;
+ case css::accessibility::AccessibleRole::TEXT_FRAME:
+ return IA2_ROLE_TEXT_FRAME;
+ case css::accessibility::AccessibleRole::TOGGLE_BUTTON:
+ return ROLE_SYSTEM_PUSHBUTTON;
+ case css::accessibility::AccessibleRole::TOOL_BAR:
+ return ROLE_SYSTEM_TOOLBAR;
+ case css::accessibility::AccessibleRole::TOOL_TIP:
+ return ROLE_SYSTEM_TOOLTIP;
+ case css::accessibility::AccessibleRole::TREE:
+ return ROLE_SYSTEM_OUTLINE;
+ case css::accessibility::AccessibleRole::VIEW_PORT:
+ return IA2_ROLE_VIEW_PORT;
+ case css::accessibility::AccessibleRole::WINDOW:
+ return ROLE_SYSTEM_WINDOW;
+ case css::accessibility::AccessibleRole::BUTTON_DROPDOWN:
+ return ROLE_SYSTEM_BUTTONDROPDOWN;
+ case css::accessibility::AccessibleRole::BUTTON_MENU:
+ return ROLE_SYSTEM_BUTTONMENU;
+ case css::accessibility::AccessibleRole::CAPTION:
+ return IA2_ROLE_CAPTION;
+ case css::accessibility::AccessibleRole::CHART:
+ return IA2_ROLE_SHAPE;
+ case css::accessibility::AccessibleRole::EDIT_BAR:
+ return IA2_ROLE_EDITBAR;
+ case css::accessibility::AccessibleRole::FORM:
+ return IA2_ROLE_FORM;
+ case css::accessibility::AccessibleRole::IMAGE_MAP:
+ return IA2_ROLE_IMAGE_MAP;
+ case css::accessibility::AccessibleRole::NOTE:
+ return IA2_ROLE_NOTE;
+ case css::accessibility::AccessibleRole::PAGE:
+ return IA2_ROLE_PAGE;
+ case css::accessibility::AccessibleRole::RULER:
+ return IA2_ROLE_RULER;
+ case css::accessibility::AccessibleRole::SECTION:
+ return IA2_ROLE_SECTION;
+ case css::accessibility::AccessibleRole::TREE_ITEM:
+ return ROLE_SYSTEM_OUTLINEITEM;
+ case css::accessibility::AccessibleRole::TREE_TABLE:
+ return ROLE_SYSTEM_OUTLINE;
+ case css::accessibility::AccessibleRole::COMMENT:
+ return IA2_ROLE_TEXT_FRAME;
+ case css::accessibility::AccessibleRole::COMMENT_END:
+ return IA2_ROLE_TEXT_FRAME;
+ case css::accessibility::AccessibleRole::DOCUMENT_PRESENTATION:
+ return ROLE_SYSTEM_DOCUMENT;
+ case css::accessibility::AccessibleRole::DOCUMENT_SPREADSHEET:
+ return ROLE_SYSTEM_DOCUMENT;
+ case css::accessibility::AccessibleRole::DOCUMENT_TEXT:
+ return ROLE_SYSTEM_DOCUMENT;
+ case css::accessibility::AccessibleRole::STATIC:
+ return ROLE_SYSTEM_STATICTEXT;
+ case css::accessibility::AccessibleRole::NOTIFICATION:
+ return ROLE_SYSTEM_ALERT;
+ default:
+ SAL_WARN("iacc2", "Unmapped role: " << nUnoRole);
+ return IA2_ROLE_UNKNOWN;
+ }
+}
+};
/**
@@ -739,16 +837,11 @@ void AccObject::UpdateRole()
return;
}
- XAccessibleContext* pContext = m_xAccContextRef.get();
- m_pIMAcc->Put_XAccRole( ROLE_SYSTEM_WINDOW );
- sal_Int16 iRoleIndex = pContext->getAccessibleRole();
- if ((0 <= iRoleIndex) && (o3tl::make_unsigned(iRoleIndex) < SAL_N_ELEMENTS(ROLE_TABLE)))
- {
- short iIA2Role = ROLE_TABLE[iRoleIndex][1] ;
- m_pIMAcc->Put_XAccRole( iIA2Role );
- }
-
+ const sal_Int16 nUnoRole = m_xAccContextRef->getAccessibleRole();
+ short nIA2Role = lcl_mapToIAccessible2Role(nUnoRole);
+ m_pIMAcc->Put_XAccRole(nIA2Role);
}
+
/**
* update state information from uno to com
* @param