RFR: 8342703: CSS transition is not started when initial value was not specified

Michael Strauß mstrauss at openjdk.org
Mon Oct 21 15:37:13 UTC 2024


When the initial value of a styleable property is not specified in a stylesheet, no transition is started:

    .button {
        transition: -fx-opacity 1s;
    }
    
    .button:hover {
        -fx-opacity: 0.5;
    }

The expected behavior is that a transition is started in this case, since the default value of `-fx-opacity` is 1.

The reason for this bug is that `StyleableProperty` implementations do not start a CSS transition when the value is applied for the first time. The intention behind this is that a node that is added to the scene graph should not start transitions. CSS transitions should only be started _after_ the node has been shown for the first time.

The logic to detect this situation is currently as follows:

    // If this.origin == null, we're setting the value for the first time.
    // No transition should be started in this case.
    TransitionDefinition transition = this.origin != null && getBean() instanceof Node node ?
        NodeHelper.findTransitionDefinition(node, getCssMetaData()) : null;


However, this does not work. When no initial style is specified in the stylesheet, `this.origin` will not be set, and thus no transition will be started even after the node has been shown. The new logic works like this:

A `Node.initialCssState` flag is added. Initially, this is `true`. Manually calling `applyCss` or similar methods will not clear this flag, as we consider all manual CSS processing to be part of the "initial CSS state". Only at the end of `Scene.doCSSPass` will this flag be cleared on all nodes that have expressed their interest. This mechanism ensures that a node will be eligible for CSS transitions only after the following conditions have been satisfied:
1. The node was added to a scene graph
2. CSS processing was completed for a scene pulse

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

Commit messages:
 - start transitions only when not in initial CSS state

Changes: https://git.openjdk.org/jfx/pull/1607/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1607&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8342703
  Stats: 178 lines in 13 files changed: 152 ins; 8 del; 18 mod
  Patch: https://git.openjdk.org/jfx/pull/1607.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1607/head:pull/1607

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


More information about the openjfx-dev mailing list