Found while implementing a fix in https://github.com/openjdk/jfx/pull/2225 and 
also marked in the review by @andy-goryachev-oracle.

`CssStyleHelper` holds the `triggerStates`. Those are needed for pseudoclass 
matching.

Example: `.parent:ps > .leaf { ... }`
What happens:
`leaf` is adding `ps` into the triggerStates of `parent`.
This is done so that `parent` will know: If my pseudoclass `ps` changes, I have 
children that are interested in that change, so I must update the CSS.

The problem with that currently:
We might need to create an empty `CssStyleHelper` 'shell' to hold the 
`triggerStates`.

In the example above, we will create a `CssStyleHelper` for `parent` only for 
the `triggerStates`.
Because `parent` is not styled, it normally has no `CssStyleHelper`.

Because of that mechanism, the code in `CssStyleHelper` has multiple problems:
1. Check if we have a real `CssStyleHelper` or just a 'shell' for the 
`triggerStates`
1.1. This is done by various checks for `cacheContainer != null`
2. `findFirstStyleableAncestor()` can return a `Node` with such an empty 
`CssStyleHelper` (that was only created for the `triggerStates`), which is wrong
3. We create more `CssStyleHelper` objects than we actually need to

Solution: Move the `triggerStates` to `Node`. This is also where the other css 
flags live in.

Overall, this will improve performance a bit, make the `CssStyleHelper` a bit 
cleaner, especially regarding separation of concerns.
Now the following is always true: If a `CssStyleHelper` exists, the `Node` is 
styled and always has a `CacheContainer` that is never null.
Will help towards finishing: https://github.com/openjdk/jfx/pull/2225.

I wrote a bunch of tests that will succeed before and after. No change in 
behavior is expected other than being more correct.

---------
- [x] I confirm that I make this contribution in accordance with the [OpenJDK 
Interim AI Policy](https://openjdk.org/legal/ai).

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

Commit messages:
 - 8393181: CssStyleHelper should not hold the triggerStates

Changes: https://git.openjdk.org/jfx/pull/2333/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2333&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8393181
  Stats: 534 lines in 3 files changed: 392 ins; 104 del; 38 mod
  Patch: https://git.openjdk.org/jfx/pull/2333.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2333/head:pull/2333

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

Reply via email to