From 1e68ecdc1febff7b922b948e6fc30072e1f48936 Mon Sep 17 00:00:00 2001 From: LoganBarnett123 Date: Thu, 19 Jun 2025 15:31:51 +1200 Subject: [PATCH 1/2] Added Locale.ROOT to all toLower/UpperCase calls --- build.gradle.kts | 2 +- .../java/org/fit/cssbox/awt/GraphicsVisualContext.java | 3 ++- src/main/java/org/fit/cssbox/css/FontSpec.java | 6 ++++-- src/main/java/org/fit/cssbox/css/HTMLNorm.java | 9 +++++---- src/main/java/org/fit/cssbox/io/DOMSource.java | 3 ++- src/main/java/org/fit/cssbox/layout/BrowserConfig.java | 5 +++-- src/main/java/org/fit/cssbox/layout/HTMLBoxFactory.java | 9 +++++---- src/main/java/org/fit/cssbox/layout/ListItemBox.java | 4 +++- src/main/java/org/fit/cssbox/layout/TextBox.java | 5 +++-- src/main/java/org/fit/cssbox/testing/TestBatch.java | 3 ++- 10 files changed, 30 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 75176429..4b9c7ee7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,7 +17,7 @@ repositories { } dependencies { - implementation("com.github.stormcloakgames:jStyleParser:1.0.0") + implementation("com.github.stormcloakgames:jStyleParser:1.0.1") implementation(libs.org.htmlunit.neko.htmlunit) implementation(libs.org.slf4j.slf4j.api) testImplementation(libs.junit.junit) diff --git a/src/main/java/org/fit/cssbox/awt/GraphicsVisualContext.java b/src/main/java/org/fit/cssbox/awt/GraphicsVisualContext.java index 165bba2f..ca24100e 100644 --- a/src/main/java/org/fit/cssbox/awt/GraphicsVisualContext.java +++ b/src/main/java/org/fit/cssbox/awt/GraphicsVisualContext.java @@ -32,6 +32,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; +import java.util.Locale; import java.util.Map; import org.fit.cssbox.css.CSSUnits; @@ -281,7 +282,7 @@ protected String getFallbackFont() { for (int i = 0; i < avail.length; i++) { - if (avail[i].toLowerCase().contains("sans") || avail[i].toLowerCase().contains("serif")) + if (avail[i].toLowerCase(Locale.ROOT).contains("sans") || avail[i].toLowerCase(Locale.ROOT).contains("serif")) { ret = avail[i]; break; diff --git a/src/main/java/org/fit/cssbox/css/FontSpec.java b/src/main/java/org/fit/cssbox/css/FontSpec.java index 636e037c..19fcf68b 100644 --- a/src/main/java/org/fit/cssbox/css/FontSpec.java +++ b/src/main/java/org/fit/cssbox/css/FontSpec.java @@ -19,6 +19,8 @@ */ package org.fit.cssbox.css; +import java.util.Locale; + import cz.vutbr.web.css.CSSProperty; import cz.vutbr.web.css.CSSProperty.FontStyle; import cz.vutbr.web.css.CSSProperty.FontWeight; @@ -76,7 +78,7 @@ public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((family == null) ? 0 : family.toLowerCase().hashCode()); + result = prime * result + ((family == null) ? 0 : family.toLowerCase(Locale.ROOT).hashCode()); result = prime * result + ((style == null) ? 0 : style.hashCode()); result = prime * result + ((weight == null) ? 0 : weight.hashCode()); return result; @@ -93,7 +95,7 @@ public boolean equals(Object obj) { if (other.family != null) return false; } - else if (!family.toLowerCase().equals(other.family.toLowerCase())) return false; + else if (!family.toLowerCase(Locale.ROOT).equals(other.family.toLowerCase(Locale.ROOT))) return false; if (style != other.style) return false; if (weight != other.weight) return false; return true; diff --git a/src/main/java/org/fit/cssbox/css/HTMLNorm.java b/src/main/java/org/fit/cssbox/css/HTMLNorm.java index f03c5fe3..70fc3227 100644 --- a/src/main/java/org/fit/cssbox/css/HTMLNorm.java +++ b/src/main/java/org/fit/cssbox/css/HTMLNorm.java @@ -20,6 +20,7 @@ package org.fit.cssbox.css; +import java.util.Locale; import java.util.Vector; import cz.vutbr.web.css.CSSFactory; @@ -64,7 +65,7 @@ public static void attributesToStyles(Node n, String tab_inh) if (n.getNodeType() == Node.ELEMENT_NODE) { final Element el = (Element) n; - final String tagname = el.getTagName().toLowerCase(); + final String tagname = el.getTagName().toLowerCase(Locale.ROOT); //Analyze HTML attributes String attrs = ""; //background @@ -124,9 +125,9 @@ public static void attributesToStyles(Node n, String tab_inh) } } if (el.getAttributes().getNamedItem("frame") != null) - frame = el.getAttribute("frame").toLowerCase(); + frame = el.getAttribute("frame").toLowerCase(Locale.ROOT); if (el.getAttributes().getNamedItem("rules") != null) - rules = el.getAttribute("rules").toLowerCase(); + rules = el.getAttribute("rules").toLowerCase(Locale.ROOT); if (!border.equals("0")) { @@ -323,7 +324,7 @@ else if (sz.startsWith("-")) */ public static float computeAttributeLength(String value, float whole) throws NumberFormatException { - String sval = value.trim().toLowerCase(); + String sval = value.trim().toLowerCase(Locale.ROOT); if (sval.endsWith("%")) { float val = Float.parseFloat(sval.substring(0, sval.length() - 1)); diff --git a/src/main/java/org/fit/cssbox/io/DOMSource.java b/src/main/java/org/fit/cssbox/io/DOMSource.java index 80cbaa28..ebb49e45 100644 --- a/src/main/java/org/fit/cssbox/io/DOMSource.java +++ b/src/main/java/org/fit/cssbox/io/DOMSource.java @@ -21,6 +21,7 @@ package org.fit.cssbox.io; import java.io.IOException; +import java.util.Locale; import org.w3c.dom.Document; import org.xml.sax.SAXException; @@ -55,7 +56,7 @@ public void setContentType(String type) { if (type != null) { - String t = type.toLowerCase(); + String t = type.toLowerCase(Locale.ROOT); //extract the charset if specified int strt = t.indexOf("charset="); diff --git a/src/main/java/org/fit/cssbox/layout/BrowserConfig.java b/src/main/java/org/fit/cssbox/layout/BrowserConfig.java index 3e75f7f7..e18fd727 100644 --- a/src/main/java/org/fit/cssbox/layout/BrowserConfig.java +++ b/src/main/java/org/fit/cssbox/layout/BrowserConfig.java @@ -26,6 +26,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import org.fit.cssbox.io.ContentObserver; @@ -359,7 +360,7 @@ public DOMSource createDOMSource(DocumentSource src) */ public void setLogicalFont(String logical, List physical) { - logicalFonts.put(logical.toLowerCase(), physical); + logicalFonts.put(logical.toLowerCase(Locale.ROOT), physical); } /** @@ -369,7 +370,7 @@ public void setLogicalFont(String logical, List physical) */ public List getLogicalFont(String logical) { - List ret = logicalFonts.get(logical.toLowerCase()); + List ret = logicalFonts.get(logical.toLowerCase(Locale.ROOT)); if (ret == null) ret = Collections.emptyList(); return ret; diff --git a/src/main/java/org/fit/cssbox/layout/HTMLBoxFactory.java b/src/main/java/org/fit/cssbox/layout/HTMLBoxFactory.java index bcdb2ae3..b17d1b7d 100644 --- a/src/main/java/org/fit/cssbox/layout/HTMLBoxFactory.java +++ b/src/main/java/org/fit/cssbox/layout/HTMLBoxFactory.java @@ -24,6 +24,7 @@ import java.net.URL; import java.net.URLDecoder; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import cz.vutbr.web.css.NodeData; @@ -70,12 +71,12 @@ public HTMLBoxFactory(BoxFactory parent) */ public boolean isTagSupported(Element e) { - if (e.getNodeName() != null && supported.contains(e.getNodeName().toLowerCase())) //completely supported tags + if (e.getNodeName() != null && supported.contains(e.getNodeName().toLowerCase(Locale.ROOT))) //completely supported tags return true; else //special cases { //empty anchor elements must be preserved - if (e.getNodeName().toLowerCase().equals("a") && e.hasAttribute("name") + if (e.getNodeName().toLowerCase(Locale.ROOT).equals("a") && e.hasAttribute("name") && (e.getTextContent() == null || e.getTextContent().trim().length() == 0)) return true; else @@ -94,7 +95,7 @@ public boolean isTagSupported(Element e) */ public ElementBox createBox(ElementBox parent, Element e, Viewport viewport, NodeData style) { - String name = e.getNodeName().toLowerCase(); + String name = e.getNodeName().toLowerCase(Locale.ROOT); if (name.equals("object")) return createSubtreeObject(parent, e, viewport, style); else if (name.equals("img")) @@ -163,7 +164,7 @@ protected ElementBox createSubtreeObject(ElementBox parent, Element e, Viewport //try to create the content object based on the mime type try { - String mime = HTMLNorm.getAttribute(e, "type").toLowerCase(); + String mime = HTMLNorm.getAttribute(e, "type").toLowerCase(Locale.ROOT); String cb = HTMLNorm.getAttribute(e, "codebase"); String dataurl = URLDecoder.decode(HTMLNorm.getAttribute(e, "data"), "UTF-8"); URL base = new URL(factory.getBaseURL(), cb); diff --git a/src/main/java/org/fit/cssbox/layout/ListItemBox.java b/src/main/java/org/fit/cssbox/layout/ListItemBox.java index 1c2996e4..4d33b700 100644 --- a/src/main/java/org/fit/cssbox/layout/ListItemBox.java +++ b/src/main/java/org/fit/cssbox/layout/ListItemBox.java @@ -19,6 +19,8 @@ */ package org.fit.cssbox.layout; +import java.util.Locale; + import org.w3c.dom.Element; import cz.vutbr.web.css.CSSProperty; @@ -195,7 +197,7 @@ public static String formatItemNumber(int itemNumber, ListStyleType styleType) text = binaryToRoman(itemNumber); break; case LOWER_ROMAN: - text = binaryToRoman(itemNumber).toLowerCase(); + text = binaryToRoman(itemNumber).toLowerCase(Locale.ROOT); break; default: text = String.valueOf(itemNumber); // default decimal diff --git a/src/main/java/org/fit/cssbox/layout/TextBox.java b/src/main/java/org/fit/cssbox/layout/TextBox.java index 46e370ae..6955d4e5 100644 --- a/src/main/java/org/fit/cssbox/layout/TextBox.java +++ b/src/main/java/org/fit/cssbox/layout/TextBox.java @@ -21,6 +21,7 @@ package org.fit.cssbox.layout; import java.util.HashSet; +import java.util.Locale; import java.util.Set; import org.w3c.dom.Text; @@ -303,9 +304,9 @@ private String applyTransformations(String src) switch (transform) { case LOWERCASE: - return src.toLowerCase(); + return src.toLowerCase(Locale.ROOT); case UPPERCASE: - return src.toUpperCase(); + return src.toUpperCase(Locale.ROOT); case CAPITALIZE: StringBuilder ret = new StringBuilder(src.length()); boolean ws = true; diff --git a/src/main/java/org/fit/cssbox/testing/TestBatch.java b/src/main/java/org/fit/cssbox/testing/TestBatch.java index e2ad1222..34f8baf9 100644 --- a/src/main/java/org/fit/cssbox/testing/TestBatch.java +++ b/src/main/java/org/fit/cssbox/testing/TestBatch.java @@ -28,6 +28,7 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import java.util.Locale; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.Callable; @@ -147,7 +148,7 @@ private void parseToc() for (int ti = 0; ti < tags.getLength(); ti++) { Element tag = (Element) tags.item(ti); - entry.tags.add(tag.getTextContent().trim().toLowerCase()); + entry.tags.add(tag.getTextContent().trim().toLowerCase(Locale.ROOT)); } tests.add(entry); From 30d0d70872b444711100e219409836b3f26244d9 Mon Sep 17 00:00:00 2001 From: LoganBarnett123 Date: Thu, 19 Jun 2025 15:32:09 +1200 Subject: [PATCH 2/2] Added simple Turkish Locale test --- .../org/fit/cssbox/test/ReferenceComparisonTest.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/test/java/org/fit/cssbox/test/ReferenceComparisonTest.java b/src/test/java/org/fit/cssbox/test/ReferenceComparisonTest.java index da8429db..ffcea693 100644 --- a/src/test/java/org/fit/cssbox/test/ReferenceComparisonTest.java +++ b/src/test/java/org/fit/cssbox/test/ReferenceComparisonTest.java @@ -22,6 +22,7 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; +import java.util.Locale; import java.util.Map; import org.fit.cssbox.testing.ReferenceResults; @@ -91,4 +92,13 @@ public void checkForRegressions() throws MalformedURLException Assert.assertTrue("All results passed", errorcnt <= 5); } + @Test + public void testTurkishLocale() throws MalformedURLException + { + Locale.setDefault(new Locale("tr", "TR")); + + checkForRegressions(); + + Locale.setDefault(Locale.ROOT); + } }