Skip to content

Commit 40ad828

Browse files
fix: Add sub roles to MacOS adapter (#480)
1 parent 9634fc2 commit 40ad828

File tree

1 file changed

+61
-0
lines changed

1 file changed

+61
-0
lines changed

platforms/macos/src/node.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,59 @@ fn ns_role(node: &Node) -> &'static NSAccessibilityRole {
232232
}
233233
}
234234

235+
fn ns_sub_role(node: &Node) -> &'static NSAccessibilitySubrole {
236+
let role = node.role();
237+
238+
unsafe {
239+
match role {
240+
Role::Alert => ns_string!("AXApplicationAlert"),
241+
Role::AlertDialog => ns_string!("AXApplicationAlertDialog"),
242+
Role::Article => ns_string!("AXDocumentArticle"),
243+
Role::Banner => ns_string!("AXLandmarkBanner"),
244+
Role::Button if node.toggled().is_some() => NSAccessibilityToggleSubrole,
245+
Role::Code => ns_string!("AXCodeStyleGroup"),
246+
Role::Complementary => ns_string!("AXLandmarkComplementary"),
247+
Role::ContentDeletion => ns_string!("AXDeleteStyleGroup"),
248+
Role::ContentInsertion => ns_string!("AXInsertStyleGroup"),
249+
Role::ContentInfo => ns_string!("AXLandmarkContentInfo"),
250+
Role::Definition => ns_string!("AXDefinition"),
251+
Role::Dialog => NSAccessibilityDialogSubrole,
252+
Role::Document => ns_string!("AXDocument"),
253+
Role::Emphasis => ns_string!("AXEmphasisStyleGroup"),
254+
Role::Feed => ns_string!("AXApplicationGroup"),
255+
Role::Footer => ns_string!("AXLandmarkContentInfo"),
256+
Role::Form => ns_string!("AXLandmarkForm"),
257+
Role::GraphicsDocument => ns_string!("AXDocument"),
258+
Role::Group => ns_string!("AXApplicationGroup"),
259+
Role::Header => ns_string!("AXLandmarkBanner"),
260+
Role::LayoutTableCell => NSAccessibilityGroupRole,
261+
Role::LayoutTableRow => NSAccessibilityTableRowSubrole,
262+
Role::Log => ns_string!("AXApplicationLog"),
263+
Role::Main => ns_string!("AXLandmarkMain"),
264+
Role::Marquee => ns_string!("AXApplicationMarquee"),
265+
Role::Math => ns_string!("AXDocumentMath"),
266+
Role::Meter => ns_string!("AXMeter"),
267+
Role::Navigation => ns_string!("AXLandmarkNavigation"),
268+
Role::Note => ns_string!("AXDocumentNote"),
269+
Role::PasswordInput => NSAccessibilitySecureTextFieldSubrole,
270+
Role::Region => ns_string!("AXLandmarkRegion"),
271+
Role::Search => ns_string!("AXLandmarkSearch"),
272+
Role::SearchInput => NSAccessibilitySearchFieldSubrole,
273+
Role::Status => ns_string!("AXApplicationStatus"),
274+
Role::Strong => ns_string!("AXStrongStyleGroup"),
275+
Role::Switch => NSAccessibilitySwitchSubrole,
276+
Role::Tab => NSAccessibilityTabButtonSubrole,
277+
Role::TabPanel => ns_string!("AXTabPanel"),
278+
Role::Term => ns_string!("AXTerm"),
279+
Role::Time => ns_string!("AXTimeGroup"),
280+
Role::Timer => ns_string!("AXApplicationTimer"),
281+
Role::TreeItem => NSAccessibilityOutlineRowSubrole,
282+
Role::Tooltip => ns_string!("AXUserInterfaceTooltip"),
283+
_ => NSAccessibilityUnknownSubrole,
284+
}
285+
}
286+
}
287+
235288
pub(crate) fn can_be_focused(node: &Node) -> bool {
236289
filter(node) == FilterResult::Include && node.role() != Role::Window
237290
}
@@ -388,6 +441,13 @@ declare_class!(
388441
.copy()
389442
}
390443

444+
#[method_id(accessibilitySubrole)]
445+
fn sub_role(&self) -> Id<NSAccessibilitySubrole> {
446+
self.resolve(ns_sub_role)
447+
.unwrap_or(unsafe { NSAccessibilityUnknownSubrole })
448+
.copy()
449+
}
450+
391451
#[method_id(accessibilityRoleDescription)]
392452
fn role_description(&self) -> Option<Id<NSString>> {
393453
self.resolve(|node| {
@@ -788,6 +848,7 @@ declare_class!(
788848
|| selector == sel!(accessibilityChildrenInNavigationOrder)
789849
|| selector == sel!(accessibilityFrame)
790850
|| selector == sel!(accessibilityRole)
851+
|| selector == sel!(accessibilitySubrole)
791852
|| selector == sel!(isAccessibilityEnabled)
792853
|| selector == sel!(accessibilityWindow)
793854
|| selector == sel!(accessibilityTopLevelUIElement)

0 commit comments

Comments
 (0)