11/*
2- * Copyright (c) 2023, 2024 , Oracle and/or its affiliates. All rights reserved.
2+ * Copyright (c) 2023, 2025 , Oracle and/or its affiliates. All rights reserved.
33 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44 *
55 * This code is free software; you can redistribute it and/or modify it
@@ -47,8 +47,7 @@ + (void) initializeRolesMap {
4747 [rolesMap setObject: @" JFXButtonAccessibility" forKey: @" INCREMENT_BUTTON" ];
4848 [rolesMap setObject: @" JFXButtonAccessibility" forKey: @" SPLIT_MENU_BUTTON" ];
4949 [rolesMap setObject: @" JFXRadiobuttonAccessibility" forKey: @" RADIO_BUTTON" ];
50- // Requires TAB_GROUP to be implemented first
51- // [rolesMap setObject:@"JFXRadiobuttonAccessibility" forKey:@"TAB_ITEM"];
50+ [rolesMap setObject: @" JFXRadiobuttonAccessibility" forKey: @" TAB_ITEM" ];
5251 [rolesMap setObject: @" JFXRadiobuttonAccessibility" forKey: @" PAGE_ITEM" ];
5352 [rolesMap setObject: @" JFXCheckboxAccessibility" forKey: @" CHECK_BOX" ];
5453 [rolesMap setObject: @" JFXCheckboxAccessibility" forKey: @" TOGGLE_BUTTON" ];
@@ -102,101 +101,69 @@ - (jobject)getJAccessible
102101 return self->jAccessible ;
103102}
104103
105- - (id )accessibilityValue
104+ /*
105+ * Request accessibility attribute by name from JavaFX Node. Returns attribute value
106+ * converted to the native format or NULL if attribute with that name does not exist.
107+ * Code that uses this function needs to convert NULL to the default value of a certain type where required.
108+ */
109+ - (id )requestNodeAttribute : (NSString *)attribute
106110{
107- jobject jresult = NULL ;
108111 GET_MAIN_JENV;
109112 if (env == NULL ) return NULL ;
110- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue, (jlong)@" AXValue" );
113+ jobject jresult = (jobject)(*env)->CallLongMethod (env, [self getJAccessible ],
114+ jAccessibilityAttributeValue, (jlong)attribute);
111115 GLASS_CHECK_EXCEPTION (env);
112116 return variantToID (env, jresult);
113117}
114118
119+ - (id )accessibilityValue
120+ {
121+ return [self requestNodeAttribute: @" AXValue" ];
122+ }
123+
115124- (id )accessibilityMinValue
116125{
117- jobject jresult = NULL ;
118- GET_MAIN_JENV;
119- if (env == NULL ) return NULL ;
120- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible ,
121- jAccessibilityAttributeValue, (jlong)@" AXMinValue" );
122- GLASS_CHECK_EXCEPTION (env);
123- return variantToID (env, jresult);
126+ return [self requestNodeAttribute: @" AXMinValue" ];
124127}
125128
126129- (id )accessibilityMaxValue
127130{
128- jobject jresult = NULL ;
129- GET_MAIN_JENV;
130- if (env == NULL ) return NULL ;
131- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible ,
132- jAccessibilityAttributeValue, (jlong)@" AXMaxValue" );
133- GLASS_CHECK_EXCEPTION (env);
134- return variantToID (env, jresult);
131+ return [self requestNodeAttribute: @" AXMaxValue" ];
135132}
136133
137134- (NSString *)accessibilityLabel
138135{
139- // Use the same value that is set for accessibilityTitle - some component
136+ // Use the same value that is set for accessibilityTitle - some components
140137 // do not have titles and request it as a label
141138 return [self accessibilityTitle ];
142139}
143140
144141- (id )accessibilityParent
145142{
146143 if (parent == nil ) {
147- jobject jresult = NULL ;
148- GET_MAIN_JENV;
149- if (env == NULL ) return NULL ;
150- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue,
151- (jlong) @" AXParent" );
152- GLASS_CHECK_EXCEPTION (env);
153- parent = variantToID (env, jresult);
144+ parent = [self requestNodeAttribute: @" AXParent" ];
154145 }
155146 return parent;
156147}
157148
158149- (id )accessibilityTitle
159150{
160- jobject jresult = NULL ;
161- GET_MAIN_JENV;
162- if (env == NULL ) return NULL ;
163- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible ,
164- jAccessibilityAttributeValue, (jlong)@" AXTitle" );
165- GLASS_CHECK_EXCEPTION (env);
166- return variantToID (env, jresult);
151+ return [self requestNodeAttribute: @" AXTitle" ];
167152}
168153
169154- (id )accessibilityTitleUIElement
170155{
171- jobject jresult = NULL ;
172- GET_MAIN_JENV;
173- if (env == NULL ) return NULL ;
174- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue,
175- (jlong)@" AXTitleUIElement" );
176- GLASS_CHECK_EXCEPTION (env);
177- return variantToID (env, jresult);
156+ return [self requestNodeAttribute: @" AXTitleUIElement" ];
178157}
179158
180159- (NSArray *)accessibilityChildren
181160{
182- jobject jresult = NULL ;
183- GET_MAIN_JENV;
184- if (env == NULL ) return NULL ;
185- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible ,
186- jAccessibilityAttributeValue, (jlong)@" AXChildren" );
187- GLASS_CHECK_EXCEPTION (env);
188- return variantToID (env, jresult);
161+ return [self requestNodeAttribute: @" AXChildren" ];
189162}
190163
191164- (id )accessibilityRoleDescription
192165{
193- jobject jresult = NULL ;
194- GET_MAIN_JENV;
195- if (env == NULL ) return NULL ;
196- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue,
197- (jlong)@" AXRoleDescription" );
198- GLASS_CHECK_EXCEPTION (env);
199- return variantToID (env, jresult);
166+ return [self requestNodeAttribute: @" AXRoleDescription" ];
200167}
201168
202169
@@ -219,15 +186,13 @@ - (BOOL)performAccessibleAction:(NSString *)action
219186
220187- (NSRect )accessibilityFrame
221188{
222- jobject jresult = NULL ;
223- GET_MAIN_JENV;
224- if (env == NULL ) return NSZeroRect ;
225- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue, (jlong)@" AXPosition" );
226- GLASS_CHECK_EXCEPTION (env);
227- NSPoint position = [variantToID (env, jresult) pointValue ];
228- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue, (jlong)@" AXSize" );
229- GLASS_CHECK_EXCEPTION (env);
230- NSSize size = [variantToID (env, jresult) sizeValue ];
189+ id p = [self requestNodeAttribute: @" AXPosition" ];
190+ id s = [self requestNodeAttribute: @" AXSize" ];
191+ if (p == NULL || s == NULL ) {
192+ return NSZeroRect ;
193+ }
194+ NSPoint position = [p pointValue ];
195+ NSSize size = [s sizeValue ];
231196 return NSMakeRect (position.x , position.y , size.width , size.height );
232197}
233198
@@ -244,13 +209,12 @@ - (void)clearParent
244209
245210- (BOOL )isAccessibilityFocused
246211{
247- jobject jresult = NULL ;
248- GET_MAIN_JENV;
249- if (env == NULL ) return NO ;
250- jresult = (jobject)(*env)->CallLongMethod (env, self->jAccessible , jAccessibilityAttributeValue, (jlong)@" AXFocused" );
251- GLASS_CHECK_EXCEPTION (env);
252-
253- return [variantToID (env, jresult) boolValue ];
212+ id retval = [self requestNodeAttribute: @" AXFocused" ];
213+ if (retval == NULL ) {
214+ return NO ;
215+ } else {
216+ return [retval boolValue ];
217+ }
254218}
255219
256220- (void )setAccessibilityFocused : (BOOL )value
0 commit comments