tor-browser

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

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:
Maccessible/mac/mozAccessible.mm | 11+++++++++++
Maccessible/mac/mozTextAccessible.h | 3---
Maccessible/mac/mozTextAccessible.mm | 8--------
Maccessible/tests/browser/mac/browser_input.js | 30++++++++++++++++++++++++++++++
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(