tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit c391c9efc79471c647c4918abac4d24afaa7c923
parent 6448a82fffee3d405e33034eb99bc0d6766ebbd0
Author: Eitan Isaacson <eitan@monotonous.org>
Date:   Fri, 21 Nov 2025 18:48:42 +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:
Maccessible/base/nsTextEquivUtils.cpp | 28++++++++++++++++------------
Maccessible/base/nsTextEquivUtils.h | 16++++++++++------
Maccessible/generic/LocalAccessible.cpp | 16++++++----------
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(),