diff --git a/src/java.desktop/share/classes/javax/swing/JEditorPane.java b/src/java.desktop/share/classes/javax/swing/JEditorPane.java index df7f7bd990f..4a918294b5b 100644 --- a/src/java.desktop/share/classes/javax/swing/JEditorPane.java +++ b/src/java.desktop/share/classes/javax/swing/JEditorPane.java @@ -1621,7 +1621,7 @@ private void writeObject(ObjectOutputStream s) throws IOException { /** * Key for a client property used to indicate whether - * + * * w3c compliant length units are used for html rendering. *

* By default this is not enabled; to enable diff --git a/src/java.desktop/share/classes/javax/swing/text/html/CSS.java b/src/java.desktop/share/classes/javax/swing/text/html/CSS.java index 4aa3eb6f42d..c14b5a126e4 100644 --- a/src/java.desktop/share/classes/javax/swing/text/html/CSS.java +++ b/src/java.desktop/share/classes/javax/swing/text/html/CSS.java @@ -27,7 +27,6 @@ import java.awt.Color; import java.awt.Font; -import java.awt.HeadlessException; import java.awt.Image; import java.awt.Toolkit; import java.io.IOException; @@ -2881,18 +2880,14 @@ static class LengthUnit implements Serializable { 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", 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); + // Mapping according to the CSS2.2 spec + // https://www.w3.org/TR/CSS22/syndata.html#x39 + w3cLengthMapping.put("pt", 96f / 72f); // 1/72 of 1in + w3cLengthMapping.put("px", 1f); // 1/96 of 1in + w3cLengthMapping.put("mm", 96f / 2.54f / 10f); // 1/10 of 1cm + w3cLengthMapping.put("cm", 96f / 2.54f); // 96px/2.54 + w3cLengthMapping.put("pc", 96f / 6f); // 1/6 of 1in + w3cLengthMapping.put("in", 96f); // 96px } LengthUnit(String value, short defaultType, float defaultValue) { diff --git a/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java b/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java new file mode 100644 index 00000000000..9bdf4dbfae8 --- /dev/null +++ b/test/jdk/javax/swing/text/html/CSS/8231286/HtmlFontSizeTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2021, Oracle and/or its affiliates. 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. + */ +/* + * @test + * @bug 8231286 + * @summary Verifies if HTML font size too large with high-DPI scaling and W3C_LENGTH_UNITS + * @run main/othervm -Dsun.java2d.uiScale=1.0 HtmlFontSizeTest + */ + +import java.awt.Dimension; +import java.util.Locale; + +import javax.swing.JEditorPane; +import javax.swing.SwingUtilities; +import javax.swing.text.Document; +import javax.swing.text.html.HTMLEditorKit; + +public class HtmlFontSizeTest { + static volatile Dimension w3cFrameSize; + static volatile Dimension stdFrameSize; + + private static Dimension test(boolean w3ccheck) { + JEditorPane htmlPane = new JEditorPane(); + htmlPane.setEditable(false); + + if (w3ccheck) { + htmlPane.putClientProperty(JEditorPane.W3C_LENGTH_UNITS, Boolean.TRUE); + } + + HTMLEditorKit kit = new HTMLEditorKit(); + htmlPane.setEditorKit(kit); + + String htmlString = "\n" + + "\n" + + "

This should be 16 pt.

\n" + + "\n" + + ""; + + Document doc = kit.createDefaultDocument(); + htmlPane.setDocument(doc); + htmlPane.setText(htmlString); + + return htmlPane.getPreferredSize(); + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(() -> { + w3cFrameSize = test(true); + stdFrameSize = test(false); + }); + System.out.println("size with W3C:" + w3cFrameSize); + System.out.println("size without W3C:" + stdFrameSize); + + float ratio = (float)w3cFrameSize.width / (float)stdFrameSize.width; + System.out.println("w3cFrameSize.width/stdFrameSize.width " + ratio); + + if (!"1.3".equals(String.format(Locale.ENGLISH, "%.1f", ratio))) { + throw new RuntimeException("HTML font size too large with high-DPI scaling and W3C_LENGTH_UNITS"); + } + } +}