commit b861d8457b844f5d4ce0fcf210a15213485d6371
parent da1a6f2a67e667a1f191fa443d41019c64005aad
Author: Eitan Isaacson <eitan@monotonous.org>
Date: Wed, 22 Oct 2025 03:12:54 +0000
Bug 1942799 - P4: Remove specialized moxRole and provide AXTextField/AXTextArea role to contenteditable. r=Jamie
Differential Revision: https://phabricator.services.mozilla.com/D268630
Diffstat:
4 files changed, 41 insertions(+), 11 deletions(-)
diff --git a/accessible/mac/mozAccessible.mm b/accessible/mac/mozAccessible.mm
@@ -292,6 +292,17 @@ using namespace mozilla::a11y;
}
- (NSString*)moxRole {
+ if (mRole == roles::ENTRY ||
+ (mGeckoAccessible->IsGeneric() && mGeckoAccessible->IsEditableRoot())) {
+ if ([self stateWithMask:states::MULTI_LINE]) {
+ // This is a special case where we have a separate role when an entry is a
+ // multiline text area.
+ return NSAccessibilityTextAreaRole;
+ }
+
+ return NSAccessibilityTextFieldRole;
+ }
+
#define ROLE(geckoRole, stringRole, ariaRole, atkRole, macRole, macSubrole, \
msaaRole, ia2Role, androidClass, iosIsElement, uiaControlType, \
nameRule) \
diff --git a/accessible/mac/mozTextAccessible.h b/accessible/mac/mozTextAccessible.h
@@ -13,9 +13,6 @@
- (NSNumber*)moxInsertionPointLineNumber;
// override
-- (NSString*)moxRole;
-
-// override
- (NSNumber*)moxNumberOfCharacters;
// override
diff --git a/accessible/mac/mozTextAccessible.mm b/accessible/mac/mozTextAccessible.mm
@@ -61,14 +61,6 @@ inline NSString* ToNSString(id aValue) {
return (lineNumber >= 0) ? [NSNumber numberWithInt:lineNumber] : nil;
}
-- (NSString*)moxRole {
- if (mRole == roles::ENTRY && [self stateWithMask:states::MULTI_LINE]) {
- return NSAccessibilityTextAreaRole;
- }
-
- return [super moxRole];
-}
-
- (NSNumber*)moxNumberOfCharacters {
return @([self textLength]);
}
diff --git a/accessible/tests/browser/mac/browser_input.js b/accessible/tests/browser/mac/browser_input.js
@@ -130,6 +130,36 @@ addAccessibleTask(
);
/**
+ * contenteditable selection test with no role
+ */
+addAccessibleTask(
+ `<div aria-label="Name" id="no-role-editable" contenteditable>
+ <p>Elmer Fudd</p>
+ </div>
+ <div aria-label="Name" id="no-role-editable-single-line" aria-multiline="false" contenteditable>
+ <p>Elmer Fudd</p>
+ </div>`,
+ async (browser, accDoc) => {
+ const noRoleEditable = getNativeInterface(accDoc, "no-role-editable");
+ is(
+ noRoleEditable.getAttributeValue("AXRole"),
+ "AXTextArea",
+ "Correct role for multi-line contenteditable with no role"
+ );
+
+ const noRoleEditableSingleLine = getNativeInterface(
+ accDoc,
+ "no-role-editable-single-line"
+ );
+ is(
+ noRoleEditableSingleLine.getAttributeValue("AXRole"),
+ "AXTextField",
+ "Correct role for single-line contenteditable with no role"
+ );
+ }
+);
+
+/**
* contenteditable selection test
*/
addAccessibleTask(