On Mon, 5 May 2025 15:28:30 GMT, Andy Goryachev <ango...@openjdk.org> wrote:
>> 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 > > 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) The return statement? Yes, we want token processing to stop here if we encounter an unexpected token, as there's no recovery strategy at this point. > 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? That would be forward compatibility, which is not supported. JavaFX will not even try to load a binary file with a higher version than it can understand, and error out immediately (see Stylesheet.java:L317). > 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 I've removed it instead. > 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. I usually don't follow dogma. That being said, I moved the parent-rule expression out of line. > 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 This is now removed. > 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? Why? > 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? I want to keep the diffs minimal here, because I didn't change anything except making the constants public. > 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 I've added javadocs to all methods. By the way, I don't really get the opposition to the name. The arguments presented so far do not convince me to drop CSS lingo. > 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? That's its purpose. It will reset the stream back to the state it was in before the `matches(...)` method was called. > 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 ? The behavior is the same as with a normal unbalanced curly brace. I've added a test for it. > 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' I've added comments to that effect. > 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). I'd rather do this in a refactor PR with the rest of the magic numbers. > 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? Yes, because the javadoc tool doesn't recognize a method that returns `boolean` as a getter for `ObjectProperty<Boolean>` (it expects `BooleanProperty`). This is a null-coalescing property: you can set it to `null`, but it will always evaluate to `true` or `false`, so it doesn't make sense to return `Boolean` from its getter. > modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/media/MediaQuerySerializerTest.java > line 46: > >> 44: import static org.junit.jupiter.api.Assertions.*; >> 45: >> 46: public class MediaQuerySerializerTest { > > just a thought: this could have been a parameterized test (this version is ok > though). Yes, with the downside that parameterized tests are usually a bit harder to debug in isolation. > modules/javafx.graphics/src/test/java/test/com/sun/javafx/css/parser/CssLexerTest.java > line 47: > >> 45: } >> 46: >> 47: private void checkTokens(List<Token> resultTokens, Token... >> expectedTokens) { > > should there be new tests in `CssLexerTest` for the `@media` queries? No, media queries are not a thing at the lexer stage. The media query grammar only comes in at a later stage. > modules/javafx.graphics/src/test/java/test/javafx/css/CssParser_mediaQuery_Test.java > line 185: > >> 183: @Test >> 184: void disjunctionAndConjunctionCanNotBeCombined() { >> 185: Stylesheet stylesheet = new CssParser().parse(""" > > could we also test for "or not" and "and not" ? I've added a test. > 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? I've added a test for an invalid operator combination, as well as unbalanced parentheses. ------------- PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074825549 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074825763 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826054 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826350 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826540 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826650 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826704 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074826935 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827009 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827074 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827147 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827215 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827296 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827385 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827444 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074827481 PR Review Comment: https://git.openjdk.org/jfx/pull/1655#discussion_r2074825633