On Sat, 3 May 2025 08:56:07 GMT, Michael Strauß <mstra...@openjdk.org> wrote:

>> Implementation of [CSS media 
>> queries](https://gist.github.com/mstr2/cbb93bff03e073ec0c32aac317b22de7).
>
> Michael Strauß has updated the pull request with a new target base due to a 
> merge or a rebase. The pull request now contains 30 commits:
> 
>  - Merge branch 'master' into feature/media-queries
>  - cssref doc
>  - Merge branch 'master' into feature/media-queries
>  - reorder fields
>  - remove ReadOnlyBooleanWrapper
>  - Scene preferences only actively observe platform preferences when the 
> scene is showing
>  - formatting
>  - typo
>  - use equality instead of identity
>  - rename TokenStream methods
>  - ... and 20 more: https://git.openjdk.org/jfx/compare/498b7e4c...626a904d

first batch of comments.  more to follow.

modules/javafx.graphics/src/main/docs/javafx/scene/doc-files/media-query.svg 
line 2:

> 1: <?xml version="1.0" encoding="UTF-8" standalone="no"?>
> 2: <svg

just an observation: these images look blurry on my mac external monitor 
(scale=1) relative to the w3.org ones (on the left):

![Screenshot 2025-05-05 at 08 06 
36](https://github.com/user-attachments/assets/8ba6fe7b-ec1c-4297-b6ce-0796a314e9aa)

modules/javafx.graphics/src/main/java/com/sun/javafx/application/preferences/PreferenceProperties.java
 line 184:

> 182: 
> 183:             for (DeferredProperty<?> property : 
> deferredProperties.values()) {
> 184:                 property.fireValueChangedIfNecessary();

firing events from a synchronized method is a recipe for a lockup.
JavaFX is still a single threaded toolkit (if we ignore the creation of certain 
objects aspect), why do we want to synchronize?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaQueryParser.java
 line 103:

> 101:                 default -> {
> 102:                     errorHandler.accept(stream.current(), "Unexpected 
> token");
> 103:                     return expressions;

is this needed?  (see L108)

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaQueryParser.java
 line 273:

> 271:     }
> 272: 
> 273:     private static final Predicate<Token> IDENT = token -> 
> token.getType() == CssLexer.IDENT;

personal preference: I'd rather see these up front.

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaQuerySerializer.java
 line 72:

> 70:                                    DataOutputStream os,
> 71:                                    StyleConverter.StringStore 
> stringStore) throws IOException {
> 72:         os.writeByte(QueryType.of(mediaQuery).ordinal());

potential problem:
someone may insert/reorder QueryType enums and break backward compatibility.
at a minimum, a warning comment should be added to QueryType, or perhaps some 
more reliable code in read/writeBinary?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaQuerySerializer.java
 line 104:

> 102: 
> 103:     public static MediaQuery readBinary(DataInputStream is, String[] 
> strings) throws IOException {
> 104:         return switch (QueryType.VALUES[is.readByte()]) {

same issue with backward compatibility - what if an old core tries to read the 
newer format and AIOOBE is thrown instead of IOException?  Should we validate 
first and throw IOE instead?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaRule.java 
line 48:

> 46:         this.queries = List.copyOf(queries);
> 47:         this.parent = parent;
> 48:         this.hash = queries.hashCode();

I would rather see `this.queries.hasCode()` here

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaRule.java 
line 52:

> 50: 
> 51:     /**
> 52:      * Returns the list of media queries.

should we say "immutable"?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaRule.java 
line 118:

> 116:         boolean hasParent = stream.readBoolean();
> 117: 
> 118:         return new MediaRule(List.of(queries), hasParent ? 
> readBinary(stream, strings) : null);

the exceptions in java have improved, but there is 3 statements in this line.
anyone who ever debugged code after the fact using two-week old logs would say: 
please keep one statement per line, if possible.

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/MediaRule.java 
line 123:

> 121:     @Override
> 122:     public boolean equals(Object obj) {
> 123:         return obj instanceof MediaRule rule && 
> rule.getQueries().equals(queries);

should we add `if(obj == this)` as we usually do?
also, `parent` is missing in the check

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/expression/ConjunctionExpression.java
 line 67:

> 65:     @Override
> 66:     public String toString() {
> 67:         return "(" + left.toString() + " and " + right.toString() + ")";

`return "(" + left + " and " + right + ")";`

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/expression/DisjunctionExpression.java
 line 67:

> 65:     @Override
> 66:     public String toString() {
> 67:         return "(" + left.toString() + " or " + right.toString() + ")";

`return "(" + left + " or " + right + ")";`

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/expression/FunctionExpression.java
 line 58:

> 56:     @Override
> 57:     public boolean equals(Object obj) {
> 58:         return obj instanceof FunctionExpression<?> expr

`if(obj == this)` ?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/media/expression/FunctionExpression.java
 line 66:

> 64:     @Override
> 65:     public int hashCode() {
> 66:         return Objects.hash(featureName, featureValue, value);

very minor: maybe add `FunctionExpression.class` to the mix?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/parser/CssLexer.java 
line 34:

> 32: 
> 33: public final class CssLexer {
> 34:     public final static int STRING = 10;

minor: `public static final` maybe?

modules/javafx.graphics/src/main/java/com/sun/javafx/css/parser/TokenStream.java
 line 73:

> 71:     }
> 72: 
> 73:     public void reconsume() {

maybe a javadoc would suffice if you like the name so much

modules/javafx.graphics/src/main/java/com/sun/javafx/css/parser/TokenStream.java
 line 103:

> 101:         } finally {
> 102:             currentIndex = index;
> 103:             currentItem = index >= 0 ? source.get(index) : null;

general question: will this `finally` block work as expected if an exception 
happened somewhere in the `try` block?

modules/javafx.graphics/src/main/java/javafx/css/CssParser.java line 4339:

> 4337: 
> 4338:                 currentToken = nextToken(lexer);
> 4339:                 expectedRBraces--;

what happens in case of unbalanced braces and `expectedRBraces` < 0 ?

modules/javafx.graphics/src/main/java/javafx/css/Rule.java line 384:

> 382:         MediaRule mediaRule = null;
> 383: 
> 384:         if (bssVersion >= 7) {

please add a comment pointing to Stylesheet.BINARY_CSS_VERSION.

Ideally, there would be constants declared somewhere with explanation instead 
of the magic number '7'

modules/javafx.graphics/src/main/java/javafx/css/Stylesheet.java line 67:

> 65:      * Version 5: persist @font-face
> 66:      * Version 6: converter classes moved to public package
> 67:      * Version 7: media queries

this, in my opinion, deserves a constant (it does not have to be public).

modules/javafx.graphics/src/main/java/javafx/scene/Scene.java line 6593:

> 6591:          * @see #setPersistentScrollBars(Boolean)
> 6592:          */
> 6593:         boolean isPersistentScrollBars();

do these accessors need individual javadocs?

modules/javafx.graphics/src/test/java/test/javafx/css/CssParser_mediaQuery_Test.java
 line 295:

> 293: 
> 294:     @Test
> 295:     void parserRecoversWhenMediaQueryIsMalformed() {

should we also test malformed queries like `not not`, `and or` etc.?

also, unbalanced parentheses?

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

PR Review: https://git.openjdk.org/jfx/pull/1655#pullrequestreview-2813024498
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073642689
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073651690
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073669724
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073756253
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073932495
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073934605
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073937065
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073937476
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073940636
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073942208
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073950949
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073952052
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073953939
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073956250
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073959700
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073965466
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073967786
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073978797
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073985918
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073989278
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073992865
PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2073676691

Reply via email to