On Fri, 30 Sep 2022 15:15:06 GMT, Ambarish Rapte <ara...@openjdk.org> wrote:

> This is a follow up bug-fix to 
> [JDK-8284281](https://bugs.openjdk.org/browse/JDK-8284281)
> 
> Issue:
> When Narrator is running,
> Following scenarios with TextField or TextArea cause IllegalArgumentException 
>  or NPE
> 
> 1. Move cursor to beginning of line, Press and hold DELETE key
> 2. Move cursor to beginning of line, Press and hold CTRL + DELETE key
> 3. Move cursor to end of line, Press and hold BACKSPACE key
> 4. Move cursor to end of line, Press and hold CTRL + BACKSPACE key
> 
> Fix:
> Two variable `start` and `end` in  `WinTextRangeProvider` should be validated 
> against text length
> 1. Added a method `validateRange()`, and is called several from methods which 
> access text based on `start` and `end` variables
> 2. Partially reverted fix of 
> [JDK-8284281](https://bugs.openjdk.org/browse/JDK-8284281) : 
>     - removed 
> https://github.com/openjdk/jfx/blob/35675c8d27d54a26059b182614e18152794dbcec/modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinTextRangeProvider.java#L180
>     - and used `validateRange()` instead to be symmetrical.
> 
> Verification:
> To observe the issue.
> 
> 1. Run any program with TextField and/or TextArea
> 2. Launch Windows Narrator
> 3. Run the exception causing scenarios several times:
> 
> - Move cursor to beginning of line, Press and hold DELETE key
> - Move cursor to beginning of line, Press and hold CTRL + DELETE key
> - Move cursor to end of line, Press and hold BACKSPACE key
> - Move cursor to end of line, Press and hold CTRL + BACKSPACE key

The fix looks good, although I think you can avoid redundantly calling 
`getAttribute(TEXT)` by passing in `text` as a parameter to `validateRange` 
(see inline comment). Also, for consistency, you might rep,ace the check on 
lines 236-237 with a call to `validateRange`.

modules/javafx.graphics/src/main/java/com/sun/glass/ui/win/WinTextRangeProvider.java
 line 95:

> 93: 
> 94:     private void validateRange() {
> 95:         String text = (String)getAttribute(TEXT);

It looks like you already have the `text` everywhere you call this. You might 
consider passing it in as a parameter rather than calling `getAttribute` 
redundantly.

-------------

PR: https://git.openjdk.org/jfx/pull/907

Reply via email to