On Thu, 6 Feb 2025 18:35:06 GMT, Andy Goryachev <ango...@openjdk.org> wrote:

> Navigating up the parent hierarchy during CSS processing in a background 
> thread encounters a null parent, causing a NPE.

I think the root cause of the problem is in `Tooltip::getStyleableParent`, 
which does not return a stable result when called from a background thread. The 
implementation does this:


        if (BEHAVIOR.hoveredNode == null) {
            return super.getStyleableParent();
        }
        return BEHAVIOR.hoveredNode;


Where `BEHAVIOR` is a static field of Tooltip.

This might be a better fix:


    @Override public Styleable getStyleableParent() {
        if (!Platform.isFxApplicationThread() || BEHAVIOR.hoveredNode == null) {
            return super.getStyleableParent();
        }
        return BEHAVIOR.hoveredNode;
    }


and then you don't even need the null checks you added to  `CssStyleHelper`.

modules/javafx.graphics/src/main/java/javafx/scene/CssStyleHelper.java line 205:

> 203:             if (parent == null) {
> 204:                 return;
> 205:             }

While this does prevent the exception, I think this is fixing a symptom rather 
than the root cause. The only reason that parent can ever be null here and in 
the other place you added the null check is that `Tooltip::getStyleableParent` 
is returning a different answer between the time it is called to calculate 
`depth` and the time it is used here in a loop. This is happening because 
`Tooltip::getStyleableParent` uses static state that is only valid when on the 
FX application thread.

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

PR Review: https://git.openjdk.org/jfx/pull/1696#pullrequestreview-2602481137
PR Review Comment: https://git.openjdk.org/jfx/pull/1696#discussion_r1946970797

Reply via email to