8226253: JAWS reports wrong number of radio buttons when buttons are hidden

Reviewed-by: kizune, pbansal
This commit is contained in:
Ambarish Rapte 2020-03-15 00:43:54 +05:30
parent 23fda7e41b
commit 3a7389f564
2 changed files with 84 additions and 12 deletions

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -3317,6 +3317,7 @@ public class JList<E> extends JComponent implements Scrollable, Accessible
} }
s.add(AccessibleState.SELECTABLE); s.add(AccessibleState.SELECTABLE);
s.add(AccessibleState.VISIBLE);
if (parent.isFocusOwner() if (parent.isFocusOwner()
&& (indexInParent == parent.getLeadSelectionIndex())) { && (indexInParent == parent.getLeadSelectionIndex())) {
s.add(AccessibleState.ACTIVE); s.add(AccessibleState.ACTIVE);
@ -3329,11 +3330,6 @@ public class JList<E> extends JComponent implements Scrollable, Accessible
} else if (s.contains(AccessibleState.SHOWING)) { } else if (s.contains(AccessibleState.SHOWING)) {
s.remove(AccessibleState.SHOWING); s.remove(AccessibleState.SHOWING);
} }
if (this.isVisible()) {
s.add(AccessibleState.VISIBLE);
} else if (s.contains(AccessibleState.VISIBLE)) {
s.remove(AccessibleState.VISIBLE);
}
s.add(AccessibleState.TRANSIENT); // cell-rendered s.add(AccessibleState.TRANSIENT); // cell-rendered
return s; return s;
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2005, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -1457,6 +1457,38 @@ final public class AccessBridge {
return null; return null;
} }
private int getNonVisibleChildrenCountTillIndex(AccessibleContext parentAC, int index) {
if (parentAC != null && index >= 0 && index < parentAC.getAccessibleChildrenCount()) {
int nonVisibleChildrenCount = 0;
for (int i = 0; i <= index; i++) {
if (!parentAC.getAccessibleChild(i).getAccessibleContext().getAccessibleStateSet().contains(AccessibleState.VISIBLE)) {
nonVisibleChildrenCount++;
}
}
return nonVisibleChildrenCount;
}
return 0;
}
private Accessible getVisibleChildAtIndex(AccessibleContext parentAC, int index) {
if (parentAC != null && index >= 0 && index < parentAC.getAccessibleChildrenCount()) {
int visibleIndex = -1;
int childrenCount = parentAC.getAccessibleChildrenCount();
for (int i = 0; i <= childrenCount; i++) {
Accessible child = parentAC.getAccessibleChild(i);
if (child != null) {
AccessibleContext ac = child.getAccessibleContext();
if (ac != null && ac.getAccessibleStateSet().contains(AccessibleState.VISIBLE)) {
visibleIndex++;
}
if (visibleIndex == index) {
return child;
}
}
}
}
return null;
}
/** /**
* returns the AccessibleParent from an AccessibleContext * returns the AccessibleParent from an AccessibleContext
*/ */
@ -1487,7 +1519,12 @@ final public class AccessBridge {
return InvocationUtils.invokeAndWait(new Callable<Integer>() { return InvocationUtils.invokeAndWait(new Callable<Integer>() {
@Override @Override
public Integer call() throws Exception { public Integer call() throws Exception {
return ac.getAccessibleIndexInParent(); int indexInParent = ac.getAccessibleIndexInParent();
Accessible parent = ac.getAccessibleParent();
if (parent != null) {
indexInParent -= getNonVisibleChildrenCountTillIndex(parent.getAccessibleContext(), indexInParent);
}
return indexInParent;
} }
}, ac); }, ac);
} }
@ -1501,7 +1538,8 @@ final public class AccessBridge {
return InvocationUtils.invokeAndWait(new Callable<Integer>() { return InvocationUtils.invokeAndWait(new Callable<Integer>() {
@Override @Override
public Integer call() throws Exception { public Integer call() throws Exception {
return ac.getAccessibleChildrenCount(); int childrenCount = ac.getAccessibleChildrenCount();
return childrenCount - getNonVisibleChildrenCountTillIndex(ac, childrenCount - 1);
} }
}, ac); }, ac);
} }
@ -1537,7 +1575,7 @@ final public class AccessBridge {
return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() { return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
@Override @Override
public AccessibleContext call() throws Exception { public AccessibleContext call() throws Exception {
Accessible a = ac.getAccessibleChild(index); Accessible a = getVisibleChildAtIndex(ac, index);
if (a != null) { if (a != null) {
return a.getAccessibleContext(); return a.getAccessibleContext();
} }
@ -3517,7 +3555,11 @@ final public class AccessBridge {
AccessibleRelation[] relations = ars.toArray(); AccessibleRelation[] relations = ars.toArray();
if (relations != null && i >= 0 && i < relations.length) { if (relations != null && i >= 0 && i < relations.length) {
Object[] targets = relations[i].getTarget(); Object[] targets = relations[i].getTarget();
return targets.length; if (targets != null) {
int targetCount = targets.length -
getNonVisibleTargetCountTillIndex(targets, targets.length - 1);
return targetCount;
}
} }
} }
} }
@ -3543,7 +3585,7 @@ final public class AccessBridge {
if (relations != null && i >= 0 && i < relations.length) { if (relations != null && i >= 0 && i < relations.length) {
Object[] targets = relations[i].getTarget(); Object[] targets = relations[i].getTarget();
if (targets != null && j >= 0 & j < targets.length) { if (targets != null && j >= 0 & j < targets.length) {
Object o = targets[j]; Object o = getVisibleTargetAtIndex(targets, j);
if (o instanceof Accessible) { if (o instanceof Accessible) {
return ((Accessible) o).getAccessibleContext(); return ((Accessible) o).getAccessibleContext();
} }
@ -3556,6 +3598,40 @@ final public class AccessBridge {
}, ac); }, ac);
} }
private Object getVisibleTargetAtIndex(Object[] targets, int index) {
if (index >= 0 && index < targets.length) {
int visibleTargetIndex = -1;
for (int i = 0; i < targets.length; i++) {
if (targets[i] instanceof Accessible) {
AccessibleContext ac = ((Accessible) targets[i]).getAccessibleContext();
if (ac != null && ac.getAccessibleStateSet().contains(AccessibleState.VISIBLE)) {
visibleTargetIndex++;
}
if (visibleTargetIndex == index) {
return targets[i];
}
}
}
}
return null;
}
private int getNonVisibleTargetCountTillIndex(Object[] targets, int index) {
if (index >= 0 && index < targets.length) {
int nonVisibleTargetsCount = 0;
for (int i = 0; i <= index; i++) {
if (targets[i] instanceof Accessible) {
AccessibleContext ac = ((Accessible) targets[i]).getAccessibleContext();
if (ac != null && !ac.getAccessibleStateSet().contains(AccessibleState.VISIBLE)) {
nonVisibleTargetsCount++;
}
}
}
return nonVisibleTargetsCount;
}
return 0;
}
// ========= AccessibleHypertext ========= // ========= AccessibleHypertext =========
private Map<AccessibleHypertext, AccessibleContext> hyperTextContextMap = new WeakHashMap<>(); private Map<AccessibleHypertext, AccessibleContext> hyperTextContextMap = new WeakHashMap<>();