Skip to content

Commit 2dd9026

Browse files
author
Alexander Zuev
committed
8361379: [macos] Refactor accessibility code to retrieve attribute by name
Reviewed-by: angorya, arapte
1 parent 99866ae commit 2dd9026

File tree

3 files changed

+39
-81
lines changed

3 files changed

+39
-81
lines changed

modules/javafx.graphics/src/main/native-glass/mac/a11y/AccessibleBase.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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
@@ -36,6 +36,7 @@ id parent;
3636
}
3737
- (id)initWithEnv:(JNIEnv*)env accessible:(jobject)jAccessible;
3838
- (jobject)getJAccessible;
39+
- (id)requestNodeAttribute:(NSString *)attribute;
3940
- (NSRect)accessibilityFrame;
4041
- (id)accessibilityParent;
4142
- (BOOL)isAccessibilityElement;

modules/javafx.graphics/src/main/native-glass/mac/a11y/AccessibleBase.m

Lines changed: 36 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
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

modules/javafx.graphics/src/main/native-glass/mac/a11y/JFXTabGroupAccessibility.m

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,7 @@ - (id)accessibilityParent
5050

5151
- (NSArray *)accessibilityTabs
5252
{
53-
jobject jresult = NULL;
54-
GET_MAIN_JENV;
55-
if (env == NULL) return NULL;
56-
jresult = (jobject)(*env)->CallLongMethod(env, [self getJAccessible],
57-
jAccessibilityAttributeValue,
58-
(jlong)@"AXTabs");
59-
GLASS_CHECK_EXCEPTION(env);
60-
return variantToID(env, jresult);
53+
return [self requestNodeAttribute:@"AXTabs"];
6154
}
6255

6356
@end

0 commit comments

Comments
 (0)