From d09e5861c1cf747e12c40cfee7fc59704f761c13 Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Wed, 15 Apr 2020 22:12:37 +0000 Subject: [PATCH] Bug 1628922 - Support landmark navigation in GeckoView. r=Jamie Added a traversal rule and piped through xml-roles as role descriptions. Differential Revision: https://phabricator.services.mozilla.com/D70950 --HG-- extra : moz-landing-system : lando --- accessible/android/AccessibleWrap.cpp | 15 +++++++++++++++ accessible/android/TraversalRule.cpp | 11 +++++++++++ accessible/android/TraversalRule.h | 2 ++ .../chrome/accessibility/AccessFu.properties | 1 + 4 files changed, 29 insertions(+) diff --git a/accessible/android/AccessibleWrap.cpp b/accessible/android/AccessibleWrap.cpp index 435ee6dd6c85..319fe1e458bb 100644 --- a/accessible/android/AccessibleWrap.cpp +++ b/accessible/android/AccessibleWrap.cpp @@ -23,6 +23,7 @@ #include "nsIAccessibleAnnouncementEvent.h" #include "nsAccUtils.h" #include "nsTextEquivUtils.h" +#include "nsWhitespaceTokenizer.h" #include "RootAccessible.h" #include "mozilla/a11y/PDocAccessibleChild.h" @@ -544,6 +545,20 @@ void AccessibleWrap::GetRoleDescription(role aRole, } } + if ((aRole == roles::LANDMARK || aRole == roles::REGION) && aAttributes) { + nsAutoString xmlRoles; + if (NS_SUCCEEDED(aAttributes->GetStringProperty( + NS_LITERAL_CSTRING("xml-roles"), xmlRoles))) { + nsWhitespaceTokenizer tokenizer(xmlRoles); + while (tokenizer.hasMoreTokens()) { + if (LocalizeString(NS_ConvertUTF16toUTF8(tokenizer.nextToken()).get(), + aRoleDescription)) { + return; + } + } + } + } + GetAccService()->GetStringRole(aRole, aGeckoRole); LocalizeString(NS_ConvertUTF16toUTF8(aGeckoRole).get(), aRoleDescription); } diff --git a/accessible/android/TraversalRule.cpp b/accessible/android/TraversalRule.cpp index 0d5b0c931eed..2238abb83d4a 100644 --- a/accessible/android/TraversalRule.cpp +++ b/accessible/android/TraversalRule.cpp @@ -58,6 +58,9 @@ uint16_t TraversalRule::Match(Accessible* aAccessible) { case java::SessionAccessibility::HTML_GRANULARITY_HEADING: result |= HeadingMatch(aAccessible); break; + case java::SessionAccessibility::HTML_GRANULARITY_LANDMARK: + result |= LandmarkMatch(aAccessible); + break; default: result |= DefaultMatch(aAccessible); break; @@ -150,6 +153,14 @@ uint16_t TraversalRule::SectionMatch(Accessible* aAccessible) { return nsIAccessibleTraversalRule::FILTER_IGNORE; } +uint16_t TraversalRule::LandmarkMatch(Accessible* aAccessible) { + if (aAccessible->LandmarkRole()) { + return nsIAccessibleTraversalRule::FILTER_MATCH; + } + + return nsIAccessibleTraversalRule::FILTER_IGNORE; +} + uint16_t TraversalRule::ControlMatch(Accessible* aAccessible) { switch (aAccessible->Role()) { case roles::PUSHBUTTON: diff --git a/accessible/android/TraversalRule.h b/accessible/android/TraversalRule.h index 1bbc10b12392..f6f0c605ba54 100644 --- a/accessible/android/TraversalRule.h +++ b/accessible/android/TraversalRule.h @@ -45,6 +45,8 @@ class TraversalRule final : public PivotRule { uint16_t SectionMatch(Accessible* aAccessible); + uint16_t LandmarkMatch(Accessible* aAccessible); + int32_t mGranularity; }; diff --git a/dom/locales/en-US/chrome/accessibility/AccessFu.properties b/dom/locales/en-US/chrome/accessibility/AccessFu.properties index 52c1d752569f..96e7eae046f6 100644 --- a/dom/locales/en-US/chrome/accessibility/AccessFu.properties +++ b/dom/locales/en-US/chrome/accessibility/AccessFu.properties @@ -129,6 +129,7 @@ contentinfo = content info main = main navigation = navigation search = search +region = region # LOCALIZATION NOTE (tblColumnInfo): Semi-colon list of plural forms. # Number of columns within the table.