commit 0d01bdd7e041e925dff8a383c751df0e6434b919
parent 9ee273d6c6f18aa20d5bce2d9dd555620f0414d2
Author: Eitan Isaacson <eitan@monotonous.org>
Date: Thu, 20 Nov 2025 03:53:14 +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:
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
@@ -125,16 +125,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;
@@ -147,11 +157,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(
@@ -1534,13 +1540,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)) {
@@ -2680,16 +2682,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; }