From 5e15843b047e8c9d334e148be9cd296f6242587c Mon Sep 17 00:00:00 2001 From: Eitan Isaacson Date: Tue, 22 Apr 2025 22:07:02 +0000 Subject: [PATCH] Bug 1838502 - Don't expose a title for labels. r=morgan THis is what VO expects, we apparently knew that but decided it wasn't worth fixing in the past Differential Revision: https://phabricator.services.mozilla.com/D244050 --- accessible/mac/AccessibleWrap.mm | 3 +++ accessible/mac/mozAccessible.mm | 21 ++++++++----------- accessible/mac/mozHTMLAccessible.h | 7 +++++++ accessible/mac/mozHTMLAccessible.mm | 8 +++++++ .../tests/browser/mac/browser_label_title.js | 4 ++-- 5 files changed, 29 insertions(+), 14 deletions(-) diff --git a/accessible/mac/AccessibleWrap.mm b/accessible/mac/AccessibleWrap.mm index 801d41845ded..44a6a9f83bcb 100644 --- a/accessible/mac/AccessibleWrap.mm +++ b/accessible/mac/AccessibleWrap.mm @@ -307,6 +307,9 @@ Class a11y::GetTypeFromRole(roles::Role aRole) { case roles::OUTLINEITEM: return [mozOutlineRowAccessible class]; + case roles::LABEL: + return [MOXLabelAccessible class]; + default: return [mozAccessible class]; } diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm index bc4c329772b1..95582b56746e 100644 --- a/accessible/mac/mozAccessible.mm +++ b/accessible/mac/mozAccessible.mm @@ -887,22 +887,19 @@ struct RoleDescrComparator { : nullptr; if (maybeRoot && maybeRoot->IsRoot() && [[self moxDOMIdentifier] isEqualToString:@"a11y-announcement"]) { - // Our actual announcement should be stored as a child of the alert, - // so we verify a child exists, and then query that child below. - NSArray* children = [self moxChildren]; - MOZ_ASSERT([children count] == 1 && children[0], - "A11yUtil event received, but no announcement found?"); - - mozAccessible* announcement = children[0]; - NSString* key; - if ([announcement providesLabelNotTitle]) { - key = [announcement moxLabel]; + nsAutoString name; + // Our actual announcement should be stored as a child of the alert. + if (Accessible* announcement = mGeckoAccessible->FirstChild()) { + announcement->Name(name); } else { - key = [announcement moxTitle]; + MOZ_ASSERT_UNREACHABLE( + "A11yUtil event received, but no announcement found?"); } NSDictionary* info = @{ - NSAccessibilityAnnouncementKey : key ? key : @(""), + NSAccessibilityAnnouncementKey : name.IsEmpty() + ? @("") + : nsCocoaUtils::ToNSString(name), // High priority means VO will stop what it is currently speaking // to speak our announcement. NSAccessibilityPriorityKey : @(NSAccessibilityPriorityHigh) diff --git a/accessible/mac/mozHTMLAccessible.h b/accessible/mac/mozHTMLAccessible.h index 48fd4b0bdc47..02a55960dfb7 100644 --- a/accessible/mac/mozHTMLAccessible.h +++ b/accessible/mac/mozHTMLAccessible.h @@ -42,3 +42,10 @@ - (NSString*)moxTitle; @end + +@interface MOXLabelAccessible : mozAccessible + +// override +- (NSString*)moxTitle; + +@end diff --git a/accessible/mac/mozHTMLAccessible.mm b/accessible/mac/mozHTMLAccessible.mm index 09680033419f..feb2c5d66023 100644 --- a/accessible/mac/mozHTMLAccessible.mm +++ b/accessible/mac/mozHTMLAccessible.mm @@ -81,3 +81,11 @@ using namespace mozilla::a11y; } @end + +@implementation MOXLabelAccessible + +- (NSString*)moxTitle { + return @""; +} + +@end diff --git a/accessible/tests/browser/mac/browser_label_title.js b/accessible/tests/browser/mac/browser_label_title.js index f5bdd3933462..233b0befcf64 100644 --- a/accessible/tests/browser/mac/browser_label_title.js +++ b/accessible/tests/browser/mac/browser_label_title.js @@ -22,8 +22,8 @@ addAccessibleTask( let n1 = getNativeInterface(accDoc, "n1"); let n1Label = n1.getAttributeValue("AXTitleUIElement"); // XXX: In Safari the label is an AXText with an AXValue, - // here it is an AXGroup witth an AXTitle - is(n1Label.getAttributeValue("AXTitle"), "Label"); + // we emulate that so VoiceOver does not speak the label twice. + is(n1Label.getAttributeValue("AXTitle"), ""); let n2 = getNativeInterface(accDoc, "n2"); is(n2.getAttributeValue("AXDescription"), "Two Labels");