summaryrefslogtreecommitdiff
path: root/accessibility
diff options
context:
space:
mode:
authorMichael Weghorn <m.weghorn@posteo.de>2023-07-26 18:26:48 +0200
committerMichael Weghorn <m.weghorn@posteo.de>2023-07-27 16:58:22 +0200
commitce0a48a1eb16d6309dba175e032a52eb5ede2542 (patch)
tree1c25d37d198f17d1b13d06d3032d883eafcfb5ab /accessibility
parent7d830be6d4ec1781e683001d1b649828be5ab2bd (diff)
tdf#155625 a11y: Notify about menu item role change
Send a `AccessibleEventId::ROLE_CHANGED` event when the accessible role of a menu item changes (s. how `VCLXAccessibleMenuItem::getAccessibleRole` takes into account `MenuItemBits::RADIOCHECK` and `MenuItemBits::CHECKABLE` to determine the accessible role for the underlying menu entry). This fixes the issue of obsolete values for roles being used, which was uncovered by the upcoming Change-Id I1a047864ce8dc1f1bc3056ad00159f7fd5e5b7d3 ("vcl gtk3: Introduce AT-SPI2 tests for the GTK3 accessibility layer"). With this in place, the workaround for tdf#155625 in the upcoming gtk3/AT-SPI tests is no longer necessary and `make CppunitTest_vcl_gtk3_a11y` with https://gerrit.libreoffice.org/c/core/+/153069 patch set 11 still passes after dropping the workaround: diff --git a/vcl/qa/cppunit/a11y/atspi2/atspi2.cxx b/vcl/qa/cppunit/a11y/atspi2/atspi2.cxx index bbcd263fee0c..762401181bf4 100644 --- a/vcl/qa/cppunit/a11y/atspi2/atspi2.cxx +++ b/vcl/qa/cppunit/a11y/atspi2/atspi2.cxx @@ -264,9 +264,6 @@ void Atspi2TestTree::compareObjects(uno::Reference<accessibility::XAccessible> x * be represented with a round trip. */ const auto nLORole = mapToAtspiRole(xLOContext->getAccessibleRole()); auto nAtspiRole = pAtspiAccessible.getRole(); - // FIXME: workaround for https://bugs.documentfoundation.org/show_bug.cgi?id=155625 - if (nLORole == ATSPI_ROLE_CHECK_MENU_ITEM && nAtspiRole == ATSPI_ROLE_MENU_ITEM) - nAtspiRole = nLORole; CPPUNIT_ASSERT_EQUAL(nLORole, nAtspiRole); /* name (no need to worry about debugging suffixes as AccessibilityTools::nameEquals does, as * that will also be part of the name sent to ATSPI) */ Change-Id: I0d88a7eda592f5ee9abf368ce1d5feb6611b9971 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/154947 Reviewed-by: Colomban Wendling <cwendling@hypra.fr> Tested-by: Jenkins Reviewed-by: Michael Weghorn <m.weghorn@posteo.de>
Diffstat (limited to 'accessibility')
-rw-r--r--accessibility/inc/standard/accessiblemenubasecomponent.hxx1
-rw-r--r--accessibility/source/standard/accessiblemenubasecomponent.cxx18
2 files changed, 19 insertions, 0 deletions
diff --git a/accessibility/inc/standard/accessiblemenubasecomponent.hxx b/accessibility/inc/standard/accessiblemenubasecomponent.hxx
index e56120f7fb38..6dd8ab8eb760 100644
--- a/accessibility/inc/standard/accessiblemenubasecomponent.hxx
+++ b/accessibility/inc/standard/accessiblemenubasecomponent.hxx
@@ -73,6 +73,7 @@ protected:
void UpdateSelected( sal_Int32 i, bool bSelected );
void UpdateChecked( sal_Int32 i, bool bChecked );
void UpdateAccessibleName( sal_Int32 i );
+ void UpdateItemRole(sal_Int32 i);
void UpdateItemText( sal_Int32 i );
sal_Int64 GetChildCount() const;
diff --git a/accessibility/source/standard/accessiblemenubasecomponent.cxx b/accessibility/source/standard/accessiblemenubasecomponent.cxx
index e1ab9e326ebf..b66b019ca1b1 100644
--- a/accessibility/source/standard/accessiblemenubasecomponent.cxx
+++ b/accessibility/source/standard/accessiblemenubasecomponent.cxx
@@ -285,6 +285,19 @@ void OAccessibleMenuBaseComponent::UpdateAccessibleName( sal_Int32 i )
}
}
+void OAccessibleMenuBaseComponent::UpdateItemRole(sal_Int32 i)
+{
+ if (i < 0 || o3tl::make_unsigned(i) >= m_aAccessibleChildren.size())
+ return;
+
+ Reference<XAccessible> xChild(m_aAccessibleChildren[i]);
+ if (!xChild.is())
+ return;
+
+ OAccessibleMenuItemComponent* pComp = static_cast<OAccessibleMenuItemComponent*>(xChild.get());
+ assert(pComp);
+ pComp->NotifyAccessibleEvent(AccessibleEventId::ROLE_CHANGED, Any(), Any());
+}
void OAccessibleMenuBaseComponent::UpdateItemText( sal_Int32 i )
{
@@ -586,6 +599,11 @@ void OAccessibleMenuBaseComponent::ProcessMenuEvent( const VclMenuEvent& rVclMen
UpdateAccessibleName( nItemPos );
}
break;
+ case VclEventId::MenuItemRoleChanged:
+ {
+ UpdateItemRole(nItemPos);
+ }
+ break;
case VclEventId::MenuItemTextChanged:
{
UpdateAccessibleName( nItemPos );