RFR: JDK-8269921 TextFlow: listeners on bounds can throw NPE while computing text bounds [v5]

Michael Strauß mstrauss at openjdk.org
Sat Oct 28 04:03:47 UTC 2023


On Tue, 26 Sep 2023 08:43:47 GMT, Florian Kirmaier <fkirmaier at openjdk.org> wrote:

>> It's "a bit" complicated.
>> In some situations, getRuns get's called because listeners on bounds are set.
>> This causes TextFlow to layout to compute the runs.
>> Afterward, the bounds of the parents get updated. 
>> This triggers a call to compute bounds - which cascades up to the children.
>> When the geometry of the previous Text gets computed in this big stack - it throws an nullpointer.
>> The Text doesn't have its runs, and calling TextFlow.layout is now a noop (it detects repeated calls in the same stack)
>> 
>> In the case it happened - it didn't repair and the application kinda crashed.
>> This bug most likely can also be triggered by ScenicView or similar tools, which sets listeners to the bounds.
>> It also can cause unpredictable performance issues.
>> 
>> Unit test and example stacktrace are in the ticket.
>> 
>> The suggested fix makes sure that recomputing the geometry of the Text, doesn't trigger the layout of the TextFlow. 
>> The Textflow should be layouting by the Parent.
>> This might change the behavior in some cases, but as far as I've tested it works without issues in TextFlow Heavy applications.
>> 
>> Benefits:
>>  * Better Tooling Support For ScenicView etc.
>>  * Fixes complicated but reproducible crashes
>>  * Might fix some rare crashes, which are hard to reproduce
>>  * Likely improves performance - might fix some edge cases with unpredictable bad performance
>
> Florian Kirmaier has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:
> 
>  - Merge remote-tracking branch 'origjfx/master' into JDK-8269921-textflow-bug
>  - JDK-8269921
>    Reverted the change to the layout, so we can fix the main-bug without further discussions.
>  - Merge remote-tracking branch 'origjfx/master' into JDK-8269921-textflow-bug
>  - JDK-8269921
>    Added a copyright header
>  - JDK-8269921
>    Fixing a crash related to Text and TextFlow with bounds listeners

tests/system/src/test/java/test/javafx/scene/text/TextFlowCrashTest.java line 108:

> 106:     }
> 107: 
> 108:     public void onEveryNode(Node node) {

The name of this method doesn't seem to describe what it does. It seems to do very little.

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

PR Review Comment: https://git.openjdk.org/jfx/pull/564#discussion_r1375160344


More information about the openjfx-dev mailing list