OK, thanks. For the benefit of others who might be interested, this bug is now visible here:

https://bugs.openjdk.java.net/browse/JDK-8201135

-- Kevin


Matthew Elliot wrote:
Hi Kevin,

Priyanka from Oracle beat me to it and this small example hit the nail on the head immediately. The below will throw and swallow and IllegalArgumentException in CSSParser in the following method.

private ParsedValueImpl<Color,Color> colorValueOfString(String str) {


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;


public class CssParserTest extends Application  {


    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("HBox Experiment 1");

        Button button1 = new Button("Button Number 1");
        Button button2 = new Button("Button Number 2");

        VBox vbox = new VBox(button1, button2);
        vbox.setStyle("-fx-alignment: top-center;");

        Scene scene = new Scene(vbox, 200, 100);

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}
There are at least 3 properties I have seen doing this and depending on the complexity of the CSS, in our case quite extensive it leads to a lot of throw/catch/ignore. :)

M.
​

On 4 April 2018 at 18:06, Kevin Rushforth <[email protected] <mailto:[email protected]>> wrote:

    Hi Matt,

    Thank you for filing this bug.

    Can you provide a standalone test case that reproduces this (a
    .java and a .css file), so we can attach it to the bug? Our
    WebBugs triage engineer will ask for this, and it will save time
    if you can provide it now. Otherwise the bug report looks fine.

    -- Kevin



    Matthew Elliot wrote:

        Hey David, thanks.
        I have filed a bug via the Oracle website.

        internal review ID : 9053225

        Hopefully this was correct as it was also my first time.
        Matt


        On 4 April 2018 at 17:21, David Grieve
        <[email protected] <mailto:[email protected]>> wrote:

            On 4/4/18 10:44 AM, Matthew Elliot wrote:

            Hi David, thanks for the quick response, the parser does
            seem to have
            knowledge of the property and values as in the method ...

            ParsedValueImpl valueFor(String property, Term root,
            CSSLexer lexer) throws ParseException {}

            it looks for particular properties for parsing... e.g.

            } else if ("-fx-background-color".equals(prop)) {
                return parsePaintLayers(root);
            } else if ("-fx-background-image".equals(prop)) {
                return parseURILayers(root);
            } else if ("-fx-background-insets".equals(prop)) {
                 return parseInsetsLayers(root);

            ... but fx-alignment and fx-shape for example aren't
            listed here and fall
            into this strange catch all place I noted in my previous
            email.

            My follow up questions would be:

            1. Why does it hit this for standard css properties as
            defined for JavaFX
            components(fx-alignment, fx-shape, etc) I.e.
            https://docs.oracle.com/
            javafx/2/api/javafx/scene/doc-files/cssref.html (hbox,
            vbox have
            -fx-alignment)
            2. Even if it is wanted to be extensible, isn't by default
            attempting to
            parse a color where the property is not known and
            therefore triggering
            exception throw / catch on the thread critical to UI perf
            a less than
            optimal solution? Could it be changed to handle this more
            gracefully than
            catch / ignore exceptions?

            Is it worth raising a ticket for such a topic, would it
            ever be considered
            for improvement.

            I think it is worth raising a ticket.


            Thanks again,
            Matt


            On 4 April 2018 at 16:20, David Grieve
            <[email protected] <mailto:[email protected]>>
            wrote:

                The parser doesn't have any concept of what the
                property is or value it
                might have. This allows the addition of new properties
                (such as an user
                might add for their own CSS styles) without having to
                modify the parser to
                handle them.



                On 4/4/18 10:03 AM, Matthew Elliot wrote:

                    Hi all, (first post).

                    I was profiling our PROD JavaFX application
                    recently I discovered
                    something
                    rather peculiar in the CSSParser. (jdk1.8.0_151)

                    I noticed several hundred
                    IllegalArgumentExceptions on the
                    JavaApplicationThread where for various unrelated
                    css properties the
                    CSSParser is trying to parse a color. While the
                    exception is subsequently
                    caught and swallowed silently doing this hundred
                    of times on this thread
                    is
                    rather ugly and caused *minor* delays in the
                    application thread.

                    This happened for alignment, shape, and a few
                    other properties where
                    no-lookup case was found and it ended on approx.
                    line 900 of the
                    CSSParser
                    in

                    colorValueOfString()

                    with a value like 'center'; clearly no color.

                    // if the property value is another property, then
                    it needs to be looked
                    up.
                    boolean needsLookup = isIdent &&
                    properties.containsKey(text);
                    if (needsLookup || ((value =
                    colorValueOfString(str)) == null )) {
                         // If the value is a lookup, make sure to use
                    the lower-case text
                    so it matches the property
                         // in the Declaration. If the value is not a
                    lookup, then use str
                    since the value might
                         // be a string which could have some case
                    sensitive meaning
                         //
                         // TODO: isIdent is needed here because of
                    RT-38345. This
                    effectively undoes RT-38201
                         value = new
                    ParsedValueImpl<String,String>(needsLookup ? text :
                    str, null, isIdent || needsLookup);
                    }

                    I had a look in the bug tracker
                    https://bugs.openjdk.java.net/ but
                    didn't
                    find much in this regard so thought I would post
                    in case it has come up
                    before.

                    I saw some of the css properties are from our
                    application and some from
                    e(fx)clipse which I can raise to Tom Schindl
                    separately if it is a
                    stylesheet issue, however it would appear that for
                    example -fx-alignment
                    in
                    a layout VBOX/HBOX component should be valid
                    according to JavaFX docs.

                    More generally, is it expected that a property
                    such as -fx-alignment
                    should
                    fall into this else {} catch all case, and why
                    does JavaFX try to parse a
                    Color by default?

                    -fx-alignment: center;

                    Any input much appreciated.

                    Regards,
                    Matt


Reply via email to