Skip to content

Commit b6cdfd6

Browse files
committedJun 3, 2022
8287740: NSAccessibilityShowMenuAction not working for text editors
Reviewed-by: kizune, serb
1 parent 25e9901 commit b6cdfd6

File tree

2 files changed

+101
-9
lines changed

2 files changed

+101
-9
lines changed
 

Diff for: ‎src/java.desktop/macosx/native/libawt_lwawt/awt/a11y/CommonComponentAccessibility.m

+5-2
Original file line numberDiff line numberDiff line change
@@ -614,8 +614,11 @@ - (void)getActionsWithEnv:(JNIEnv *)env
614614
[fActions setObject:action forKey:NSAccessibilityPickAction];
615615
[fActionSelectors addObject:[sActionSelectors objectForKey:NSAccessibilityPickAction]];
616616
} else {
617-
[fActions setObject:action forKey:[sActions objectForKey:[action getDescription]]];
618-
[fActionSelectors addObject:[sActionSelectors objectForKey:[sActions objectForKey:[action getDescription]]]];
617+
NSString *nsActionName = [sActions objectForKey:[action getDescription]];
618+
if (nsActionName != nil) {
619+
[fActions setObject:action forKey:nsActionName];
620+
[fActionSelectors addObject:[sActionSelectors objectForKey:nsActionName]];
621+
}
619622
}
620623
[action release];
621624
}

Diff for: ‎test/jdk/java/awt/a11y/AccessibleActionsTest.java

+96-7
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
import java.awt.*;
4141
import java.awt.event.ActionEvent;
4242
import java.awt.event.ActionListener;
43+
import java.awt.event.KeyAdapter;
44+
import java.awt.event.KeyEvent;
4345
import java.util.Hashtable;
4446
import java.util.concurrent.CountDownLatch;
4547

@@ -92,6 +94,32 @@ void createTree() {
9294
super.createUI(panel, "AccessibleActionsTest");
9395
}
9496

97+
private void createEditableTextArea() {
98+
AccessibleComponentTest.INSTRUCTIONS = "INSTRUCTIONS:\n"
99+
+ "Check a11y show context menu in editable JTextArea.\n\n"
100+
+ "Turn screen reader on and press Tab to move to the text area\n"
101+
+ "Perform the VO action \"Open a shortcut menu\" (VO+Shift+m)\n\n"
102+
+ "If the menu appears tab further and press PASS, otherwise press FAIL.";
103+
104+
JTextArea textArea = new MyTextArea("some text to edit");
105+
JLabel label = new JLabel(textArea.getText().length() + " chars");
106+
label.setLabelFor(textArea);
107+
textArea.setEditable(true);
108+
textArea.addKeyListener(new KeyAdapter() {
109+
@Override
110+
public void keyReleased(KeyEvent e) {
111+
label.setText(String.valueOf(textArea.getText().length()) + " chars");
112+
}
113+
});
114+
115+
JPanel panel = new JPanel();
116+
panel.setLayout(new FlowLayout());
117+
panel.add(textArea);
118+
panel.add(label);
119+
exceptionString = "Editable text area test failed!";
120+
super.createUI(panel, "AccessibleTextTest");
121+
}
122+
95123
public static void main(String[] args) throws Exception {
96124
AccessibleActionsTest test = new AccessibleActionsTest();
97125

@@ -110,6 +138,14 @@ public static void main(String[] args) throws Exception {
110138
if (!testResult) {
111139
throw new RuntimeException(a11yTest.exceptionString);
112140
}
141+
142+
countDownLatch = test.createCountDownLatch();
143+
SwingUtilities.invokeLater(test::createEditableTextArea);
144+
countDownLatch.await();
145+
146+
if (!testResult) {
147+
throw new RuntimeException(a11yTest.exceptionString);
148+
}
113149
}
114150

115151
private class AccessibleActionsTestFrame extends JPanel {
@@ -167,17 +203,70 @@ public boolean doAccessibleAction(int i) {
167203
}
168204
}
169205

170-
private static JPopupMenu createPopup() {
171-
JPopupMenu popup = new JPopupMenu("MENU");
172-
popup.add("One");
173-
popup.add("Two");
174-
popup.add("Three");
175-
return popup;
176-
}
206+
177207

178208
private static void changeText(JLabel label, String text) {
179209
label.setText(text);
180210
}
181211

182212
}
213+
214+
private static class MyTextArea extends JTextArea {
215+
216+
public MyTextArea(String some_text_to_edit) {
217+
}
218+
219+
@Override
220+
public AccessibleContext getAccessibleContext() {
221+
if (accessibleContext == null) {
222+
accessibleContext = new MyAccessibleJTextArea();
223+
}
224+
return accessibleContext;
225+
}
226+
227+
private class MyAccessibleJTextArea extends JTextArea.AccessibleJTextArea {
228+
@Override
229+
public AccessibleAction getAccessibleAction() {
230+
return new AccessibleAction() {
231+
@Override
232+
public int getAccessibleActionCount() {
233+
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
234+
if (aa == null) {
235+
return 1;
236+
}
237+
int count = aa.getAccessibleActionCount();
238+
return aa.getAccessibleActionCount() + 1;
239+
}
240+
241+
@Override
242+
public String getAccessibleActionDescription(int i) {
243+
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
244+
if ((aa != null) && (i >= 0) && (i < aa.getAccessibleActionCount())) {
245+
return aa.getAccessibleActionDescription(i);
246+
}
247+
return AccessibleAction.TOGGLE_POPUP;
248+
}
249+
250+
@Override
251+
public boolean doAccessibleAction(int i) {
252+
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
253+
if ((aa != null) && (i >= 0) && (i < aa.getAccessibleActionCount())) {
254+
return aa.doAccessibleAction(i);
255+
}
256+
JPopupMenu popup = createPopup();
257+
popup.show(MyTextArea.this, 0, 0);
258+
return true;
259+
}
260+
};
261+
}
262+
}
263+
}
264+
265+
private static JPopupMenu createPopup() {
266+
JPopupMenu popup = new JPopupMenu("MENU");
267+
popup.add("One");
268+
popup.add("Two");
269+
popup.add("Three");
270+
return popup;
271+
}
183272
}

0 commit comments

Comments
 (0)