tor-browser

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

commit ab72073e90997d16ced08deb2b8f102f328beaa3
parent 6f8ce310653122f16ecb10133063a9cf0ad47f55
Author: Eitan Isaacson <eitan@monotonous.org>
Date:   Fri, 21 Nov 2025 06:38:06 +0000

Bug 1998242 - P4: Break up name calculation to allow remote subtree calc. r=morgan

LocalAccessible::Name now has 3 parts:
1. DirectName() - Gets name from aria and native attributes and labels, if
   nothing retrieved:
2. nsTextEquivUtils::GetNameFromSubtree() - Walks the accessible subtree
   to construct a name. If nothing retrieved:
3. Tooltip - get the name from the accessible's toolkit.

Since GetNameFromSubtree is factored out of NativeName, falling back
on alt and value in input[type=image] doesn't work anymore. But this
just brings us more in line with how regular img element names are
calculated, so I think that is fine.

Depends on D271311

Differential Revision: https://phabricator.services.mozilla.com/D271312

Diffstat:
Maccessible/base/CssAltContent.cpp | 4++++
Maccessible/generic/LocalAccessible.cpp | 42++++++++++++++++++++++++------------------
Maccessible/html/HTMLElementAccessibles.cpp | 3+--
Maccessible/tests/mochitest/name/markuprules.xml | 4++--
Maccessible/xul/XULElementAccessibles.cpp | 5+----
5 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/accessible/base/CssAltContent.cpp b/accessible/base/CssAltContent.cpp @@ -17,6 +17,10 @@ namespace mozilla::a11y { CssAltContent::CssAltContent(nsIContent* aContent) { + if (!aContent) { + return; + } + nsIFrame* frame = aContent->GetPrimaryFrame(); if (!frame) { return; diff --git a/accessible/generic/LocalAccessible.cpp b/accessible/generic/LocalAccessible.cpp @@ -126,16 +126,26 @@ LocalAccessible::~LocalAccessible() { } ENameValueFlag LocalAccessible::DirectName(nsString& aName) const { - aName.Truncate(); - if (!HasOwnContent()) return eNameOK; ENameValueFlag nameFlag = ARIAName(aName); if (!aName.IsEmpty()) return nameFlag; nameFlag = NativeName(aName); + aName.CompressWhitespace(); + + return nameFlag; +} + +ENameValueFlag LocalAccessible::Name(nsString& aName) const { + aName.Truncate(); + + ENameValueFlag nameFlag = DirectName(aName); if (!aName.IsEmpty()) return nameFlag; + nsTextEquivUtils::GetNameFromSubtree(this, aName); + if (!aName.IsEmpty()) return eNameFromSubtree; + // In the end get the name from tooltip. if (Tooltip(aName)) { return eNameFromTooltip; @@ -148,11 +158,7 @@ ENameValueFlag LocalAccessible::DirectName(nsString& aName) const { aName.SetIsVoid(true); - return nameFlag; -} - -ENameValueFlag LocalAccessible::Name(nsString& aName) const { - return DirectName(aName); + return eNameOK; } EDescriptionValueFlag LocalAccessible::Description( @@ -1535,13 +1541,9 @@ void LocalAccessible::DOMAttributeChanged(int32_t aNameSpaceID, if (aAttribute == nsGkAtoms::title) { nsAutoString name; - ARIAName(name); - if (name.IsEmpty()) { - NativeName(name); - if (name.IsEmpty()) { - mDoc->FireDelayedEvent(nsIAccessibleEvent::EVENT_NAME_CHANGE, this); - return; - } + if (Name(name) == eNameFromTooltip || name.IsVoid()) { + mDoc->FireDelayedEvent(nsIAccessibleEvent::EVENT_NAME_CHANGE, this); + return; } if (!elm->HasAttr(nsGkAtoms::aria_describedby)) { @@ -2685,16 +2687,20 @@ ENameValueFlag LocalAccessible::NativeName(nsString& aName) const { return eNameOK; } - nsTextEquivUtils::GetNameFromSubtree(this, aName); - return aName.IsEmpty() ? eNameOK : eNameFromSubtree; + // We return eNameFromSubtree here to indicate that if there is no native + // name we will calculate the name from the subtree next. This is useful for + // noting where the name will come from in cases like name change + // notifications. + return eNameFromSubtree; } if (mContent->IsXULElement()) { XULElmName(mDoc, mContent, aName); if (!aName.IsEmpty()) return eNameOK; - nsTextEquivUtils::GetNameFromSubtree(this, aName); - return aName.IsEmpty() ? eNameOK : eNameFromSubtree; + // We return eNameFromSubtree here to indicate that if there is no native + // name we will calculate the name from the subtree next. See above. + return eNameFromSubtree; } if (mContent->IsSVGElement()) { diff --git a/accessible/html/HTMLElementAccessibles.cpp b/accessible/html/HTMLElementAccessibles.cpp @@ -42,8 +42,7 @@ ENameValueFlag HTMLBRAccessible::NativeName(nsString& aName) const { //////////////////////////////////////////////////////////////////////////////// ENameValueFlag HTMLLabelAccessible::NativeName(nsString& aName) const { - nsTextEquivUtils::GetNameFromSubtree(this, aName); - return aName.IsEmpty() ? eNameOK : eNameFromSubtree; + return eNameOK; } Relation HTMLLabelAccessible::RelationByType(RelationType aType) const { diff --git a/accessible/tests/mochitest/name/markuprules.xml b/accessible/tests/mochitest/name/markuprules.xml @@ -141,8 +141,8 @@ <ruleset id="HTMLInputImageNoValidSrc" defaultName="Submit Query"> <ruleset ref="HTMLControl:Head"/> - <rule attr="alt" type="string" explicit-name="false"/> - <rule attr="value" type="string" explicit-name="false"/> + <rule attr="alt" type="string"/> + <rule attr="value" type="string"/> </ruleset> <ruleset id="HTMLOption"> diff --git a/accessible/xul/XULElementAccessibles.cpp b/accessible/xul/XULElementAccessibles.cpp @@ -146,10 +146,7 @@ void XULLinkAccessible::Value(nsString& aValue) const { ENameValueFlag XULLinkAccessible::NativeName(nsString& aName) const { mContent->AsElement()->GetAttr(nsGkAtoms::value, aName); - if (!aName.IsEmpty()) return eNameOK; - - nsTextEquivUtils::GetNameFromSubtree(this, aName); - return aName.IsEmpty() ? eNameOK : eNameFromSubtree; + return eNameOK; } role XULLinkAccessible::NativeRole() const { return roles::LINK; }