Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

8287740: NSAccessibilityShowMenuAction not working for text editors #830

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -615,8 +615,11 @@ - (void)getActionsWithEnv:(JNIEnv *)env
[fActions setObject:action forKey:NSAccessibilityPickAction];
[fActionSelectors addObject:[sActionSelectors objectForKey:NSAccessibilityPickAction]];
} else {
[fActions setObject:action forKey:[sActions objectForKey:[action getDescription]]];
[fActionSelectors addObject:[sActionSelectors objectForKey:[sActions objectForKey:[action getDescription]]]];
NSString *nsActionName = [sActions objectForKey:[action getDescription]];
if (nsActionName != nil) {
[fActions setObject:action forKey:nsActionName];
[fActionSelectors addObject:[sActionSelectors objectForKey:nsActionName]];
}
}
[action release];
}
Expand Down
103 changes: 96 additions & 7 deletions test/jdk/java/awt/a11y/AccessibleActionsTest.java
Expand Up @@ -40,6 +40,8 @@
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Hashtable;
import java.util.concurrent.CountDownLatch;

Expand Down Expand Up @@ -92,6 +94,32 @@ void createTree() {
super.createUI(panel, "AccessibleActionsTest");
}

private void createEditableTextArea() {
AccessibleComponentTest.INSTRUCTIONS = "INSTRUCTIONS:\n"
+ "Check a11y show context menu in editable JTextArea.\n\n"
+ "Turn screen reader on and press Tab to move to the text area\n"
+ "Perform the VO action \"Open a shortcut menu\" (VO+Shift+m)\n\n"
+ "If the menu appears tab further and press PASS, otherwise press FAIL.";

JTextArea textArea = new MyTextArea("some text to edit");
JLabel label = new JLabel(textArea.getText().length() + " chars");
label.setLabelFor(textArea);
textArea.setEditable(true);
textArea.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
label.setText(String.valueOf(textArea.getText().length()) + " chars");
}
});

JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
panel.add(textArea);
panel.add(label);
exceptionString = "Editable text area test failed!";
super.createUI(panel, "AccessibleTextTest");
}

public static void main(String[] args) throws Exception {
AccessibleActionsTest test = new AccessibleActionsTest();

Expand All @@ -110,6 +138,14 @@ public static void main(String[] args) throws Exception {
if (!testResult) {
throw new RuntimeException(a11yTest.exceptionString);
}

countDownLatch = test.createCountDownLatch();
SwingUtilities.invokeLater(test::createEditableTextArea);
countDownLatch.await();

if (!testResult) {
throw new RuntimeException(a11yTest.exceptionString);
}
}

private class AccessibleActionsTestFrame extends JPanel {
Expand Down Expand Up @@ -167,17 +203,70 @@ public boolean doAccessibleAction(int i) {
}
}

private static JPopupMenu createPopup() {
JPopupMenu popup = new JPopupMenu("MENU");
popup.add("One");
popup.add("Two");
popup.add("Three");
return popup;
}


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

}

private static class MyTextArea extends JTextArea {

public MyTextArea(String some_text_to_edit) {
}

@Override
public AccessibleContext getAccessibleContext() {
if (accessibleContext == null) {
accessibleContext = new MyAccessibleJTextArea();
}
return accessibleContext;
}

private class MyAccessibleJTextArea extends JTextArea.AccessibleJTextArea {
@Override
public AccessibleAction getAccessibleAction() {
return new AccessibleAction() {
@Override
public int getAccessibleActionCount() {
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
if (aa == null) {
return 1;
}
int count = aa.getAccessibleActionCount();
return aa.getAccessibleActionCount() + 1;
}

@Override
public String getAccessibleActionDescription(int i) {
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
if ((aa != null) && (i >= 0) && (i < aa.getAccessibleActionCount())) {
return aa.getAccessibleActionDescription(i);
}
return AccessibleAction.TOGGLE_POPUP;
}

@Override
public boolean doAccessibleAction(int i) {
AccessibleAction aa = MyAccessibleJTextArea.super.getAccessibleAction();
if ((aa != null) && (i >= 0) && (i < aa.getAccessibleActionCount())) {
return aa.doAccessibleAction(i);
}
JPopupMenu popup = createPopup();
popup.show(MyTextArea.this, 0, 0);
return true;
}
};
}
}
}

private static JPopupMenu createPopup() {
JPopupMenu popup = new JPopupMenu("MENU");
popup.add("One");
popup.add("Two");
popup.add("Three");
return popup;
}
}