@@ -232,6 +232,59 @@ fn ns_role(node: &Node) -> &'static NSAccessibilityRole {
232
232
}
233
233
}
234
234
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
+
235
288
pub ( crate ) fn can_be_focused ( node : & Node ) -> bool {
236
289
filter ( node) == FilterResult :: Include && node. role ( ) != Role :: Window
237
290
}
@@ -388,6 +441,13 @@ declare_class!(
388
441
. copy( )
389
442
}
390
443
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
+
391
451
#[ method_id( accessibilityRoleDescription) ]
392
452
fn role_description( & self ) -> Option <Id <NSString >> {
393
453
self . resolve( |node| {
@@ -788,6 +848,7 @@ declare_class!(
788
848
|| selector == sel!( accessibilityChildrenInNavigationOrder)
789
849
|| selector == sel!( accessibilityFrame)
790
850
|| selector == sel!( accessibilityRole)
851
+ || selector == sel!( accessibilitySubrole)
791
852
|| selector == sel!( isAccessibilityEnabled)
792
853
|| selector == sel!( accessibilityWindow)
793
854
|| selector == sel!( accessibilityTopLevelUIElement)
0 commit comments