changeset 58500:3ea8a0c5c264

8226253: JAWS reports wrong number of radio buttons when buttons are hidden. Reviewed-by: kizune, pbansal
author arapte
date Sun, 15 Mar 2020 00:43:54 +0530
parents f60a3b5270bf
children 889b4191879c
files src/java.desktop/share/classes/javax/swing/JList.java src/jdk.accessibility/windows/classes/com/sun/java/accessibility/internal/AccessBridge.java
diffstat 2 files changed, 84 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/share/classes/javax/swing/JList.java	Thu Mar 12 17:53:08 2020 -0700
+++ b/src/java.desktop/share/classes/javax/swing/JList.java	Sun Mar 15 00:43:54 2020 +0530
@@ -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.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -3317,6 +3317,7 @@
                 }
 
                 s.add(AccessibleState.SELECTABLE);
+                s.add(AccessibleState.VISIBLE);
                 if (parent.isFocusOwner()
                     && (indexInParent == parent.getLeadSelectionIndex())) {
                     s.add(AccessibleState.ACTIVE);
@@ -3329,11 +3330,6 @@
                 } else if (s.contains(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
                 return s;
             }
--- a/src/jdk.accessibility/windows/classes/com/sun/java/accessibility/internal/AccessBridge.java	Thu Mar 12 17:53:08 2020 -0700
+++ b/src/jdk.accessibility/windows/classes/com/sun/java/accessibility/internal/AccessBridge.java	Sun Mar 15 00:43:54 2020 +0530
@@ -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.
  *
  * This code is free software; you can redistribute it and/or modify it
@@ -1457,6 +1457,38 @@
         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
      */
@@ -1487,7 +1519,12 @@
         return InvocationUtils.invokeAndWait(new Callable<Integer>() {
             @Override
             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);
     }
@@ -1501,7 +1538,8 @@
         return InvocationUtils.invokeAndWait(new Callable<Integer>() {
             @Override
             public Integer call() throws Exception {
-                return ac.getAccessibleChildrenCount();
+                int childrenCount = ac.getAccessibleChildrenCount();
+                return childrenCount - getNonVisibleChildrenCountTillIndex(ac, childrenCount - 1);
             }
         }, ac);
     }
@@ -1537,7 +1575,7 @@
             return InvocationUtils.invokeAndWait(new Callable<AccessibleContext>() {
                 @Override
                 public AccessibleContext call() throws Exception {
-                    Accessible a = ac.getAccessibleChild(index);
+                    Accessible a = getVisibleChildAtIndex(ac, index);
                     if (a != null) {
                         return a.getAccessibleContext();
                     }
@@ -3517,7 +3555,11 @@
                         AccessibleRelation[] relations = ars.toArray();
                         if (relations != null && i >= 0 && i < relations.length) {
                             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 @@
                         if (relations != null && i >= 0 && i < relations.length) {
                             Object[] targets = relations[i].getTarget();
                             if (targets != null && j >= 0 & j < targets.length) {
-                                Object o = targets[j];
+                                Object o = getVisibleTargetAtIndex(targets, j);
                                 if (o instanceof Accessible) {
                                     return ((Accessible) o).getAccessibleContext();
                                 }
@@ -3556,6 +3598,40 @@
         }, 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 =========
 
     private Map<AccessibleHypertext, AccessibleContext> hyperTextContextMap = new WeakHashMap<>();