diff --git a/accessible/android/TraversalRule.cpp b/accessible/android/TraversalRule.cpp index 35ea26777c5a..1d366a7648e6 100644 --- a/accessible/android/TraversalRule.cpp +++ b/accessible/android/TraversalRule.cpp @@ -274,6 +274,7 @@ uint16_t TraversalRule::DefaultMatch(Accessible* aAccessible) { case roles::OPTION: case roles::SWITCH: case roles::MATHML_MATH: + case roles::SUMMARY: // Ignore the subtree, if there is one. So that we don't land on // the same content that was already presented by its parent. return nsIAccessibleTraversalRule::FILTER_MATCH | diff --git a/accessible/base/RoleMap.inc b/accessible/base/RoleMap.inc index b13ea5a8f0fd..294b4f5d4515 100644 --- a/accessible/base/RoleMap.inc +++ b/accessible/base/RoleMap.inc @@ -1526,7 +1526,7 @@ ROLE(SUMMARY, @"AXSummary", ROLE_SYSTEM_PUSHBUTTON, ROLE_SYSTEM_PUSHBUTTON, - java::SessionAccessibility::CLASSNAME_BUTTON, + java::SessionAccessibility::CLASSNAME_VIEW, IsAccessibilityElementRule::Yes, UIA_ButtonControlTypeId, eNameFromSubtreeRule) diff --git a/dom/locales/en-US/chrome/accessibility/AccessFu.properties b/dom/locales/en-US/chrome/accessibility/AccessFu.properties index a8cba3f34944..83426d0f1623 100644 --- a/dom/locales/en-US/chrome/accessibility/AccessFu.properties +++ b/dom/locales/en-US/chrome/accessibility/AccessFu.properties @@ -64,6 +64,7 @@ figure = figure definitionlist = definition list term = term definition = definition +summary = summary mathmltable = math table mathmlcell = cell diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt index 5dd81bd72c12..c53ba81a4bd6 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/AccessibilityTest.kt @@ -828,6 +828,55 @@ class AccessibilityTest : BaseSessionTest() { ) } + @Test + fun testSummary() { + var nodeId = AccessibilityNodeProvider.HOST_VIEW_ID + mainSession.loadUri("data:text/html;charset=utf-8,
Question

Answer

") + waitForInitialFocus(true) + + sessionRule.waitUntilCalled( + object : EventDelegate { + @AssertCalled(count = 1) + override fun onAccessibilityFocused(event: AccessibilityEvent) { + nodeId = getSourceId(event) + val node = createNodeInfo(nodeId) + assertThat("Accessibility focus on summary", node.text.toString(), equalTo("Question")) + assertThat( + "Summary has role description", + node.extras.getCharSequence("AccessibilityNodeInfo.roleDescription")!!.toString(), + equalTo("summary"), + ) + assertThat( + "summary is expandable", + node.actionList, + hasItem(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND), + ) + } + } + ) + + provider.performAction(nodeId, AccessibilityNodeInfo.ACTION_EXPAND, null) + sessionRule.waitUntilCalled( + object : EventDelegate { + @AssertCalled(count = 1) + override fun onClicked(event: AccessibilityEvent) { + assertThat("Clicked event is from same node", getSourceId(event), equalTo(nodeId)) + val node = createNodeInfo(nodeId) + assertThat( + "summary is collapsable", + node.actionList, + hasItem(AccessibilityNodeInfo.AccessibilityAction.ACTION_COLLAPSE), + ) + assertThat( + "node is not expandable", + node.actionList, + not(hasItem(AccessibilityNodeInfo.AccessibilityAction.ACTION_EXPAND)), + ) + } + } + ) + } + @Test fun testMoveByCharacter() { var nodeId = AccessibilityNodeProvider.HOST_VIEW_ID