commit f30cc8c2c8553665a04cf9a5cc03bf599bc810f6
parent 312430263f0e0b57778fbe11afcc3f95cba2af97
Author: Eitan Isaacson <eitan@monotonous.org>
Date: Fri, 21 Nov 2025 06:38:07 +0000
Bug 1998255 - P2: Have GetTextEquivFromIDRefs return true if it used hidden content or referenced itself. r=morgan
We will use this later to determine if this name can be calculated
purely with relations or if we should cache the locally-calculated name.
Depends on D272725
Differential Revision: https://phabricator.services.mozilla.com/D272726
Diffstat:
3 files changed, 32 insertions(+), 28 deletions(-)
diff --git a/accessible/base/nsTextEquivUtils.cpp b/accessible/base/nsTextEquivUtils.cpp
@@ -96,9 +96,10 @@ nsresult nsTextEquivUtils::GetNameFromSubtree(const Accessible* aAccessible,
return NS_OK;
}
-nsresult nsTextEquivUtils::GetTextEquivFromIDRefs(
+bool nsTextEquivUtils::GetTextEquivFromIDRefs(
const LocalAccessible* aAccessible, nsAtom* aIDRefsAttr,
nsAString& aTextEquiv) {
+ bool usedHiddenOrSelf = false;
// If this is an aria-labelledby or aria-describedby traversal and we're
// already in such a traversal, or if we've already consulted the given
// accessible, early out.
@@ -106,13 +107,15 @@ nsresult nsTextEquivUtils::GetTextEquivFromIDRefs(
aIDRefsAttr == nsGkAtoms::aria_describedby;
if ((sInAriaRelationTraversal && isAriaTraversal) ||
GetReferencedAccs().Contains(aAccessible)) {
- return NS_OK;
+ return usedHiddenOrSelf;
}
aTextEquiv.Truncate();
nsIContent* content = aAccessible->GetContent();
- if (!content) return NS_OK;
+ if (!content) {
+ return usedHiddenOrSelf;
+ }
nsIContent* refContent = nullptr;
AssociatedElementsIterator iter(aAccessible->Document(), content,
@@ -132,23 +135,23 @@ nsresult nsTextEquivUtils::GetTextEquivFromIDRefs(
sInAriaRelationTraversal = false;
}
});
- nsresult rv =
+ usedHiddenOrSelf |=
AppendTextEquivFromContent(aAccessible, refContent, &aTextEquiv);
- NS_ENSURE_SUCCESS(rv, rv);
}
- return NS_OK;
+ return usedHiddenOrSelf;
}
-nsresult nsTextEquivUtils::AppendTextEquivFromContent(
+bool nsTextEquivUtils::AppendTextEquivFromContent(
const LocalAccessible* aInitiatorAcc, nsIContent* aContent,
nsAString* aString) {
// Prevent recursion which can cause infinite loops.
LocalAccessible* accessible =
aInitiatorAcc->Document()->GetAccessible(aContent);
+ bool usedHiddenOrSelf = aInitiatorAcc == accessible;
if (GetReferencedAccs().Contains(aInitiatorAcc) ||
GetReferencedAccs().Contains(accessible)) {
- return NS_OK;
+ return usedHiddenOrSelf;
}
// Remember the initiating accessible so we know when we've returned to it.
@@ -157,14 +160,14 @@ nsresult nsTextEquivUtils::AppendTextEquivFromContent(
}
GetReferencedAccs().Insert(aInitiatorAcc);
- nsresult rv = NS_ERROR_FAILURE;
if (accessible) {
- rv = AppendFromAccessible(accessible, aString);
+ AppendFromAccessible(accessible, aString);
GetReferencedAccs().Insert(accessible);
} else {
// The given content is invisible or otherwise inaccessible, so use the DOM
// subtree.
- rv = AppendFromDOMNode(aContent, aString);
+ AppendFromDOMNode(aContent, aString);
+ usedHiddenOrSelf = true;
}
// Once the text alternative computation is complete (i.e., once we've
@@ -174,7 +177,8 @@ nsresult nsTextEquivUtils::AppendTextEquivFromContent(
GetReferencedAccs().Clear();
sInitiatorAcc = nullptr;
}
- return rv;
+
+ return usedHiddenOrSelf;
}
nsresult nsTextEquivUtils::AppendTextEquivFromTextContent(nsIContent* aContent,
diff --git a/accessible/base/nsTextEquivUtils.h b/accessible/base/nsTextEquivUtils.h
@@ -91,10 +91,12 @@ class nsTextEquivUtils {
* @param aAccessible [in] the accessible text equivalent is computed for
* @param aIDRefsAttr [in] IDRefs attribute on DOM node of the accessible
* @param aTextEquiv [out] result text equivalent
+ * @return true if either hidden content was used to compute the text
+ * equivalent, or if the initiator accessible itself was used.
*/
- static nsresult GetTextEquivFromIDRefs(const LocalAccessible* aAccessible,
- nsAtom* aIDRefsAttr,
- nsAString& aTextEquiv);
+ static bool GetTextEquivFromIDRefs(const LocalAccessible* aAccessible,
+ nsAtom* aIDRefsAttr,
+ nsAString& aTextEquiv);
/**
* Calculates the text equivalent from the given content - and its subtree, if
@@ -106,10 +108,12 @@ class nsTextEquivUtils {
* @param aContent [in] the given content the text equivalent is
* computed from
* @param aString [in, out] the string
+ * @return true if either hidden content was used to compute the text
+ * equivalent, or if the initiator accessible itself was used.
*/
- static nsresult AppendTextEquivFromContent(
- const LocalAccessible* aInitiatorAcc, nsIContent* aContent,
- nsAString* aString);
+ static bool AppendTextEquivFromContent(const LocalAccessible* aInitiatorAcc,
+ nsIContent* aContent,
+ nsAString* aString);
/**
* Calculates the text equivalent from the given text content (may be text
diff --git a/accessible/generic/LocalAccessible.cpp b/accessible/generic/LocalAccessible.cpp
@@ -2601,11 +2601,9 @@ ENameValueFlag LocalAccessible::ARIAName(nsString& aName) const {
return eNameOK;
}
// aria-labelledby now takes precedence over aria-label
- nsresult rv = nsTextEquivUtils::GetTextEquivFromIDRefs(
- this, nsGkAtoms::aria_labelledby, aName);
- if (NS_SUCCEEDED(rv)) {
- aName.CompressWhitespace();
- }
+ nsTextEquivUtils::GetTextEquivFromIDRefs(this, nsGkAtoms::aria_labelledby,
+ aName);
+ aName.CompressWhitespace();
if (!aName.IsEmpty()) {
return eNameFromRelations;
@@ -2623,11 +2621,9 @@ ENameValueFlag LocalAccessible::ARIAName(nsString& aName) const {
// LocalAccessible protected
bool LocalAccessible::ARIADescription(nsString& aDescription) const {
// aria-describedby takes precedence over aria-description
- nsresult rv = nsTextEquivUtils::GetTextEquivFromIDRefs(
- this, nsGkAtoms::aria_describedby, aDescription);
- if (NS_SUCCEEDED(rv)) {
- aDescription.CompressWhitespace();
- }
+ nsTextEquivUtils::GetTextEquivFromIDRefs(this, nsGkAtoms::aria_describedby,
+ aDescription);
+ aDescription.CompressWhitespace();
if (aDescription.IsEmpty() && mContent->IsElement() &&
nsAccUtils::GetARIAAttr(mContent->AsElement(),