diff --git a/app/src/main/java/eu/faircode/email/HtmlHelper.java b/app/src/main/java/eu/faircode/email/HtmlHelper.java index 3486f31788..08ef5426cc 100644 --- a/app/src/main/java/eu/faircode/email/HtmlHelper.java +++ b/app/src/main/java/eu/faircode/email/HtmlHelper.java @@ -151,6 +151,43 @@ public class HtmlHelper { private static final HashMap x11ColorMap = new HashMap<>(); + // https://www.w3.org/TR/CSS21/propidx.html + private static final List STYLE_NO_INHERIT = Collections.unmodifiableList(Arrays.asList( + "background-attachment", "background-color", "background-image", "background-position", "background-repeat", "background", + "border-color", "border-style", "border-top", "border-right", "border-bottom", "border-left", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-width", "border", + "bottom", + "clear", + "clip", + "content", + "counter-increment", "counter-reset", + "cue-after", "cue-before", "cue", + "display", + "float", + "height", + "left", + "margin-right", "margin-left", "margin-top", "margin-bottom", "margin", + "max-height", "max-width", "min-height", "min-width", + "outline-color", "outline-style", "outline-width", "outline", + "overflow", + "padding-top", "padding-right", "padding-bottom", "padding-left", + "padding", "page-break-after", "page-break-before", "page-break-inside", + "pause-after", "pause-before", "pause", + "play-during", + "position", + "right", + "table-layout", + "text-decoration", + "top", + "unicode-bidi", + "vertical-align", + "width", + "z-index" + )); + static { // https://www.w3.org/TR/css-color-3/ x11ColorMap.put("aliceblue", 0xF0F8FF); @@ -1657,21 +1694,46 @@ public class HtmlHelper { private static String mergeStyles(String base, String style, String selector) { Map result = new HashMap<>(); - List params = new ArrayList<>(); + //https://developer.mozilla.org/en-US/docs/Learn/CSS/Building_blocks/Cascade_and_inheritance#controlling_inheritance + + // Base style if (!TextUtils.isEmpty(base)) - params.addAll(Arrays.asList(base.split(";"))); + for (String param : base.split(";")) { + int colon = param.indexOf(':'); + if (colon < 0) { + Log.w("CSS invalid=" + param); + continue; + } + + String key = param.substring(0, colon).trim().toLowerCase(Locale.ROOT); + if (STYLE_NO_INHERIT.contains(key)) { + Log.i("CSS no inherit=" + key); + continue; + } + + if (selector == null || selector.equals(key)) + result.put(key, param); + } + + // Element style if (!TextUtils.isEmpty(style)) - params.addAll(Arrays.asList(style.split(";"))); + for (String param : style.split(";")) { + int colon = param.indexOf(':'); + if (colon < 0) { + Log.w("CSS invalid=" + param); + continue; + } - for (String param : params) { - int colon = param.indexOf(':'); - if (colon > 0) { String key = param.substring(0, colon).trim().toLowerCase(Locale.ROOT); + String value = param.substring(colon + 1).trim().toUpperCase(Locale.ROOT); + if ("inherit".equals(value)) { + Log.i("CSS inherit=" + key); + continue; + } + if (selector == null || selector.equals(key)) result.put(key, param); - } else - Log.w("Invalid style param=" + param); - } + } return TextUtils.join(";", result.values()); }