CSS Lookups and their origins (possible regression)
John Hendrikx
john.hendrikx at gmail.com
Tue Jul 9 00:11:18 UTC 2024
I realized I worded the TLDR poorly.
Let me try again:
TLDR; should styles which use references (like -fx-base used in Modena)
become AUTHOR level styles if -fx-base is specified in an AUTHOR
stylesheet? The act of simply specifying -fx-base in your own AUTHOR
stylesheet elevates hundreds of styles from Modena to AUTHOR level, as
if you specified them directly...
--John
On 09/07/2024 02:07, John Hendrikx wrote:
>
> Hi List,
>
> TLDR; should a CSS reference like -fx-base convert all styles that use
> this value (or derive from it) become AUTHOR level styles (higher
> priority than setters) ?
>
> Long version:
>
> In JavaFX 21, I did a fix (see #1072) to solve a problem where a CSS
> value could be reset on an unrelated control.
>
> This happened when the CSS engine encountered a stylable that is
> overridden by the user (with a setter), and decided NOT to proceed
> with the full CSS value calculation (as it could not override the user
> setting if that CSS value had lower priority). However, not
> proceeding with the calculation meant that a "SKIP" was stored in a
> shared cache which was incorrect. This is because when this "SKIP" is
> later encountered for an unrelated control (the cache entries are
> shared for controls with the same styles at the same level), they
> could get their values reset because they were assumed to be unstyled.
>
> However, this fix has exposed what seems to be a deeper bug or perhaps
> an unfortunate default:
>
> JavaFX has a special feature where you can refer to certain other
> styles by using a reference (which is resolved, recursively, to a
> final value). This does not seem to be a CSS standard, but is a
> feature only FX has.
>
> It works by saying something like:
>
> -fx-base: RED;
>
> And then using it like this:
>
> -fx-text-fill: -fx-base;
>
> This feature works accross stylesheets of different origins, so an
> AUTHOR stylesheet can specify -fx-base, and when a USER_AGENT refers
> to -fx-base, the value comes from the AUTHOR stylesheet.
>
> JavaFX then changes the origin of the style to the highest priority
> encountered while resolving the reference. This means that Modena can
> specify "-fx-text-fill: -fx-base", and when "-fx-base" is then part of
> the AUTHOR style sheet, that ALL Modena styles that use -fx-base will
> be considered AUTHOR level styles, as per this comment:
>
> // The origin of this parsed value is the greatest of
>
> // any of the resolved reference. If a resolved reference
>
> // comes from an inline style, for example, then the value
>
> // calculated from the resolved lookup should have inline
>
> // as its origin. Otherwise, an inline style could be
>
> // stored in shared cache.
>
> I feel that this is a really unfortunate choice. The style after all
> was specified by Modena, only its value came from another (higher
> priority) style sheet. I think a more logical choice would have been
> to not change the priority at all, unless a "-fx-text-fill" is
> explicitly made part of the AUTHOR stylesheet.
>
> A consequence of this (and which is much more visible after the fix)
> is that creating a Label with a setTextFill(Color.YELLOW) in its
> constructor will only result in a yellow text fill if the AUTHOR
> stylesheet did not override any of the Modena colors involved in
> calculating the Modena -fx-text-fill default. Overriding -fx-base in
> any way will result in the text fill of the label to be overridden (as
> the reference came from an AUTHOR stylesheet, which trumps a setter
> which is of a lower style origin).
>
> The comment also alludes to a potential problem. If an inline style
> would specify "-fx-base", but would be treated as if it came from
> Modena (USER_AGENT level), then this value could get stored in the
> cache as everything except INLINE styles can be cached. However, I
> feel that the changing of style origin level was then probably done to
> solve a CACHING problem, instead of what made logical sense for
> users. If we agree that a resolved reference should not change the
> style origin level, then this would need to be addressed, by perhaps
> marking such a calculated value as uncacheable, instead of overloading
> the meaning of style origin.
>
> I'd like to hear your thoughts, and also how to proceed. JavaFX
> versions before 21 seemingly allowed overriding reference without much
> consequence because if the user overrode the value manually, the cache
> entry would be set to "SKIP". Now that this is no longer the case,
> JavaFX more aggressively overrides user set values if they happen to
> use a referenced value. See code below.
>
> --John
>
> .root {
>
> -fx-base: #ff0000;
>
> }
>
> packageapp;
>
> importjavafx.application.Application;
>
> importjavafx.scene.Scene;
>
> importjavafx.scene.control.Label;
>
> importjavafx.scene.paint.Color;
>
> importjavafx.stage.Stage;
>
> publicclassTestApp extendsApplication {
>
> publicstaticvoidmain(String[] args) {
>
> launch(args);
>
> }
>
> @Override
>
> publicvoidstart(Stage primaryStage) {
>
> Scene scene = newScene(newMyLabel());
>
> // See the difference with/without -fx-base in the stylesheet
>
> scene.getStylesheets().add(TestApp.class.getResource("/style.css").toExternalForm());
>
> primaryStage.setScene(scene);
>
> primaryStage.show();
>
> }
>
> }
>
> classMyLabel extendsLabel {
>
> publicMyLabel() {
>
> setTextFill(Color.YELLOW);
>
> setText("Hello world");
>
> }
>
> }
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20240709/37c556ed/attachment-0001.htm>
More information about the openjfx-dev
mailing list