On Tue, 15 Jul 2025 03:58:55 GMT, Sergey Bylokhov <s...@openjdk.org> wrote:

> > I'd expect to see 9 as the return value of getBeforeIndex for the index of 
> > 10. This would make the table symmetrical.
> 
> Why do you expect that? The spec states that the index should be "an index 
> within the text." That index is also used in other methods, such as 
> getCharacterBounds(), etc. If we fixed it only for text at the end, it would 
> make the behavior even less symmetric, since for a negative value, the model 
> will always throw an exception.

I think the specification for the index parameter — *“an index within the 
text”* — is vague, it's open to interpretation.

We should make it specific. For example, is 0 within the text? It's not within, 
it's right before.

The same goes for the index of 10 in my example above — it's right after the 
text.

> > According to the text model, index 10 is still valid, it's the index 
> > between the last character and the implied line break, so 
> > tf.getDocument().getText(10, 1) returns \n.
> 
> The last character is implementation detail, it is not part of the "users 
> data" this is the reason why it is excluded from the Document.getLength().

Exactly! It's not part of the text itself, yet the index at 
`Document.getLength()` is a valid position.

I see no reason why accessible API would consider such a position invalid.

> > Ok, let's step away from the documentation and try to focus on the use case 
> > of this method. Method is supposed to expose navigation within the text 
> > component to the assistive technology devices and programs. One of such 
> > programs (not the only one) is a text narrator. These narrators are meant 
> > to be used on text components and they have special shortcuts to narrate 
> > the previous and next word or character compared to the current caret 
> > position.
> 
> Those narrators should not use the AccessibleText interface blindly. Instead, 
> they should check the specification and decide which methods to call and 
> when. The method in question cannot return the first or last word in some 
> scenarios, so relying on it without understanding its limitations could lead 
> to incorrect behavior.

In an ideal world… And again, *“an index within the text”* is a vague 
definition which one developer may interpret one way whereas another one may 
think it's okay. This bug, 
[JDK-8360070](https://bugs.openjdk.org/browse/JDK-8360070), is the proof for 
that.

As far as I can see, the implementation of `getIndexAtPoint` can return 
`Document.getLength()` as an index, which becomes inconsistent: the index is 
considered valid in some cases but it's invalid in other cases.

I think the proposed fix is backward compatible: it extends the range of valid 
indexes for a method call; reducing the range would be more problematic.

At the same time, I agree that all implementations of `AccessibleText` need 
updating to be consistent.

The specification for `AccessibleText` needs updating, too, to avoid any 
confusion: the valid range for the index parameter has to be explicitly defined 
such as `> 0 && < model.getLength()`.

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

PR Comment: https://git.openjdk.org/jdk/pull/25941#issuecomment-3109915595

Reply via email to