svn commit: r1933139 - in spamassassin/trunk: lib/Mail/SpamAssassin t

[email protected] Fri, 17 Apr 2026 18:38:39 -0000
Newsgroups gmane.mail.spam.spamassassin.cvs
Message-ID <177645111989.3893360.17101372827839419389@svn03-he-fi>
Author: fkento
Date: Fri Apr 17 18:38:39 2026
New Revision: 1933139

Log:
Text with 'transform: scale(0)' should be treated as invisible

Modified:
   spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm
   spamassassin/trunk/t/html_visibility.t

Modified: spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm
==============================================================================
--- spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm	Fri Apr 17 15:59:12 2026	(r1933138)
+++ spamassassin/trunk/lib/Mail/SpamAssassin/HTML.pm	Fri Apr 17 18:38:39 2026	(r1933139)
@@ -814,6 +814,7 @@ sub html_font_invisible {
   my $font_size = $self->{text_style}[-1]->{'font_size'};
   my $display = $self->{text_style}[-1]->{style_display};
   my $visibility = $self->{text_style}[-1]->{style_visibility};
+  my $transform = $self->{text_style}[-1]->{style_transform};
 
   # size too small
   if ($font_size < 8) {
@@ -830,6 +831,14 @@ sub html_font_invisible {
     return 1;
   }
 
+  # <span style="transform: scale(0)"> — any axis scaled to 0 collapses the element
+  if ($transform && $transform =~ /\bscale[xy]?\(\s*0(?:\.0+)?(?:%|[a-z]+)?\s*(?:[,\s]\s*[^)]*)?\)/i) {
+    return 1;
+  }
+  if ($transform && $transform =~ /\bscale\(\s*[^,)]+,\s*0(?:\.0+)?(?:%|[a-z]+)?\s*\)/i) {
+    return 1;
+  }
+
   # low-contrast text
   # the text is very difficult to read if the distance is under 12,
   # a limit of 14 to 16 might be okay if the usage significantly

Modified: spamassassin/trunk/t/html_visibility.t
==============================================================================
--- spamassassin/trunk/t/html_visibility.t	Fri Apr 17 15:59:12 2026	(r1933138)
+++ spamassassin/trunk/t/html_visibility.t	Fri Apr 17 18:38:39 2026	(r1933139)
@@ -192,6 +192,51 @@ my @tests = (
         visibility         => 'invisible',
         font_invalid_color => 0,
     },
+    {
+        html               => '<div style="transform: scale(0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scale(0, 1)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scale(1, 0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scaleX(0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scaleY(0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="TRANSFORM: SCALE(0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scale(0.0)">X</div>',
+        visibility         => 'invisible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scale(1)">X</div>',
+        visibility         => 'visible',
+        font_invalid_color => 0,
+    },
+    {
+        html               => '<div style="transform: scale(0.5)">X</div>',
+        visibility         => 'visible',
+        font_invalid_color => 0,
+    },
 );
 
 plan tests => scalar @tests * 2;