From 1e87ff01994df16df7de331040fc5d7a4a85f630 Mon Sep 17 00:00:00 2001 From: Abhishek Kumar Date: Thu, 20 Feb 2025 09:17:40 +0000 Subject: [PATCH] 8348936: [Accessibility,macOS,VoiceOver] VoiceOver doesn't announce untick on toggling the checkbox with "space" key on macOS 8345728: [Accessibility,macOS,Screen Magnifier]: JCheckbox unchecked state does not magnify but works for checked state Reviewed-by: aivanov, kizune, dnguyen, asemenov --- .../classes/sun/lwawt/macosx/CAccessible.java | 7 +- .../TestJCheckBoxToggleAccessibility.java | 129 ++++++++++++++++++ 2 files changed, 133 insertions(+), 3 deletions(-) create mode 100644 test/jdk/javax/accessibility/TestJCheckBoxToggleAccessibility.java diff --git a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java index 779423bc28f..8f67a06a13d 100644 --- a/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java +++ b/src/java.desktop/macosx/classes/sun/lwawt/macosx/CAccessible.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2025, 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 @@ -28,6 +28,7 @@ package sun.lwawt.macosx; import java.awt.Component; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; +import java.util.Objects; import javax.accessibility.Accessible; import javax.accessibility.AccessibleContext; @@ -182,7 +183,7 @@ class CAccessible extends CFRetainedResource implements Accessible { // Do send check box state changes to native side if (thisRole == AccessibleRole.CHECK_BOX) { - if (newValue != null && !newValue.equals(oldValue)) { + if (!Objects.equals(newValue, oldValue)) { valueChanged(ptr); } @@ -208,7 +209,7 @@ class CAccessible extends CFRetainedResource implements Accessible { // Do send toggle button state changes to native side if (thisRole == AccessibleRole.TOGGLE_BUTTON) { - if (newValue != null && !newValue.equals(oldValue)) { + if (!Objects.equals(newValue, oldValue)) { valueChanged(ptr); } } diff --git a/test/jdk/javax/accessibility/TestJCheckBoxToggleAccessibility.java b/test/jdk/javax/accessibility/TestJCheckBoxToggleAccessibility.java new file mode 100644 index 00000000000..2a1d03117b7 --- /dev/null +++ b/test/jdk/javax/accessibility/TestJCheckBoxToggleAccessibility.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2025, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.awt.BorderLayout; +import java.awt.GridLayout; + +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JToggleButton; + +/* + * @test + * @bug 8348936 8345728 + * @summary Verifies that VoiceOver announces the untick state of CheckBox and + * ToggleButton when space key is pressed. Also verifies that CheckBox + * and ToggleButton untick state is magnified with Screen Magnifier. + * @requires os.family == "mac" + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual TestJCheckBoxToggleAccessibility + */ + +public class TestJCheckBoxToggleAccessibility { + public static void main(String[] args) throws Exception { + String INSTRUCTIONS = """ + +

Testing with VoiceOver

+ +
    +
  1. Start the VoiceOver application + (Press Command + F5) +
  2. Click on the Frame with CheckBox and ToggleButton + window to move focus +
  3. Press Spacebar +
  4. VO should announce the checked state +
  5. Press Spacebar again +
  6. VO should announce the unchecked state +
  7. Press Tab to move focus to ToggleButton +
  8. Repeat steps 3 to 6 and listen the announcement +
  9. If announcements are incorrect, press Fail +
  10. Stop the VoiceOver application + (Press Command + F5 again) +
+ +

Testing with Screen Magnifier

+
    +
  1. Enable Screen magnifier on the Mac: + System Settings -> Accessibility -> + Hover Text -> Enable Hover Text
    + Default Hover Text Activation Modifier is Command key +
  2. Move focus back to the test application and perform the following tests + +
      +
    • Test CheckBox states with Screen Magnifier +
        +
      1. Click on CheckBox to select it +
      2. Press the Command key and + hover mouse over CheckBox +
      3. CheckBox ticked state along with its label should be magnified +
      4. Keep the Command key pressed and + click CheckBox to deselect it +
      5. CheckBox unticked state along with its label should be magnified +
      6. Release the Command key +
      7. If Screen Magnifier behaviour is incorrect, press Fail +
      +
    • Test ToggleButton states with Screen Magnifier +
        +
      1. Click on ToggleButton to select it +
      2. Press the Command key and + hover mouse over ToggleButton +
      3. Ticked state along with label should be magnified +
      4. Keep the Command button pressed and + click ToggleButton to deselect it +
      5. Unticked state along with its label should be magnified +
      6. Release the Command key +
      7. If Screen Magnifier behaviour is incorrect, press Fail +
      +
    +
  3. Disable Hover Text (optionally) in the Settings +
+ +

Press Pass if you are able to hear correct VoiceOver announcements and + able to see the correct screen magnifier behaviour.

"""; + + PassFailJFrame.builder() + .title("TestJCheckBoxToggleAccessibility Instruction") + .instructions(INSTRUCTIONS) + .columns(40) + .rows(25) + .testUI(TestJCheckBoxToggleAccessibility::createUI) + .testTimeOut(8) + .build() + .awaitAndCheck(); + } + + private static JFrame createUI() { + JFrame frame = new JFrame("A Frame with CheckBox and ToggleButton"); + JCheckBox cb = new JCheckBox("CheckBox", false); + JToggleButton tb = new JToggleButton("ToggleButton"); + + JPanel p = new JPanel(new GridLayout(2, 1)); + p.add(cb); + p.add(tb); + frame.getContentPane().add(p, BorderLayout.CENTER); + frame.setSize(400, 400); + return frame; + } +}