changeset 57783:1bcfc908724e

8234913: Improve parsing of Length Units in javax/swing/text/html/CSS Reviewed-by: serb, clanger Contributed-by: vladislav.volodin@sap.com
author clanger
date Fri, 10 Jan 2020 13:08:18 +0000
parents 9f321549fa75
children 0d6c682b5648
files src/java.desktop/share/classes/javax/swing/text/html/CSS.java test/jdk/javax/swing/text/html/CSS/bug8234913.java
diffstat 2 files changed, 133 insertions(+), 28 deletions(-) [+]
line wrap: on
line diff
--- a/src/java.desktop/share/classes/javax/swing/text/html/CSS.java	Thu Jan 09 10:14:59 2020 -0800
+++ b/src/java.desktop/share/classes/javax/swing/text/html/CSS.java	Fri Jan 10 13:08:18 2020 +0000
@@ -2521,7 +2521,7 @@
             } catch (NumberFormatException nfe) {
                 // Not pixels, use LengthUnit
                 LengthUnit lu = new LengthUnit(value,
-                                               LengthUnit.UNINITALIZED_LENGTH,
+                                               LengthUnit.UNINITIALIZED_LENGTH,
                                                0);
 
                 // PENDING: currently, we only support absolute values and
@@ -2855,25 +2855,25 @@
         static Hashtable<String, Float> lengthMapping = new Hashtable<String, Float>(6);
         static Hashtable<String, Float> w3cLengthMapping = new Hashtable<String, Float>(6);
         static {
-            lengthMapping.put("pt", Float.valueOf(1f));
-            // Not sure about 1.3, determined by experiementation.
-            lengthMapping.put("px", Float.valueOf(1.3f));
-            lengthMapping.put("mm", Float.valueOf(2.83464f));
-            lengthMapping.put("cm", Float.valueOf(28.3464f));
-            lengthMapping.put("pc", Float.valueOf(12f));
-            lengthMapping.put("in", Float.valueOf(72f));
+            lengthMapping.put("pt", 1f);
+            // Not sure about 1.3, determined by experimentation.
+            lengthMapping.put("px", 1.3f);
+            lengthMapping.put("mm", 2.83464f);
+            lengthMapping.put("cm", 28.3464f);
+            lengthMapping.put("pc", 12f);
+            lengthMapping.put("in", 72f);
             int res = 72;
             try {
                 res = Toolkit.getDefaultToolkit().getScreenResolution();
             } catch (HeadlessException e) {
             }
             // mapping according to the CSS2 spec
-            w3cLengthMapping.put("pt", Float.valueOf(res/72f));
-            w3cLengthMapping.put("px", Float.valueOf(1f));
-            w3cLengthMapping.put("mm", Float.valueOf(res/25.4f));
-            w3cLengthMapping.put("cm", Float.valueOf(res/2.54f));
-            w3cLengthMapping.put("pc", Float.valueOf(res/6f));
-            w3cLengthMapping.put("in", Float.valueOf((float)res));
+            w3cLengthMapping.put("pt", res / 72f);
+            w3cLengthMapping.put("px", 1f);
+            w3cLengthMapping.put("mm", res / 25.4f);
+            w3cLengthMapping.put("cm", res / 2.54f);
+            w3cLengthMapping.put("pc", res / 6f);
+            w3cLengthMapping.put("in", (float) res);
         }
 
         LengthUnit(String value, short defaultType, float defaultValue) {
@@ -2885,21 +2885,22 @@
             this.value = defaultValue;
 
             int length = value.length();
-            if (length > 0 && value.charAt(length - 1) == '%') {
+            if (length < 1) {
+                return;
+            }
+            if (value.charAt(length - 1) == '%') {
                 try {
-                    this.value = Float.valueOf(value.substring(0, length - 1)).
-                                               floatValue() / 100.0f;
+                    this.value = Float.parseFloat(value.substring(0, length - 1)) / 100.0f;
                     type = 1;
                 }
                 catch (NumberFormatException nfe) { }
             }
-            if (length >= 2) {
+            else if (length >= 2) {
                 units = value.substring(length - 2, length);
                 Float scale = lengthMapping.get(units);
                 if (scale != null) {
                     try {
-                        this.value = Float.valueOf(value.substring(0,
-                               length - 2)).floatValue();
+                        this.value = Float.parseFloat(value.substring(0, length - 2));
                         type = 0;
                     }
                     catch (NumberFormatException nfe) { }
@@ -2907,32 +2908,31 @@
                 else if (units.equals("em") ||
                          units.equals("ex")) {
                     try {
-                        this.value = Float.valueOf(value.substring(0,
-                                      length - 2)).floatValue();
+                        this.value = Float.parseFloat(value.substring(0, length - 2));
                         type = 3;
                     }
                     catch (NumberFormatException nfe) { }
                 }
                 else if (value.equals("larger")) {
-                    this.value = 2f;
+                    this.value = 2.f;
                     type = 2;
                 }
                 else if (value.equals("smaller")) {
-                    this.value = -2;
+                    this.value = -2.f;
                     type = 2;
                 }
                 else {
                     // treat like points.
                     try {
-                        this.value = Float.valueOf(value).floatValue();
+                        this.value = Float.parseFloat(value);
                         type = 0;
                     } catch (NumberFormatException nfe) {}
                 }
             }
-            else if (length > 0) {
+            else {
                 // treat like points.
                 try {
-                    this.value = Float.valueOf(value).floatValue();
+                    this.value = Float.parseFloat(value);
                     type = 0;
                 } catch (NumberFormatException nfe) {}
             }
@@ -2978,7 +2978,7 @@
         String units = null;
 
 
-        static final short UNINITALIZED_LENGTH = (short)10;
+        static final short UNINITIALIZED_LENGTH = (short)10;
     }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/text/html/CSS/bug8234913.java	Fri Jan 10 13:08:18 2020 +0000
@@ -0,0 +1,105 @@
+/*
+ * Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019 SAP SE. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import jdk.test.lib.process.OutputAnalyzer;
+import jdk.test.lib.process.ProcessTools;
+
+import javax.swing.text.MutableAttributeSet;
+import javax.swing.text.SimpleAttributeSet;
+import javax.swing.text.html.CSS;
+import javax.swing.text.html.StyleSheet;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/*
+ * @test
+ * @bug 8234913
+ * @library /test/lib
+ * @summary The test project is launched with the option -verbose:class. If the exception is thrown, its class will be loaded.
+ *          Since the exception is thrown, but then caught, it is not possible to catch it in the test case with try-catch.
+ *          The class loader logs have to be monitored.
+ * @run driver bug8234913
+ */
+public class bug8234913 {
+    // Output analysis taken from test/hotspot/jtreg/runtime/logging/ClassLoadUnloadTest.java
+    private static ProcessBuilder pb;
+
+    static ProcessBuilder exec(String... args) throws Exception {
+        List<String> argsList = new ArrayList<>();
+        Collections.addAll(argsList, args);
+        Collections.addAll(argsList, "-Xmn8m");
+        Collections.addAll(argsList, "-Dtest.class.path=" + System.getProperty("test.class.path", "."));
+        Collections.addAll(argsList, FontSizePercentTest.class.getName());
+        return ProcessTools.createJavaProcessBuilder(argsList.toArray(new String[argsList.size()]));
+    }
+
+    static void checkFor(String... outputStrings) throws Exception {
+        OutputAnalyzer out = new OutputAnalyzer(pb.start());
+        for (String s : outputStrings) {
+            out.shouldContain(s);
+        }
+        out.shouldHaveExitValue(0);
+    }
+
+    static void checkAbsent(String... outputStrings) throws Exception {
+        OutputAnalyzer out = new OutputAnalyzer(pb.start());
+        for (String s : outputStrings) {
+            out.shouldNotContain(s);
+        }
+        out.shouldHaveExitValue(0);
+    }
+
+    public static void main(String[] args) throws Exception {
+        pb = exec("-verbose:class");
+        checkFor("[class,load] javax.swing.text.html.CSS$LengthUnit"); // the class that parses %
+        checkAbsent("[class,load] java.lang.NumberFormatException");
+    }
+
+    static class FontSizePercentTest {
+        public static void main(String... args) throws Exception {
+            StyleSheet ss = new StyleSheet();
+            MutableAttributeSet attr = new SimpleAttributeSet();
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "100%");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10pt");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10px");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10mm");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10cm");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10pc");
+
+            attr.removeAttribute(CSS.Attribute.FONT_SIZE);
+            ss.addCSSAttribute(attr, CSS.Attribute.FONT_SIZE, "10in");
+        }
+    }
+}